Commit aea887e5 by 王志超

feat: 取消变更

parent fa660769
Pipeline #86850 passed with stages
in 1 minute 31 seconds
...@@ -835,9 +835,18 @@ public class ChangeFlowBiz { ...@@ -835,9 +835,18 @@ public class ChangeFlowBiz {
Long flowId = req.getFlowId(); Long flowId = req.getFlowId();
// 查询工单有效性 // 查询工单有效性
ChangeRecord changeRecord = getFlowInfo(flowId); ChangeRecord changeRecord = getFlowInfo(flowId);
log.info("[cancel] nodeId:{}", changeRecord.getFlowNode()); String currentNodeId = changeRecord.getFlowNode();
// 检查工单节点 log.info("[cancel] nodeId:{}", currentNodeId);
this.checkNode(changeRecord.getFlowNode(), Collections.singletonList(ChangeFlowEnum.CHANGE_FLOW_SUBMIT.getNodeId()));
List<String> allowedCancelNodes = Arrays.asList(
ChangeFlowEnum.NEW_CHANGE_FLOW_START.getNodeId(),
ChangeFlowEnum.NEW_CHANGE_FLOW_OWNER_APPROVE.getNodeId(),
ChangeFlowEnum.NEW_CHANGE_FLOW_ADMIN_APPROVE.getNodeId(),
ChangeFlowEnum.NEW_CHANGE_FLOW_QUALITY_APPROVE.getNodeId(),
ChangeFlowEnum.NEW_CHANGE_FLOW_CONFIRM.getNodeId()
);
this.checkNode(currentNodeId, allowedCancelNodes);
String uid = RequestLocalBean.getUid(); String uid = RequestLocalBean.getUid();
String changeCommander = changeRecord.getChangeCommander(); String changeCommander = changeRecord.getChangeCommander();
if (!uid.equals(changeCommander)) { if (!uid.equals(changeCommander)) {
...@@ -850,8 +859,10 @@ public class ChangeFlowBiz { ...@@ -850,8 +859,10 @@ public class ChangeFlowBiz {
} }
// 工单流转 // 工单流转
Map<String, Object> content = buildFlowContent(FlowOperationTypeEnum.REFUSE); Map<String, Object> content = buildFlowContent(FlowOperationTypeEnum.REFUSE);
String nextNodeId = flowService.submitFlow(String.valueOf(flowId), flowDataDTO, uid, Map<String, Object> cancelParamMap = new HashMap<>();
ChangeFlowEnum.CHANGE_FLOW_SUBMIT.getTopoId(), JSON.toJSONString(content), false, cancelParamMap.put("type", FlowTransitionType.TYPE_REJECTED);
String nextNodeId = flowService.submitFlowWithParamMap(String.valueOf(flowId), flowDataDTO, uid,
ChangeFlowEnum.NEW_CHANGE_FLOW.getTopoId(), JSON.toJSONString(content), cancelParamMap,
FlowxOperationEnum.APPROVE_FAIL.getName(), "取消工单", changeRecord.getCreateTime()); FlowxOperationEnum.APPROVE_FAIL.getName(), "取消工单", changeRecord.getCreateTime());
log.info("[cancel] flowId:{}, nextNodeId:{}", flowId, nextNodeId); log.info("[cancel] flowId:{}, nextNodeId:{}", flowId, nextNodeId);
// 填充更新数据 // 填充更新数据
...@@ -866,12 +877,15 @@ public class ChangeFlowBiz { ...@@ -866,12 +877,15 @@ public class ChangeFlowBiz {
IusUserInfoRsp user = iusService.queryUserInfo(changeRecord.getChangeCommander()); IusUserInfoRsp user = iusService.queryUserInfo(changeRecord.getChangeCommander());
cancelMap.put("changeCommander", user == null ? changeRecord.getChangeCommander() : user.getName()); cancelMap.put("changeCommander", user == null ? changeRecord.getChangeCommander() : user.getName());
cancelMap.put("cancelReason", changeRecord.getCancelReason()); cancelMap.put("cancelReason", changeRecord.getCancelReason());
// 取消所有行动工单,并获取所有子工单列表(用于后续获取行动人邮箱)
List<ChangeSubFlowRecord> allSubFlows = cancelAllSubFlows(changeRecord.getId(), req.getCancelReason(), uid);
// 从行动工单获取行动人邮箱(去重)
List<String> userEmailList = extractExecUserEmailsFromSubFlows(allSubFlows);
String cancelSubjectParam = changeRecord.getFlowId().toString(); String cancelSubjectParam = changeRecord.getFlowId().toString();
List<String> receiver = new ArrayList<>(Collections.singletonList(changeCommander)); List<String> receiver = new ArrayList<>(Collections.singletonList(changeCommander));
List<ChangeFlowExecVO> execRecord = changeFlowExecService
.getChangeFlowExecRecord(changeRecord.getId());
List<String> userEmailList = execRecord.stream().map(ChangeFlowExecVO::getChangeExecUserEmail)
.collect(Collectors.toList());
receiver.addAll(userEmailList); receiver.addAll(userEmailList);
// 取消变更,抄送人:变更负责人+变更行动人上一级主管、变更管理QM(cuiyixian@corp.netease.com) // 取消变更,抄送人:变更负责人+变更行动人上一级主管、变更管理QM(cuiyixian@corp.netease.com)
userEmailList.addAll(receiver); userEmailList.addAll(receiver);
...@@ -897,6 +911,86 @@ public class ChangeFlowBiz { ...@@ -897,6 +911,86 @@ public class ChangeFlowBiz {
return changeFlowService.updateRecord(changeRecord); return changeFlowService.updateRecord(changeRecord);
} }
/**
* 取消所有行动工单
*
* @param changeRecordId 主工单ID
* @param cancelReason 取消原因
* @param uid 操作人
* @return 所有子工单列表(包括已取消和已完成的)
*/
private List<ChangeSubFlowRecord> cancelAllSubFlows(Long changeRecordId, String cancelReason, String uid) {
List<ChangeSubFlowRecord> allSubFlows = changeSubFlowRecordMapper.selectByChangeRecordId(changeRecordId);
if (CollectionUtils.isEmpty(allSubFlows)) {
log.info("[cancelAllSubFlows] 主工单下没有行动工单,changeRecordId:{}", changeRecordId);
return allSubFlows;
}
for (ChangeSubFlowRecord subFlowRecord : allSubFlows) {
// 跳过已经取消的子工单(已完成的子工单也需要取消)
Integer subFlowStatus = subFlowRecord.getStatus();
if (ChangeSubFlowStatusEnum.CANCELLED.getStatus().equals(subFlowStatus)) {
log.info("[cancelAllSubFlows] 子工单已取消,跳过, subFlowId:{}, status:{}",
subFlowRecord.getSubFlowId(), subFlowStatus);
continue;
}
try {
// 查询子工单流程详情
FlowDataDTO subFlowDataDTO = flowService.flowDetail(subFlowRecord.getSubFlowId());
if (subFlowDataDTO == null) {
log.warn("[cancelAllSubFlows] 子工单流程查询失败,跳过, subFlowId:{}", subFlowRecord.getSubFlowId());
continue;
}
// 构建提交内容
Map<String, Object> subFlowContent = buildFlowContent(FlowOperationTypeEnum.REFUSE);
Map<String, Object> subFlowCancelParamMap = new HashMap<>();
subFlowCancelParamMap.put("type", FlowTransitionType.TYPE_REJECTED);
// 流转子工单到结束节点
String subFlowCancelNodeId = flowService.submitFlow(subFlowRecord.getSubFlowId(), subFlowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(subFlowContent), false,
FlowxOperationEnum.APPROVE_FAIL.getName(), "主工单取消,取消行动工单", subFlowRecord.getCreateTime());
// 更新子工单状态为已取消
subFlowRecord.setSubFlowNode(subFlowCancelNodeId);
subFlowRecord.setStatus(ChangeSubFlowStatusEnum.CANCELLED.getStatus());
subFlowRecord.setCancelReason("主工单取消:" + cancelReason);
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
log.info("[cancelAllSubFlows] 子工单已取消,subFlowId:{}, cancelNodeId:{}",
subFlowRecord.getSubFlowId(), subFlowCancelNodeId);
} catch (Exception e) {
log.error("[cancelAllSubFlows] 取消子工单失败,subFlowId:{}, error:{}",
subFlowRecord.getSubFlowId(), e.getMessage(), e);
// 继续取消下一个子工单,不中断整个流程
}
}
return allSubFlows;
}
/**
* 从行动工单列表中提取行动人邮箱(去重)
*
* @param allSubFlows 所有行动工单列表
* @return 行动人邮箱列表(已去重)
*/
private List<String> extractExecUserEmailsFromSubFlows(List<ChangeSubFlowRecord> allSubFlows) {
Set<String> execUserEmailSet = new HashSet<>();
if (CollectionUtils.isNotEmpty(allSubFlows)) {
for (ChangeSubFlowRecord subFlow : allSubFlows) {
String execUserEmail = subFlow.getChangeExecUserEmail();
if (StringUtils.isNotBlank(execUserEmail)) {
execUserEmailSet.add(execUserEmail);
}
}
}
return new ArrayList<>(execUserEmailSet);
}
public BasicChangeFlowVO quote(Long flowId, String supplier, Integer createSource) { public BasicChangeFlowVO quote(Long flowId, String supplier, Integer createSource) {
// 获取工单详情 // 获取工单详情
ChangeRecord changeRecord = this.getFlowInfo(flowId); ChangeRecord changeRecord = this.getFlowInfo(flowId);
......
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