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
aea887e5
Commit
aea887e5
authored
Dec 12, 2025
by
王志超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 取消变更
parent
fa660769
Pipeline
#86850
passed with stages
in 1 minute 31 seconds
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
103 additions
and
9 deletions
+103
-9
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+103
-9
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
aea887e5
...
@@ -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
);
...
...
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