Commit 1892f990 by 王志超

fix bug: 催办

parent 783707bb
...@@ -1444,7 +1444,7 @@ public class ChangeFlowBiz { ...@@ -1444,7 +1444,7 @@ public class ChangeFlowBiz {
} }
// 设置变更完结时间和是否超期标识 // 设置变更完结时间和是否超期标识
buildChangeEndTime(c, changeFlowVO, subFlowRecordsMap); calculateOverdueStatus(c, changeFlowVO, subFlowRecordsMap);
return changeFlowVO; return changeFlowVO;
}).collect(Collectors.toList()); }).collect(Collectors.toList());
...@@ -2175,7 +2175,8 @@ public class ChangeFlowBiz { ...@@ -2175,7 +2175,8 @@ public class ChangeFlowBiz {
* @param changeFlowVO 变更工单视图对象 * @param changeFlowVO 变更工单视图对象
* @param subFlowRecordsMap 所有行动工单Map,key为changeRecordId,value为该主单下所有行动工单列表 * @param subFlowRecordsMap 所有行动工单Map,key为changeRecordId,value为该主单下所有行动工单列表
*/ */
private void buildChangeEndTime(ChangeRecord changeRecord, ChangeFlowVO changeFlowVO, Map<Long, List<ChangeSubFlowRecord>> subFlowRecordsMap) { private void calculateOverdueStatus(ChangeRecord changeRecord, ChangeFlowVO changeFlowVO,
Map<Long, List<ChangeSubFlowRecord>> subFlowRecordsMap) {
Integer state = changeRecord.getState(); Integer state = changeRecord.getState();
String flowNode = changeRecord.getFlowNode(); String flowNode = changeRecord.getFlowNode();
Long changeConfirmResultTime = changeRecord.getChangeConfirmResultTime(); Long changeConfirmResultTime = changeRecord.getChangeConfirmResultTime();
...@@ -2205,42 +2206,36 @@ public class ChangeFlowBiz { ...@@ -2205,42 +2206,36 @@ public class ChangeFlowBiz {
// 未完成的工单:展示预期完成时间(changeConfirmResultTime) // 未完成的工单:展示预期完成时间(changeConfirmResultTime)
changeFlowVO.setChangeEndTime(changeConfirmResultTime); changeFlowVO.setChangeEndTime(changeConfirmResultTime);
// 超期判断:非完结/取消的变更单,判断是否超过两个工作日未处理 // 超期判断:根据主工单和子工单的实际节点来判断
boolean isOverdue = false; boolean isOverdue = false;
Long currentTime = DateUtils.getCurrentTime(); Long currentTime = DateUtils.getCurrentTime();
// 判断变更单的 changeConfirmResultTime 是否超过两个工作日 // 从Map中获取该主单下所有行动工单
if (isOverdueByWorkdays(changeConfirmResultTime, currentTime, 2)) { List<ChangeSubFlowRecord> allSubFlows = subFlowRecordsMap.getOrDefault(changeRecord.getId(), new ArrayList<>());
isOverdue = true;
}
// 判断执行项的 changeExecFinishTime 是否超过两个工作日 if (CollectionUtils.isNotEmpty(allSubFlows)) {
// 注意:只判断未完结或未取消的行动工单对应的行动项 // 场景1:主工单在"确认变更方案"节点,子工单在"确认行动方案"、"审批行动方案"或"审批变更方案"节点
if (!isOverdue) { if (ChangeFlowEnum.NEW_CHANGE_FLOW_CONFIRM_EXEC_PLAN.getNodeId().equals(flowNode)) {
// 从Map中获取该主单下所有行动工单 for (ChangeSubFlowRecord subFlow: allSubFlows) {
List<ChangeSubFlowRecord> allSubFlows = subFlowRecordsMap.getOrDefault(changeRecord.getId(), new ArrayList<>()); String subFlowNode = subFlow.getSubFlowNode();
// 内部过滤:只保留未完结或未取消的行动工单 if (ChangeFlowEnum.CHANGE_SUB_FLOW_START.getNodeId().equals(subFlowNode)
List<ChangeSubFlowRecord> activeSubFlows = allSubFlows.stream() || ChangeFlowEnum.CHANGE_SUB_FLOW_SUBMIT.getNodeId().equals(subFlowNode)
.filter(subFlow -> { || ChangeFlowEnum.CHANGE_SUB_FLOW_EXE.getNodeId().equals(subFlowNode)) {
Integer status = subFlow.getStatus(); Long subFlowUpdateTime = subFlow.getUpdateTime();
return status != null if (subFlowUpdateTime != null && isOverdueByWorkdays(subFlowUpdateTime, currentTime, 2)) {
&& !ChangeSubFlowStatusEnum.FINISHED.getStatus().equals(status) isOverdue = true;
&& !ChangeSubFlowStatusEnum.CANCELLED.getStatus().equals(status); break;
}) }
.collect(Collectors.toList()); }
}
if (CollectionUtils.isNotEmpty(activeSubFlows)) { }
// 提取未完结或未取消的行动工单的ID // 场景2:主工单在"执行变更方案"节点,子工单在"提交执行结果"节点
Set<Long> activeSubFlowRecordIds = activeSubFlows.stream() else if (ChangeFlowEnum.NEW_CHANGE_FLOW_EXE.getNodeId().equals(flowNode)) {
.map(ChangeSubFlowRecord::getId) for (ChangeSubFlowRecord subFlow: allSubFlows) {
.collect(Collectors.toSet()); String subFlowNode = subFlow.getSubFlowNode();
if (ChangeFlowEnum.CHANGE_SUB_FLOW_CONFIRM.getNodeId().equals(subFlowNode)) {
// 批量查询这些行动工单对应的行动项 Long subFlowUpdateTime = subFlow.getUpdateTime();
List<ChangeExecRecord> execRecords = changeExecRecordMapper.selectBySubFlowRecordIds(new ArrayList<>(activeSubFlowRecordIds)); if (subFlowUpdateTime != null && isOverdueByWorkdays(subFlowUpdateTime, currentTime, 2)) {
if (CollectionUtils.isNotEmpty(execRecords)) {
for (ChangeExecRecord execRecord : execRecords) {
Long changeExecFinishTime = execRecord.getChangeExecFinishTime();
if (changeExecFinishTime != null && isOverdueByWorkdays(changeExecFinishTime, currentTime, 2)) {
isOverdue = true; isOverdue = true;
break; break;
} }
...@@ -2313,21 +2308,38 @@ public class ChangeFlowBiz { ...@@ -2313,21 +2308,38 @@ public class ChangeFlowBiz {
// 通过详情接口查询工单 // 通过详情接口查询工单
ChangeFlowVO changeFlowVO = detail(flowId); ChangeFlowVO changeFlowVO = detail(flowId);
// 查询主工单信息(用于buildChangeEndTime和后续邮件参数) // 查询主工单信息(用于calculateOverdueStatus和后续邮件参数)
ChangeRecord changeRecord = changeFlowService.getByFlowId(flowId); ChangeRecord changeRecord = changeFlowService.getByFlowId(flowId);
// 查询该主单下的所有行动工单 // 查询该主单下的所有行动工单
List<ChangeSubFlowRecord> allSubFlows = changeSubFlowRecordService.getByChangeRecordIds( List<ChangeSubFlowRecord> allSubFlows = changeSubFlowRecordService.getByChangeRecordIds(
Collections.singletonList(changeFlowVO.getId())); Collections.singletonList(changeFlowVO.getId()));
// 构建 subFlowRecordsMap 并计算 isOverdue // 构建 subFlowRecordsMap
Map<Long, List<ChangeSubFlowRecord>> subFlowRecordsMap = new HashMap<>(); Map<Long, List<ChangeSubFlowRecord>> subFlowRecordsMap = new HashMap<>();
if (CollectionUtils.isNotEmpty(allSubFlows)) { if (CollectionUtils.isNotEmpty(allSubFlows)) {
subFlowRecordsMap = allSubFlows.stream() subFlowRecordsMap = allSubFlows.stream()
.collect(Collectors.groupingBy(ChangeSubFlowRecord::getChangeRecordId)); .collect(Collectors.groupingBy(ChangeSubFlowRecord::getChangeRecordId));
} }
buildChangeEndTime(changeRecord, changeFlowVO, subFlowRecordsMap);
// 批量查询所有行动工单对应的行动项(用于超期判断和后续催办邮件)
Map<Long, List<ChangeExecRecord>> execRecordsBySubFlow;
if (CollectionUtils.isNotEmpty(allSubFlows)) {
Set<Long> allSubFlowRecordIds = allSubFlows.stream().map(ChangeSubFlowRecord::getId)
.collect(Collectors.toSet());
List<ChangeExecRecord> execRecords = changeExecRecordMapper
.selectBySubFlowRecordIds(new ArrayList<>(allSubFlowRecordIds));
// 按行动工单分组
execRecordsBySubFlow = execRecords.stream().filter(exec -> exec.getSubFlowRecordId() != null)
.collect(Collectors.groupingBy(ChangeExecRecord::getSubFlowRecordId));
} else {
execRecordsBySubFlow = new HashMap<>();
}
// 计算 isOverdue
calculateOverdueStatus(changeRecord, changeFlowVO, subFlowRecordsMap);
// 判断是否超期 // 判断是否超期
if (changeFlowVO.getIsOverdue() == null || !changeFlowVO.getIsOverdue()) { if (changeFlowVO.getIsOverdue() == null || !changeFlowVO.getIsOverdue()) {
log.info("[urge] 工单未超期,无需催办,flowId:{}", flowId); log.info("[urge] 工单未超期,无需催办,flowId:{}", flowId);
...@@ -2339,18 +2351,6 @@ public class ChangeFlowBiz { ...@@ -2339,18 +2351,6 @@ public class ChangeFlowBiz {
return; return;
} }
// 批量查询所有行动工单对应的行动项
Set<Long> allSubFlowRecordIds = allSubFlows.stream()
.map(ChangeSubFlowRecord::getId)
.collect(Collectors.toSet());
List<ChangeExecRecord> execRecords = changeExecRecordMapper.selectBySubFlowRecordIds(
new ArrayList<>(allSubFlowRecordIds));
// 按行动工单分组
Map<Long, List<ChangeExecRecord>> execRecordsBySubFlow = execRecords.stream()
.filter(exec -> exec.getSubFlowRecordId() != null)
.collect(Collectors.groupingBy(ChangeExecRecord::getSubFlowRecordId));
// 过滤出未完结、未取消且超期的行动工单 // 过滤出未完结、未取消且超期的行动工单
Long currentTime = DateUtils.getCurrentTime(); Long currentTime = DateUtils.getCurrentTime();
List<ChangeSubFlowRecord> overdueSubFlows = allSubFlows.stream() List<ChangeSubFlowRecord> overdueSubFlows = allSubFlows.stream()
......
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