Commit 2266f77a by 王志超

feat: 工单用户归属展示

parent 192ccb1e
Pipeline #86532 passed with stages
in 1 minute 35 seconds
...@@ -165,8 +165,14 @@ public class ChangeSubFlowBiz { ...@@ -165,8 +165,14 @@ public class ChangeSubFlowBiz {
ChangeSubFlowRecord subFlowRecord, String currentNode, ChangeSubFlowSubmitReq changeSubFlowSubmitReq) { ChangeSubFlowRecord subFlowRecord, String currentNode, ChangeSubFlowSubmitReq changeSubFlowSubmitReq) {
ChangeFlowEnum node = ChangeFlowEnum.getByNodeId(currentNode); ChangeFlowEnum node = ChangeFlowEnum.getByNodeId(currentNode);
Assert.notNull(node, "节点配置不存在"); Assert.notNull(node, "节点配置不存在");
log.debug("[checkUpdateAndSubmit] subFlowId:{}, nodeEnum:{}, changeSubFlowSubmitReq:{}",
subFlowId, node, JSON.toJSONString(changeSubFlowSubmitReq)); // 记录当前节点(用于日志对比)
String oldNodeId = currentNode;
String oldNodeName = node.getName();
log.info("[checkUpdateAndSubmit] 子单流转开始 >>> subFlowId:{}, 当前节点ID:{}, 当前节点名称:{}",
subFlowId, oldNodeId, oldNodeName);
log.debug("[checkUpdateAndSubmit] 提交参数:{}", JSON.toJSONString(changeSubFlowSubmitReq));
// 构建工单内容 // 构建工单内容
Map<String, Object> content = new HashMap<>(CommonConstants.INIT_HASH_MAP_SIZE); Map<String, Object> content = new HashMap<>(CommonConstants.INIT_HASH_MAP_SIZE);
...@@ -213,7 +219,7 @@ public class ChangeSubFlowBiz { ...@@ -213,7 +219,7 @@ public class ChangeSubFlowBiz {
// 根据前端传递的行动项列表重新创建 // 根据前端传递的行动项列表重新创建
List<ChangeExecRecord> newExecRecords = changeExecRecordBiz.buildChangeExecRecord( List<ChangeExecRecord> newExecRecords = changeExecRecordBiz.buildChangeExecRecord(
subFlowRecord.getChangeRecordId(), changeExecProjectList, subFlowId, subFlowRecord.getId()); subFlowRecord.getChangeRecordId(), changeExecProjectList, subFlowId, subFlowRecord.getId());
newExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec)); newExecRecords.forEach(changeFlowExecService::saveRecord);
// 提交到下一节点 // 提交到下一节点
String nextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid, String nextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
...@@ -223,26 +229,29 @@ public class ChangeSubFlowBiz { ...@@ -223,26 +229,29 @@ public class ChangeSubFlowBiz {
subFlowRecord.setSubFlowNode(nextNodeId); subFlowRecord.setSubFlowNode(nextNodeId);
subFlowRecord.setStatus(ChangeSubFlowStatusEnum.WAIT_APPROVE_ACTION_PLAN.getStatus()); subFlowRecord.setStatus(ChangeSubFlowStatusEnum.WAIT_APPROVE_ACTION_PLAN.getStatus());
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime()); subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
// 获取上级领导:根据行动人邮箱获取其部门上级领导(必须存在)
String execUserEmail = subFlowRecord.getChangeExecUserEmail();
if (StringUtils.isBlank(execUserEmail)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "行动人邮箱不能为空");
}
String leaderEmail = departmentLeaderBiz.getDepartmentLeader(execUserEmail);
if (StringUtils.isBlank(leaderEmail)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST,
String.format("行动人[%s]的部门上级领导不存在", execUserEmail));
}
subFlowRecord.setApprover(leaderEmail);
changeSubFlowRecordService.update(subFlowRecord);
// 检查是否需要审批:如果需要审批,则停留在当前节点等待审批 // 检查是否需要审批
if (needApprove(expectedDepartment)) { if (needApprove(expectedDepartment)) {
// 需要审批:设置上级领导为审批人
String execUserEmail = subFlowRecord.getChangeExecUserEmail();
if (StringUtils.isBlank(execUserEmail)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "行动人邮箱不能为空");
}
String leaderEmail = departmentLeaderBiz.getDepartmentLeader(execUserEmail);
if (StringUtils.isBlank(leaderEmail)) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST,
String.format("行动人[%s]的部门上级领导不存在", execUserEmail));
}
// 设置审批人为上级领导(JSON 数组格式)
subFlowRecord.setApprover(JSON.toJSONString(Collections.singletonList(leaderEmail)));
changeSubFlowRecordService.update(subFlowRecord);
log.info("[CHANGE_SUB_FLOW_START] 部门[{}]需要审批,等待上级审批", expectedDepartment); log.info("[CHANGE_SUB_FLOW_START] 部门[{}]需要审批,等待上级审批", expectedDepartment);
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-审批行动方案",
subFlowId, oldNodeId, oldNodeName, nextNodeId);
return nextNodeId; return nextNodeId;
} }
// 不需要审批,自动提交到下一节点 // 不需要审批,自动提交到下一节点(审批人保持为行动人自己)
log.info("[CHANGE_SUB_FLOW_START] 部门[{}]不需要审批,自动跳过审批", expectedDepartment); log.info("[CHANGE_SUB_FLOW_START] 部门[{}]不需要审批,自动跳过审批", expectedDepartment);
String autoNextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid, String autoNextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true, ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
...@@ -252,6 +261,8 @@ public class ChangeSubFlowBiz { ...@@ -252,6 +261,8 @@ public class ChangeSubFlowBiz {
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime()); subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord); changeSubFlowRecordService.update(subFlowRecord);
// todo:非名单中部门无需审批,行动人确认提交后邮件同步负责人上级对应变更信息 // todo:非名单中部门无需审批,行动人确认提交后邮件同步负责人上级对应变更信息
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-审批变更方案 (自动跳过审批)",
subFlowId, oldNodeId, oldNodeName, autoNextNodeId);
return autoNextNodeId; return autoNextNodeId;
case CHANGE_SUB_FLOW_SUBMIT: case CHANGE_SUB_FLOW_SUBMIT:
...@@ -284,6 +295,9 @@ public class ChangeSubFlowBiz { ...@@ -284,6 +295,9 @@ public class ChangeSubFlowBiz {
: ChangeSubFlowStatusEnum.WAIT_CONFIRM_ACTION_PLAN.getStatus()); : ChangeSubFlowStatusEnum.WAIT_CONFIRM_ACTION_PLAN.getStatus());
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime()); subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord); changeSubFlowRecordService.update(subFlowRecord);
String approveNodeName = approved ? "审批变更方案" : "确认行动方案";
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-{}, 审批结果:{}",
subFlowId, oldNodeId, oldNodeName, approveNodeId, approveNodeName, approved ? "通过" : "不通过");
return approveNodeId; return approveNodeId;
case CHANGE_SUB_FLOW_EXE: case CHANGE_SUB_FLOW_EXE:
...@@ -320,6 +334,8 @@ public class ChangeSubFlowBiz { ...@@ -320,6 +334,8 @@ public class ChangeSubFlowBiz {
} }
} }
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 节点保持:{}-{}, 审批结果:{}",
subFlowId, oldNodeId, oldNodeName, execApproved ? "通过" : "不通过");
return subFlowRecord.getSubFlowNode(); return subFlowRecord.getSubFlowNode();
case CHANGE_SUB_FLOW_CONFIRM: case CHANGE_SUB_FLOW_CONFIRM:
...@@ -348,19 +364,21 @@ public class ChangeSubFlowBiz { ...@@ -348,19 +364,21 @@ public class ChangeSubFlowBiz {
switch (subFlowResultStatus) { switch (subFlowResultStatus) {
case FINISH_ALL: case FINISH_ALL:
case FINISH_PART: case FINISH_PART:
return handleSubFlowFinish(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content, subFlowResultStatus); return handleSubFlowFinish(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content, subFlowResultStatus, oldNodeId, oldNodeName);
case CANCEL: case CANCEL:
return handleSubFlowCancel(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content); return handleSubFlowCancel(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content, oldNodeId, oldNodeName);
case DELAY: case DELAY:
return handleSubFlowDelay(subFlowRecord, changeSubFlowSubmitReq); return handleSubFlowDelay(subFlowRecord, changeSubFlowSubmitReq, oldNodeId, oldNodeName);
default: default:
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "不支持的变更结论类型"); throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "不支持的变更结论类型");
} }
default: default:
log.warn("[checkUpdateAndSubmit] 不支持的子流程节点类型:subFlowId:{}, nodeId:{}, 节点名称:{}",
subFlowId, currentNode, node.getName());
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "不支持的子流程节点类型"); throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "不支持的子流程节点类型");
} }
} }
...@@ -407,7 +425,8 @@ public class ChangeSubFlowBiz { ...@@ -407,7 +425,8 @@ public class ChangeSubFlowBiz {
* 处理子单完成(FINISH_ALL / FINISH_PART) * 处理子单完成(FINISH_ALL / FINISH_PART)
*/ */
private String handleSubFlowFinish(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req, private String handleSubFlowFinish(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req,
FlowDataDTO flowDataDTO, String uid, Object content, ChangeResultEnum resultStatus) { FlowDataDTO flowDataDTO, String uid, Object content, ChangeResultEnum resultStatus,
String oldNodeId, String oldNodeName) {
// 提交子单流程到结束节点 // 提交子单流程到结束节点
String endNodeId = flowService.submitFlow(subFlowRecord.getSubFlowId(), flowDataDTO, uid, String endNodeId = flowService.submitFlow(subFlowRecord.getSubFlowId(), flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true, ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
...@@ -420,6 +439,8 @@ public class ChangeSubFlowBiz { ...@@ -420,6 +439,8 @@ public class ChangeSubFlowBiz {
changeSubFlowRecordService.update(subFlowRecord); changeSubFlowRecordService.update(subFlowRecord);
log.info("[handleSubFlowFinish] 子单完成,subFlowId:{}, result:{}", subFlowRecord.getSubFlowId(), resultStatus); log.info("[handleSubFlowFinish] 子单完成,subFlowId:{}, result:{}", subFlowRecord.getSubFlowId(), resultStatus);
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-结束, 变更结论:{}",
subFlowRecord.getSubFlowId(), oldNodeId, oldNodeName, endNodeId, resultStatus.getDesc());
// 发送邮件 // 发送邮件
sendSubFlowFinishEmail(subFlowRecord); sendSubFlowFinishEmail(subFlowRecord);
...@@ -431,7 +452,8 @@ public class ChangeSubFlowBiz { ...@@ -431,7 +452,8 @@ public class ChangeSubFlowBiz {
* 处理子单取消(CANCEL) * 处理子单取消(CANCEL)
*/ */
private String handleSubFlowCancel(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req, private String handleSubFlowCancel(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req,
FlowDataDTO flowDataDTO, String uid, Object content) { FlowDataDTO flowDataDTO, String uid, Object content,
String oldNodeId, String oldNodeName) {
// 1. 取消原因必填 // 1. 取消原因必填
if (StringUtils.isBlank(req.getCancelReason())) { if (StringUtils.isBlank(req.getCancelReason())) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "变更取消原因不可为空"); throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "变更取消原因不可为空");
...@@ -452,6 +474,8 @@ public class ChangeSubFlowBiz { ...@@ -452,6 +474,8 @@ public class ChangeSubFlowBiz {
changeSubFlowRecordService.update(subFlowRecord); changeSubFlowRecordService.update(subFlowRecord);
log.info("[handleSubFlowCancel] 子单已取消,subFlowId:{}, reason:{}", subFlowRecord.getSubFlowId(), req.getCancelReason()); log.info("[handleSubFlowCancel] 子单已取消,subFlowId:{}, reason:{}", subFlowRecord.getSubFlowId(), req.getCancelReason());
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-结束, 变更结论:取消",
subFlowRecord.getSubFlowId(), oldNodeId, oldNodeName, cancelNodeId);
// 发送邮件 // 发送邮件
sendSubFlowFinishEmail(subFlowRecord); sendSubFlowFinishEmail(subFlowRecord);
...@@ -462,7 +486,8 @@ public class ChangeSubFlowBiz { ...@@ -462,7 +486,8 @@ public class ChangeSubFlowBiz {
/** /**
* 处理子单延期(DELAY) * 处理子单延期(DELAY)
*/ */
private String handleSubFlowDelay(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req) { private String handleSubFlowDelay(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req,
String oldNodeId, String oldNodeName) {
// 验证延期时间 // 验证延期时间
Long changeConfirmResultTime = req.getChangeConfirmResultTime(); Long changeConfirmResultTime = req.getChangeConfirmResultTime();
Long tomorrowSpecificTime = DateUtils.getTomorrowSpecificTime("00:00:00"); Long tomorrowSpecificTime = DateUtils.getTomorrowSpecificTime("00:00:00");
...@@ -478,6 +503,8 @@ public class ChangeSubFlowBiz { ...@@ -478,6 +503,8 @@ public class ChangeSubFlowBiz {
// todo:延期需要重新发邮件,改变执行邮件状态 // todo:延期需要重新发邮件,改变执行邮件状态
log.info("[handleSubFlowDelay] 子单延期,subFlowId:{}, delayTime:{}", subFlowRecord.getSubFlowId(), changeConfirmResultTime); log.info("[handleSubFlowDelay] 子单延期,subFlowId:{}, delayTime:{}", subFlowRecord.getSubFlowId(), changeConfirmResultTime);
log.info("[checkUpdateAndSubmit] 子单延期(不流转)<<< subFlowId:{}, 节点保持:{}-{}, 延期时间:{}",
subFlowRecord.getSubFlowId(), oldNodeId, oldNodeName, changeConfirmResultTime);
return null; return null;
} }
......
...@@ -47,6 +47,7 @@ public enum ChangeFlowEnum { ...@@ -47,6 +47,7 @@ public enum ChangeFlowEnum {
@Getter @Getter
private final String nodeId; private final String nodeId;
@Getter
private final String name; private final String name;
@Getter @Getter
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment