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
2266f77a
Commit
2266f77a
authored
Dec 04, 2025
by
王志超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 工单用户归属展示
parent
192ccb1e
Pipeline
#86532
passed with stages
in 1 minute 35 seconds
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
51 additions
and
23 deletions
+51
-23
ChangeSubFlowBiz.java
...netease/mail/yanxuan/change/biz/biz/ChangeSubFlowBiz.java
+50
-23
ChangeFlowEnum.java
...ease/mail/yanxuan/change/common/enums/ChangeFlowEnum.java
+1
-0
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeSubFlowBiz.java
View file @
2266f77a
...
@@ -165,8 +165,14 @@ public class ChangeSubFlowBiz {
...
@@ -165,8 +165,14 @@ public class ChangeSubFlowBiz {
ChangeSubFlowRecord
subFlowRecord
,
String
currentNode
,
ChangeSubFlowSubmitReq
changeSubFlowSubmitReq
)
{
ChangeSubFlowRecord
subFlowRecord
,
String
currentNode
,
ChangeSubFlowSubmitReq
changeSubFlowSubmitReq
)
{
ChangeFlowEnum
node
=
ChangeFlowEnum
.
getByNodeId
(
currentNode
);
ChangeFlowEnum
node
=
ChangeFlowEnum
.
getByNodeId
(
currentNode
);
Assert
.
notNull
(
node
,
"节点配置不存在"
);
Assert
.
notNull
(
node
,
"节点配置不存在"
);
log
.
debug
(
"[checkUpdateAndSubmit] subFlowId:{}, nodeEnum:{}, changeSubFlowSubmitReq:{}"
,
subFlowId
,
node
,
JSON
.
toJSONString
(
changeSubFlowSubmitReq
));
// 记录当前节点(用于日志对比)
String
oldNodeId
=
currentNode
;
String
oldNodeName
=
node
.
getName
();
log
.
info
(
"[checkUpdateAndSubmit] 子单流转开始 >>> subFlowId:{}, 当前节点ID:{}, 当前节点名称:{}"
,
subFlowId
,
oldNodeId
,
oldNodeName
);
log
.
debug
(
"[checkUpdateAndSubmit] 提交参数:{}"
,
JSON
.
toJSONString
(
changeSubFlowSubmitReq
));
// 构建工单内容
// 构建工单内容
Map
<
String
,
Object
>
content
=
new
HashMap
<>(
CommonConstants
.
INIT_HASH_MAP_SIZE
);
Map
<
String
,
Object
>
content
=
new
HashMap
<>(
CommonConstants
.
INIT_HASH_MAP_SIZE
);
...
@@ -213,7 +219,7 @@ public class ChangeSubFlowBiz {
...
@@ -213,7 +219,7 @@ public class ChangeSubFlowBiz {
// 根据前端传递的行动项列表重新创建
// 根据前端传递的行动项列表重新创建
List
<
ChangeExecRecord
>
newExecRecords
=
changeExecRecordBiz
.
buildChangeExecRecord
(
List
<
ChangeExecRecord
>
newExecRecords
=
changeExecRecordBiz
.
buildChangeExecRecord
(
subFlowRecord
.
getChangeRecordId
(),
changeExecProjectList
,
subFlowId
,
subFlowRecord
.
getId
());
subFlowRecord
.
getChangeRecordId
(),
changeExecProjectList
,
subFlowId
,
subFlowRecord
.
getId
());
newExecRecords
.
forEach
(
exec
->
changeFlowExecService
.
saveRecord
(
exec
)
);
newExecRecords
.
forEach
(
changeFlowExecService:
:
saveRecord
);
// 提交到下一节点
// 提交到下一节点
String
nextNodeId
=
flowService
.
submitFlow
(
subFlowId
,
flowDataDTO
,
uid
,
String
nextNodeId
=
flowService
.
submitFlow
(
subFlowId
,
flowDataDTO
,
uid
,
...
@@ -223,26 +229,29 @@ public class ChangeSubFlowBiz {
...
@@ -223,26 +229,29 @@ public class ChangeSubFlowBiz {
subFlowRecord
.
setSubFlowNode
(
nextNodeId
);
subFlowRecord
.
setSubFlowNode
(
nextNodeId
);
subFlowRecord
.
setStatus
(
ChangeSubFlowStatusEnum
.
WAIT_APPROVE_ACTION_PLAN
.
getStatus
());
subFlowRecord
.
setStatus
(
ChangeSubFlowStatusEnum
.
WAIT_APPROVE_ACTION_PLAN
.
getStatus
());
subFlowRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
subFlowRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
// 获取上级领导:根据行动人邮箱获取其部门上级领导(必须存在)
String
execUserEmail
=
subFlowRecord
.
getChangeExecUserEmail
();
if
(
StringUtils
.
isBlank
(
execUserEmail
))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"行动人邮箱不能为空"
);
}
String
leaderEmail
=
departmentLeaderBiz
.
getDepartmentLeader
(
execUserEmail
);
if
(
StringUtils
.
isBlank
(
leaderEmail
))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
String
.
format
(
"行动人[%s]的部门上级领导不存在"
,
execUserEmail
));
}
subFlowRecord
.
setApprover
(
leaderEmail
);
changeSubFlowRecordService
.
update
(
subFlowRecord
);
// 检查是否需要审批
:如果需要审批,则停留在当前节点等待审批
// 检查是否需要审批
if
(
needApprove
(
expectedDepartment
))
{
if
(
needApprove
(
expectedDepartment
))
{
// 需要审批:设置上级领导为审批人
String
execUserEmail
=
subFlowRecord
.
getChangeExecUserEmail
();
if
(
StringUtils
.
isBlank
(
execUserEmail
))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"行动人邮箱不能为空"
);
}
String
leaderEmail
=
departmentLeaderBiz
.
getDepartmentLeader
(
execUserEmail
);
if
(
StringUtils
.
isBlank
(
leaderEmail
))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
String
.
format
(
"行动人[%s]的部门上级领导不存在"
,
execUserEmail
));
}
// 设置审批人为上级领导(JSON 数组格式)
subFlowRecord
.
setApprover
(
JSON
.
toJSONString
(
Collections
.
singletonList
(
leaderEmail
)));
changeSubFlowRecordService
.
update
(
subFlowRecord
);
log
.
info
(
"[CHANGE_SUB_FLOW_START] 部门[{}]需要审批,等待上级审批"
,
expectedDepartment
);
log
.
info
(
"[CHANGE_SUB_FLOW_START] 部门[{}]需要审批,等待上级审批"
,
expectedDepartment
);
log
.
info
(
"[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-审批行动方案"
,
subFlowId
,
oldNodeId
,
oldNodeName
,
nextNodeId
);
return
nextNodeId
;
return
nextNodeId
;
}
}
// 不需要审批,自动提交到下一节点
// 不需要审批,自动提交到下一节点
(审批人保持为行动人自己)
log
.
info
(
"[CHANGE_SUB_FLOW_START] 部门[{}]不需要审批,自动跳过审批"
,
expectedDepartment
);
log
.
info
(
"[CHANGE_SUB_FLOW_START] 部门[{}]不需要审批,自动跳过审批"
,
expectedDepartment
);
String
autoNextNodeId
=
flowService
.
submitFlow
(
subFlowId
,
flowDataDTO
,
uid
,
String
autoNextNodeId
=
flowService
.
submitFlow
(
subFlowId
,
flowDataDTO
,
uid
,
ChangeFlowEnum
.
CHANGE_SUB_FLOW
.
getTopoId
(),
JSON
.
toJSONString
(
content
),
true
,
ChangeFlowEnum
.
CHANGE_SUB_FLOW
.
getTopoId
(),
JSON
.
toJSONString
(
content
),
true
,
...
@@ -252,6 +261,8 @@ public class ChangeSubFlowBiz {
...
@@ -252,6 +261,8 @@ public class ChangeSubFlowBiz {
subFlowRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
subFlowRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
changeSubFlowRecordService
.
update
(
subFlowRecord
);
changeSubFlowRecordService
.
update
(
subFlowRecord
);
// todo:非名单中部门无需审批,行动人确认提交后邮件同步负责人上级对应变更信息
// todo:非名单中部门无需审批,行动人确认提交后邮件同步负责人上级对应变更信息
log
.
info
(
"[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-审批变更方案 (自动跳过审批)"
,
subFlowId
,
oldNodeId
,
oldNodeName
,
autoNextNodeId
);
return
autoNextNodeId
;
return
autoNextNodeId
;
case
CHANGE_SUB_FLOW_SUBMIT:
case
CHANGE_SUB_FLOW_SUBMIT:
...
@@ -284,6 +295,9 @@ public class ChangeSubFlowBiz {
...
@@ -284,6 +295,9 @@ public class ChangeSubFlowBiz {
:
ChangeSubFlowStatusEnum
.
WAIT_CONFIRM_ACTION_PLAN
.
getStatus
());
:
ChangeSubFlowStatusEnum
.
WAIT_CONFIRM_ACTION_PLAN
.
getStatus
());
subFlowRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
subFlowRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
changeSubFlowRecordService
.
update
(
subFlowRecord
);
changeSubFlowRecordService
.
update
(
subFlowRecord
);
String
approveNodeName
=
approved
?
"审批变更方案"
:
"确认行动方案"
;
log
.
info
(
"[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-{}, 审批结果:{}"
,
subFlowId
,
oldNodeId
,
oldNodeName
,
approveNodeId
,
approveNodeName
,
approved
?
"通过"
:
"不通过"
);
return
approveNodeId
;
return
approveNodeId
;
case
CHANGE_SUB_FLOW_EXE:
case
CHANGE_SUB_FLOW_EXE:
...
@@ -320,6 +334,8 @@ public class ChangeSubFlowBiz {
...
@@ -320,6 +334,8 @@ public class ChangeSubFlowBiz {
}
}
}
}
log
.
info
(
"[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 节点保持:{}-{}, 审批结果:{}"
,
subFlowId
,
oldNodeId
,
oldNodeName
,
execApproved
?
"通过"
:
"不通过"
);
return
subFlowRecord
.
getSubFlowNode
();
return
subFlowRecord
.
getSubFlowNode
();
case
CHANGE_SUB_FLOW_CONFIRM:
case
CHANGE_SUB_FLOW_CONFIRM:
...
@@ -348,19 +364,21 @@ public class ChangeSubFlowBiz {
...
@@ -348,19 +364,21 @@ public class ChangeSubFlowBiz {
switch
(
subFlowResultStatus
)
{
switch
(
subFlowResultStatus
)
{
case
FINISH_ALL:
case
FINISH_ALL:
case
FINISH_PART:
case
FINISH_PART:
return
handleSubFlowFinish
(
subFlowRecord
,
changeSubFlowSubmitReq
,
flowDataDTO
,
uid
,
content
,
subFlowResultStatus
);
return
handleSubFlowFinish
(
subFlowRecord
,
changeSubFlowSubmitReq
,
flowDataDTO
,
uid
,
content
,
subFlowResultStatus
,
oldNodeId
,
oldNodeName
);
case
CANCEL:
case
CANCEL:
return
handleSubFlowCancel
(
subFlowRecord
,
changeSubFlowSubmitReq
,
flowDataDTO
,
uid
,
content
);
return
handleSubFlowCancel
(
subFlowRecord
,
changeSubFlowSubmitReq
,
flowDataDTO
,
uid
,
content
,
oldNodeId
,
oldNodeName
);
case
DELAY:
case
DELAY:
return
handleSubFlowDelay
(
subFlowRecord
,
changeSubFlowSubmitReq
);
return
handleSubFlowDelay
(
subFlowRecord
,
changeSubFlowSubmitReq
,
oldNodeId
,
oldNodeName
);
default
:
default
:
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"不支持的变更结论类型"
);
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"不支持的变更结论类型"
);
}
}
default
:
default
:
log
.
warn
(
"[checkUpdateAndSubmit] 不支持的子流程节点类型:subFlowId:{}, nodeId:{}, 节点名称:{}"
,
subFlowId
,
currentNode
,
node
.
getName
());
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"不支持的子流程节点类型"
);
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"不支持的子流程节点类型"
);
}
}
}
}
...
@@ -407,7 +425,8 @@ public class ChangeSubFlowBiz {
...
@@ -407,7 +425,8 @@ public class ChangeSubFlowBiz {
* 处理子单完成(FINISH_ALL / FINISH_PART)
* 处理子单完成(FINISH_ALL / FINISH_PART)
*/
*/
private
String
handleSubFlowFinish
(
ChangeSubFlowRecord
subFlowRecord
,
ChangeSubFlowSubmitReq
req
,
private
String
handleSubFlowFinish
(
ChangeSubFlowRecord
subFlowRecord
,
ChangeSubFlowSubmitReq
req
,
FlowDataDTO
flowDataDTO
,
String
uid
,
Object
content
,
ChangeResultEnum
resultStatus
)
{
FlowDataDTO
flowDataDTO
,
String
uid
,
Object
content
,
ChangeResultEnum
resultStatus
,
String
oldNodeId
,
String
oldNodeName
)
{
// 提交子单流程到结束节点
// 提交子单流程到结束节点
String
endNodeId
=
flowService
.
submitFlow
(
subFlowRecord
.
getSubFlowId
(),
flowDataDTO
,
uid
,
String
endNodeId
=
flowService
.
submitFlow
(
subFlowRecord
.
getSubFlowId
(),
flowDataDTO
,
uid
,
ChangeFlowEnum
.
CHANGE_SUB_FLOW
.
getTopoId
(),
JSON
.
toJSONString
(
content
),
true
,
ChangeFlowEnum
.
CHANGE_SUB_FLOW
.
getTopoId
(),
JSON
.
toJSONString
(
content
),
true
,
...
@@ -420,6 +439,8 @@ public class ChangeSubFlowBiz {
...
@@ -420,6 +439,8 @@ public class ChangeSubFlowBiz {
changeSubFlowRecordService
.
update
(
subFlowRecord
);
changeSubFlowRecordService
.
update
(
subFlowRecord
);
log
.
info
(
"[handleSubFlowFinish] 子单完成,subFlowId:{}, result:{}"
,
subFlowRecord
.
getSubFlowId
(),
resultStatus
);
log
.
info
(
"[handleSubFlowFinish] 子单完成,subFlowId:{}, result:{}"
,
subFlowRecord
.
getSubFlowId
(),
resultStatus
);
log
.
info
(
"[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-结束, 变更结论:{}"
,
subFlowRecord
.
getSubFlowId
(),
oldNodeId
,
oldNodeName
,
endNodeId
,
resultStatus
.
getDesc
());
// 发送邮件
// 发送邮件
sendSubFlowFinishEmail
(
subFlowRecord
);
sendSubFlowFinishEmail
(
subFlowRecord
);
...
@@ -431,7 +452,8 @@ public class ChangeSubFlowBiz {
...
@@ -431,7 +452,8 @@ public class ChangeSubFlowBiz {
* 处理子单取消(CANCEL)
* 处理子单取消(CANCEL)
*/
*/
private
String
handleSubFlowCancel
(
ChangeSubFlowRecord
subFlowRecord
,
ChangeSubFlowSubmitReq
req
,
private
String
handleSubFlowCancel
(
ChangeSubFlowRecord
subFlowRecord
,
ChangeSubFlowSubmitReq
req
,
FlowDataDTO
flowDataDTO
,
String
uid
,
Object
content
)
{
FlowDataDTO
flowDataDTO
,
String
uid
,
Object
content
,
String
oldNodeId
,
String
oldNodeName
)
{
// 1. 取消原因必填
// 1. 取消原因必填
if
(
StringUtils
.
isBlank
(
req
.
getCancelReason
()))
{
if
(
StringUtils
.
isBlank
(
req
.
getCancelReason
()))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"变更取消原因不可为空"
);
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"变更取消原因不可为空"
);
...
@@ -452,6 +474,8 @@ public class ChangeSubFlowBiz {
...
@@ -452,6 +474,8 @@ public class ChangeSubFlowBiz {
changeSubFlowRecordService
.
update
(
subFlowRecord
);
changeSubFlowRecordService
.
update
(
subFlowRecord
);
log
.
info
(
"[handleSubFlowCancel] 子单已取消,subFlowId:{}, reason:{}"
,
subFlowRecord
.
getSubFlowId
(),
req
.
getCancelReason
());
log
.
info
(
"[handleSubFlowCancel] 子单已取消,subFlowId:{}, reason:{}"
,
subFlowRecord
.
getSubFlowId
(),
req
.
getCancelReason
());
log
.
info
(
"[checkUpdateAndSubmit] 子单流转完成 <<< subFlowId:{}, 原节点:{}-{}, 新节点:{}-结束, 变更结论:取消"
,
subFlowRecord
.
getSubFlowId
(),
oldNodeId
,
oldNodeName
,
cancelNodeId
);
// 发送邮件
// 发送邮件
sendSubFlowFinishEmail
(
subFlowRecord
);
sendSubFlowFinishEmail
(
subFlowRecord
);
...
@@ -462,7 +486,8 @@ public class ChangeSubFlowBiz {
...
@@ -462,7 +486,8 @@ public class ChangeSubFlowBiz {
/**
/**
* 处理子单延期(DELAY)
* 处理子单延期(DELAY)
*/
*/
private
String
handleSubFlowDelay
(
ChangeSubFlowRecord
subFlowRecord
,
ChangeSubFlowSubmitReq
req
)
{
private
String
handleSubFlowDelay
(
ChangeSubFlowRecord
subFlowRecord
,
ChangeSubFlowSubmitReq
req
,
String
oldNodeId
,
String
oldNodeName
)
{
// 验证延期时间
// 验证延期时间
Long
changeConfirmResultTime
=
req
.
getChangeConfirmResultTime
();
Long
changeConfirmResultTime
=
req
.
getChangeConfirmResultTime
();
Long
tomorrowSpecificTime
=
DateUtils
.
getTomorrowSpecificTime
(
"00:00:00"
);
Long
tomorrowSpecificTime
=
DateUtils
.
getTomorrowSpecificTime
(
"00:00:00"
);
...
@@ -478,6 +503,8 @@ public class ChangeSubFlowBiz {
...
@@ -478,6 +503,8 @@ public class ChangeSubFlowBiz {
// todo:延期需要重新发邮件,改变执行邮件状态
// todo:延期需要重新发邮件,改变执行邮件状态
log
.
info
(
"[handleSubFlowDelay] 子单延期,subFlowId:{}, delayTime:{}"
,
subFlowRecord
.
getSubFlowId
(),
changeConfirmResultTime
);
log
.
info
(
"[handleSubFlowDelay] 子单延期,subFlowId:{}, delayTime:{}"
,
subFlowRecord
.
getSubFlowId
(),
changeConfirmResultTime
);
log
.
info
(
"[checkUpdateAndSubmit] 子单延期(不流转)<<< subFlowId:{}, 节点保持:{}-{}, 延期时间:{}"
,
subFlowRecord
.
getSubFlowId
(),
oldNodeId
,
oldNodeName
,
changeConfirmResultTime
);
return
null
;
return
null
;
}
}
...
...
yanxuan-qc-change-system-common/src/main/java/com/netease/mail/yanxuan/change/common/enums/ChangeFlowEnum.java
View file @
2266f77a
...
@@ -47,6 +47,7 @@ public enum ChangeFlowEnum {
...
@@ -47,6 +47,7 @@ public enum ChangeFlowEnum {
@Getter
@Getter
private
final
String
nodeId
;
private
final
String
nodeId
;
@Getter
private
final
String
name
;
private
final
String
name
;
@Getter
@Getter
...
...
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