Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
Y
yanxuan-qc-change-system
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
yx-qc-change-flow
yanxuan-qc-change-system
Commits
1892f990
Commit
1892f990
authored
Jan 16, 2026
by
王志超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix bug: 催办
parent
783707bb
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
47 additions
and
47 deletions
+47
-47
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+47
-47
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
1892f990
...
...
@@ -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
;
}
// 判断执行项的 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,20 +2308,37 @@ 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
())
{
...
...
@@ -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
()
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment