Commit 2266f77a by 王志超

feat: 工单用户归属展示

parent 192ccb1e
Pipeline #86532 passed with stages
in 1 minute 35 seconds
......@@ -165,8 +165,14 @@ public class ChangeSubFlowBiz {
ChangeSubFlowRecord subFlowRecord, String currentNode, ChangeSubFlowSubmitReq changeSubFlowSubmitReq) {
ChangeFlowEnum node = ChangeFlowEnum.getByNodeId(currentNode);
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);
......@@ -213,7 +219,7 @@ public class ChangeSubFlowBiz {
// 根据前端传递的行动项列表重新创建
List<ChangeExecRecord> newExecRecords = changeExecRecordBiz.buildChangeExecRecord(
subFlowRecord.getChangeRecordId(), changeExecProjectList, subFlowId, subFlowRecord.getId());
newExecRecords.forEach(exec -> changeFlowExecService.saveRecord(exec));
newExecRecords.forEach(changeFlowExecService::saveRecord);
// 提交到下一节点
String nextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
......@@ -223,26 +229,29 @@ public class ChangeSubFlowBiz {
subFlowRecord.setSubFlowNode(nextNodeId);
subFlowRecord.setStatus(ChangeSubFlowStatusEnum.WAIT_APPROVE_ACTION_PLAN.getStatus());
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)) {
// 需要审批:设置上级领导为审批人
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("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-审批行动方案",
subFlowId, oldNodeId, oldNodeName, nextNodeId);
return nextNodeId;
}
// 不需要审批,自动提交到下一节点
// 不需要审批,自动提交到下一节点(审批人保持为行动人自己)
log.info("[CHANGE_SUB_FLOW_START] 部门[{}]不需要审批,自动跳过审批", expectedDepartment);
String autoNextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
......@@ -252,6 +261,8 @@ public class ChangeSubFlowBiz {
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
// todo:非名单中部门无需审批,行动人确认提交后邮件同步负责人上级对应变更信息
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-审批变更方案 (自动跳过审批)",
subFlowId, oldNodeId, oldNodeName, autoNextNodeId);
return autoNextNodeId;
case CHANGE_SUB_FLOW_SUBMIT:
......@@ -284,6 +295,9 @@ public class ChangeSubFlowBiz {
: ChangeSubFlowStatusEnum.WAIT_CONFIRM_ACTION_PLAN.getStatus());
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
String approveNodeName = approved ? "审批变更方案" : "确认行动方案";
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-{}, 审批结果:{}",
subFlowId, oldNodeId, oldNodeName, approveNodeId, approveNodeName, approved ? "通过" : "不通过");
return approveNodeId;
case CHANGE_SUB_FLOW_EXE:
......@@ -320,6 +334,8 @@ public class ChangeSubFlowBiz {
}
}
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 节点保持:{}-{}, 审批结果:{}",
subFlowId, oldNodeId, oldNodeName, execApproved ? "通过" : "不通过");
return subFlowRecord.getSubFlowNode();
case CHANGE_SUB_FLOW_CONFIRM:
......@@ -348,19 +364,21 @@ public class ChangeSubFlowBiz {
switch (subFlowResultStatus) {
case FINISH_ALL:
case FINISH_PART:
return handleSubFlowFinish(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content, subFlowResultStatus);
return handleSubFlowFinish(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content, subFlowResultStatus, oldNodeId, oldNodeName);
case CANCEL:
return handleSubFlowCancel(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content);
return handleSubFlowCancel(subFlowRecord, changeSubFlowSubmitReq, flowDataDTO, uid, content, oldNodeId, oldNodeName);
case DELAY:
return handleSubFlowDelay(subFlowRecord, changeSubFlowSubmitReq);
return handleSubFlowDelay(subFlowRecord, changeSubFlowSubmitReq, oldNodeId, oldNodeName);
default:
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "不支持的变更结论类型");
}
default:
log.warn("[checkUpdateAndSubmit] 不支持的子流程节点类型:subFlowId:{}, nodeId:{}, 节点名称:{}",
subFlowId, currentNode, node.getName());
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "不支持的子流程节点类型");
}
}
......@@ -407,7 +425,8 @@ public class ChangeSubFlowBiz {
* 处理子单完成(FINISH_ALL / FINISH_PART)
*/
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,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
......@@ -420,6 +439,8 @@ public class ChangeSubFlowBiz {
changeSubFlowRecordService.update(subFlowRecord);
log.info("[handleSubFlowFinish] 子单完成,subFlowId:{}, result:{}", subFlowRecord.getSubFlowId(), resultStatus);
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-结束, 变更结论:{}",
subFlowRecord.getSubFlowId(), oldNodeId, oldNodeName, endNodeId, resultStatus.getDesc());
// 发送邮件
sendSubFlowFinishEmail(subFlowRecord);
......@@ -431,7 +452,8 @@ public class ChangeSubFlowBiz {
* 处理子单取消(CANCEL)
*/
private String handleSubFlowCancel(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req,
FlowDataDTO flowDataDTO, String uid, Object content) {
FlowDataDTO flowDataDTO, String uid, Object content,
String oldNodeId, String oldNodeName) {
// 1. 取消原因必填
if (StringUtils.isBlank(req.getCancelReason())) {
throw ExceptionFactory.createBiz(ResponseCode.BAD_REQUEST, "变更取消原因不可为空");
......@@ -452,6 +474,8 @@ public class ChangeSubFlowBiz {
changeSubFlowRecordService.update(subFlowRecord);
log.info("[handleSubFlowCancel] 子单已取消,subFlowId:{}, reason:{}", subFlowRecord.getSubFlowId(), req.getCancelReason());
log.info("[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-结束, 变更结论:取消",
subFlowRecord.getSubFlowId(), oldNodeId, oldNodeName, cancelNodeId);
// 发送邮件
sendSubFlowFinishEmail(subFlowRecord);
......@@ -462,7 +486,8 @@ public class ChangeSubFlowBiz {
/**
* 处理子单延期(DELAY)
*/
private String handleSubFlowDelay(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req) {
private String handleSubFlowDelay(ChangeSubFlowRecord subFlowRecord, ChangeSubFlowSubmitReq req,
String oldNodeId, String oldNodeName) {
// 验证延期时间
Long changeConfirmResultTime = req.getChangeConfirmResultTime();
Long tomorrowSpecificTime = DateUtils.getTomorrowSpecificTime("00:00:00");
......@@ -478,6 +503,8 @@ public class ChangeSubFlowBiz {
// todo:延期需要重新发邮件,改变执行邮件状态
log.info("[handleSubFlowDelay] 子单延期,subFlowId:{}, delayTime:{}", subFlowRecord.getSubFlowId(), changeConfirmResultTime);
log.info("[checkUpdateAndSubmit] 子单延期(不流转)<<< subFlowId:{}, 节点保持:{}-{}, 延期时间:{}",
subFlowRecord.getSubFlowId(), oldNodeId, oldNodeName, changeConfirmResultTime);
return null;
}
......
......@@ -47,6 +47,7 @@ public enum ChangeFlowEnum {
@Getter
private final String nodeId;
@Getter
private final String name;
@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