diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/constant/VisaConstant.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/constant/VisaConstant.java index b761e8b7..481e9d7f 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/constant/VisaConstant.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/constant/VisaConstant.java @@ -45,8 +45,14 @@ public interface VisaConstant { String FORM_FIELD_REASON = "reason"; // 发生区域 String FORM_FIELD_RELATION_AREA = "relationArea"; - // 发生内容 + // 发生内容及说明 String FORM_FIELD_CONTEXT_DESCRIPTION = "contextDescription"; + String FORM_FIELD_CONTEXT = "context"; + String FORM_FIELD_DESCRIPTION = "description"; + // 相关单位和人员 + String FORM_FIELD_UNIT_PERSON = "unitPerson"; + String FORM_FIELD_UNIT = "unit"; + String FORM_FIELD_PERSON = "person"; // 变更金额 String FORM_FIELD_AMOUNT_CHANGE = "amountChange"; // 关联的任务单单据 diff --git a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java index 3dec4078..6ad2d56f 100644 --- a/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java +++ b/visa/visa-api/src/main/java/cn/axzo/nanopart/visa/api/response/VisaDetailByIdResponse.java @@ -357,7 +357,12 @@ public class VisaDetailByIdResponse { if (CollectionUtils.isEmpty(professionalList)) { return Lists.newArrayList(); } - return professionalList; + + List filter = professionalList.stream().filter(item -> Objects.nonNull(item) && StringUtils.isNotBlank(item.getCode())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filter)) { + return Lists.newArrayList(); + } + return filter; } /** @@ -407,7 +412,11 @@ public class VisaDetailByIdResponse { if (CollectionUtils.isEmpty(relationAreaList)) { return Lists.newArrayList(); } - return relationAreaList; + List filter = relationAreaList.stream().filter(item -> Objects.nonNull(item) && Objects.nonNull(item.getAreaId())).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(filter)) { + return Lists.newArrayList(); + } + return filter; } public static List buildAreaWithId(JSONArray relationArea) { diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/controller/ChangeRecordController.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/controller/ChangeRecordController.java index 73a78bfe..11e5c782 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/controller/ChangeRecordController.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/controller/ChangeRecordController.java @@ -87,8 +87,8 @@ public class ChangeRecordController implements ChangeRecordApi { @Override public ApiResult visaDetailById(@RequestBody @Valid VisaDetailByIdRequest req) { VisaDetailByIdResponse resp = changeRecordService.detailById(req.getVisaId()); - resp.setBtnList(VisaButtonTypeEnum.all()); -// resp.setBtnList(changeRecordConfirmService.fetchBtnsByCondition(req.getVisaId(), req.getPersonId(), req.getOuId(), req.getWorkspaceId(), resp.getStatus())); +// resp.setBtnList(VisaButtonTypeEnum.all()); + resp.setBtnList(changeRecordConfirmService.fetchBtnsByCondition(req.getVisaId(), req.getPersonId(), req.getOuId(), req.getWorkspaceId(), resp.getStatus())); return ApiResult.ok(resp); } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java index 4004977d..61ae9886 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/domain/ChangeRecord.java @@ -5,6 +5,7 @@ import cn.axzo.nanopart.visa.api.enums.VisaStatusEnum; import cn.axzo.nanopart.visa.api.enums.VisaTypeEnum; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.annotation.FieldStrategy; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler; @@ -127,7 +128,7 @@ public class ChangeRecord extends BaseEntity { /** * 最终审批时间 */ - @TableField(value = "approval_complete_time") + @TableField(value = "approval_complete_time", updateStrategy = FieldStrategy.IGNORED) private Date approvalCompleteTime; /** diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/BasicLogSupport.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/BasicLogSupport.java index 7221f10f..16af4be1 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/BasicLogSupport.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/BasicLogSupport.java @@ -29,7 +29,7 @@ public abstract class BasicLogSupport { return buildLogUserInfo(oneUserInfo); } protected String buildLogUserInfo(OrgNodeUserBriefInfoResp user) { - String userInfo = ""; + String userInfo = ""; if (Objects.nonNull(user)) { userInfo = user.getRealName() + "(" + user.getJob().getName() + "-" + user.getOrganizationalUnitName() + ")"; } @@ -37,10 +37,15 @@ public abstract class BasicLogSupport { } protected OrgNodeUserBriefInfoResp getOneUserInfo(BpmnTaskDelegateAssigner assigner) { + if (Objects.isNull(assigner)) { + return null; + } List users = visaOrganizationalNodeUserGateway.listOrgNodeUsers(OrgNodeUserBriefInfoListReq.builder() .workspaceId(Long.valueOf(assigner.getTenantId())) .ouId(Long.valueOf(assigner.getOuId())) .personIds(Lists.newArrayList(Long.valueOf(assigner.getPersonId()))) + .needUnit(true) + .needJob(true) .build()); return CollectionUtils.isEmpty(users) ? null : users.get(0); } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/ProcessInstanceAllEventHandler.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/ProcessInstanceAllEventHandler.java index 2f4cc3ed..2ed8dbff 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/ProcessInstanceAllEventHandler.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/process/ProcessInstanceAllEventHandler.java @@ -86,6 +86,7 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P String visaType = (String) dto.getVariables().getOrDefault(WORKFLOW_VAR_VISA_TYPE_KEY, ""); return StringUtils.hasText(visaType) ? VisaTypeEnum.valueOf(visaType).getDesc() : ""; } + @Override public void onCompleted(ProcessInstanceDTO dto) { String visaTypeDesc = parseVisaType(dto); @@ -157,15 +158,21 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P .eq(ChangeRecord::getIsDelete, 0) .oneOpt() .ifPresent(changeRecord -> { - changeRecord.setApprovalStatus(resultEnum.getStatus()); - changeRecord.setApprovalCompleteTime(new Date()); + if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) { + changeRecord.setApprovalStatus(resultEnum.getStatus()); + changeRecord.setApprovalCompleteTime(new Date()); + } else { + changeRecord.setApprovalId(""); + changeRecord.setApprovalStatus(""); + changeRecord.setApprovalCompleteTime(null); + } changeRecordService.updateById(changeRecord); }); // 更新关联表审批信息 changeRecordRelationService.lambdaQuery() .eq(ChangeRecordRelation::getVisaId, visaId) - .eq(ChangeRecordRelation::getVarName, PROCESS_INSTANCE.getCode()) + .eq(ChangeRecordRelation::getVarName, PROCESS_INSTANCE.name()) .eq(ChangeRecordRelation::getContent, dto.getProcessInstanceId()) .oneOpt() .ifPresent(changeRecordRelation -> { @@ -173,11 +180,15 @@ public class ProcessInstanceAllEventHandler extends BasicLogSupport implements P changeRecordRelationService.updateById(changeRecordRelation); }); + ChangeRecord visa = changeRecordService.getById(visaId); if (Objects.equals(resultEnum, BpmnProcessInstanceResultEnum.APPROVED)) { + changeRecordService.changeStatus(ChangeStatusRequest.builder() + .visaId(visaId) + .updateStatus(VisaStatusEnum.COMPLETED) + .build()); return; } // 回退到待提报或决策中 - ChangeRecord visa = changeRecordService.getById(visaId); changeRecordService.changeStatus(ChangeStatusRequest.builder() .visaId(visaId) .updateStatus(Objects.isNull(visa.getImGroupId()) ? VisaStatusEnum.REPORT_FROM_APPROVE : VisaStatusEnum.DECIDING_FROM_APPROVE) diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/task/ProcessTaskAllEventHandler.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/task/ProcessTaskAllEventHandler.java index f97d7118..ed02988b 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/task/ProcessTaskAllEventHandler.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/mq/listener/workflow/task/ProcessTaskAllEventHandler.java @@ -10,6 +10,8 @@ import cn.axzo.workflow.common.model.response.mq.ProcessTaskDTO; import cn.axzo.workflow.starter.handler.ProcessTaskEventHandler; import org.springframework.stereotype.Component; +import java.util.Objects; + import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.APPROVED_AGRESS; import static cn.axzo.nanopart.visa.api.enums.VisaLogTypeEnum.TRANSMIT_APPROVE; @@ -53,8 +55,8 @@ public class ProcessTaskAllEventHandler extends BasicLogSupport implements Proce ChangeRecordLog log = ChangeRecordLog.builder() .visaId(Long.valueOf(dto.getBusinessKey())) .action(dto.getType().getTag()) - .title(String.format(APPROVED_AGRESS.getTitle(), user.getRealName())) - .content(String.format(APPROVED_AGRESS.getContent(), buildLogUserInfo(user))) + .title(String.format(APPROVED_AGRESS.getTitle(), Objects.isNull(user) ? "" : user.getRealName())) + .content(String.format(APPROVED_AGRESS.getContent(), Objects.isNull(user) ? "系统自动通过" : buildLogUserInfo(user))) .build(); eventProducer.send(VisaChangeLogPayload.form(log)); } diff --git a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java index c1c9a131..fadd71da 100644 --- a/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java +++ b/visa/visa-server/src/main/java/cn/axzo/nanopart/visa/server/service/impl/ChangeRecordServiceImpl.java @@ -6,6 +6,7 @@ import cn.axzo.apollo.workspace.api.workspace.res.GetDetailRes; import cn.axzo.apollo.workspace.api.workspace.res.ProjectBriefResp; import cn.axzo.apollo.workspace.api.workspace.res.ProjectDetailRes; import cn.axzo.basics.common.constant.enums.OrganizationalNodeTypeEnum; +import cn.axzo.basics.common.constant.enums.OrganizationalUnitTypeEnum; import cn.axzo.basics.common.util.AssertUtil; import cn.axzo.basics.common.util.NumberUtil; import cn.axzo.basics.profiles.dto.basic.PersonProfileDto; @@ -26,6 +27,7 @@ import cn.axzo.im.center.common.enums.AppTypeEnum; import cn.axzo.im.center.common.enums.GroupType; import cn.axzo.maokai.api.vo.request.CooperateShipQueryReq; import cn.axzo.maokai.api.vo.request.OrgNodeUserBriefInfoListReq; +import cn.axzo.maokai.api.vo.request.OrganizationalUnitQuery; import cn.axzo.maokai.api.vo.response.CooperateShipResp; import cn.axzo.maokai.api.vo.response.OrgNodeUserBriefInfoResp; import cn.axzo.maokai.api.vo.response.OrganizationalUnitVO; @@ -90,7 +92,6 @@ import cn.axzo.nanopart.visa.server.utils.Constants; import cn.axzo.orggateway.api.nodeuser.dto.OrgNodeUserDTO; import cn.axzo.orggateway.api.nodeuser.req.ListOrgNodeUserReq; import cn.axzo.orgmanax.dto.nodeuser.req.ListNodeUserReq; -import cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum; import cn.axzo.workflow.common.model.dto.CooperationOrgDTO; import cn.axzo.workflow.common.model.dto.UploadFieldDTO; import cn.axzo.workflow.common.model.request.bpmn.process.BpmnProcessInstanceAbortDTO; @@ -136,9 +137,12 @@ import java.util.stream.Collectors; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_AMOUNT_CHANGE; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_ATTACH; +import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_CONTEXT; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_CONTEXT_DESCRIPTION; +import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_DESCRIPTION; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_HAPPEN_TIME; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_NO; +import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_PERSON; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_REASON; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_AREA; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_PROFESSIONAL; @@ -147,6 +151,8 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATIO import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_TASK_ORDER; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_RELATION_VISA_ORDER; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_TOPIC; +import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_UNIT; +import static cn.axzo.nanopart.visa.api.constant.VisaConstant.FORM_FIELD_UNIT_PERSON; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_INITIATOR_WORKSPACE_ID; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_ID; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.IM_GROUP_BIZ_INFO_VISA_TYPE; @@ -154,6 +160,7 @@ import static cn.axzo.nanopart.visa.api.constant.VisaConstant.MSG_CENTER_APP_COD import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_PENDING_TOPIC; import static cn.axzo.nanopart.visa.api.constant.VisaConstant.WORKFLOW_VAR_VISA_TYPE_KEY; import static cn.axzo.nanopart.visa.server.utils.Constants.DATE_FORMAT; +import static cn.axzo.workflow.common.enums.BpmnProcessInstanceResultEnum.PROCESSING; /** * @author xudawei @@ -714,19 +721,21 @@ public class ChangeRecordServiceImpl extends ServiceImpl 0) { - amountDesc = "增加" + req.getAmountChange().toPlainString() + "元"; + amountDesc = "增加" + req.getAmountChange().abs().toPlainString() + "元"; } else if (req.getAmountChange().compareTo(BigDecimal.ZERO) < 0) { - amountDesc = "减少" + req.getAmountChange().toPlainString() + "元"; + amountDesc = "减少" + req.getAmountChange().abs().toPlainString() + "元"; } formVariables.put(FORM_FIELD_AMOUNT_CHANGE, amountDesc); } @@ -765,6 +774,76 @@ public class ChangeRecordServiceImpl extends ServiceImpl> buildUnitPerson(List list, Long workspaceId) { + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + List ouIds = list.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuId).distinct().collect(Collectors.toList()); + Map unitMap = organizationalUnitGateway.list(OrganizationalUnitQuery.builder().unitIds(ouIds).build()) + .stream().collect(Collectors.toMap(OrganizationalUnitVO::getId, Function.identity(), (s, t) -> s)); + + Map> unitGroupBy = list.stream().collect(Collectors.groupingBy(VisaChangeTempCreateReq.RelationUnitAndPerson::getOuId, Collectors.toList())); + List> unitPersons = new ArrayList<>(); + + unitGroupBy.forEach((unitId, persons) -> { + Map unitPerson = new HashMap<>(); + OrganizationalUnitVO unitVo = unitMap.get(unitId); + unitPerson.put(FORM_FIELD_UNIT, Objects.isNull(unitVo) ? "" : unitVo.getName() + "(" + OrganizationalUnitTypeEnum.getByType(unitVo.getType()).getDesc() + ")"); + List personInfos = getPersonInfos(workspaceId, unitId, persons); + unitPerson.put(FORM_FIELD_PERSON, buildPersonInfosStr(personInfos)); + unitPersons.add(unitPerson); + }); + + return unitPersons; + } + + private String buildPersonInfosStr(List personInfos) { + StringBuilder personInfosStr = new StringBuilder(); + if (CollectionUtils.isEmpty(personInfos)) { + return personInfosStr.toString(); + } + + for (OrgNodeUserDTO info : personInfos) { + if (personInfosStr.length() > 0) { + personInfosStr.append(","); + } + personInfosStr.append(info.getPersonProfile().getRealName()) + .append("-") + .append(info.getJob().getName()); + } + return personInfosStr.toString(); + } + + private List getPersonInfos(Long workspaceId, Long unitId, List persons) { + PageResp pageResp = visaOrganizationalNodeUserGateway.list(ListOrgNodeUserReq.builder() + .personIds(persons.stream().map(VisaChangeTempCreateReq.RelationUnitAndPerson::getPersonId).collect(Collectors.toList())) + .organizationalUnitId(unitId) + .workspaceId(workspaceId) + .needs(ListNodeUserReq.Needs.builder().job(true).personProfile(true).build()).build()); + if (Objects.isNull(pageResp) || CollectionUtils.isEmpty(pageResp.getData())) { + return Collections.emptyList(); + } + return pageResp.getData(); + } + + private List> buildContextDescription(List list) { + if (CollectionUtils.isEmpty(list)) { + return Collections.emptyList(); + } + List> contextDescriptions = new ArrayList<>(); + list.forEach(i -> { + Map contextDescription = new HashMap<>(); + UploadFieldDTO uploadFieldDTO = new UploadFieldDTO(); + uploadFieldDTO.setFileKey(i.getFileKey()); + uploadFieldDTO.setFileName(i.getFileName()); + uploadFieldDTO.setFileUrl(i.getFileUrl()); + contextDescription.put(FORM_FIELD_CONTEXT, uploadFieldDTO); + contextDescription.put(FORM_FIELD_DESCRIPTION, i.getText()); + contextDescriptions.add(contextDescription); + }); + return contextDescriptions; + } + /** * 更新 * @@ -776,16 +855,16 @@ public class ChangeRecordServiceImpl extends ServiceImpl