Commit 1892f990 by 王志超

fix bug: 催办

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