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
6118f52a
Commit
6118f52a
authored
Nov 17, 2025
by
王志超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 重构变更工单创建流程,使用新的流程
parent
a15a46eb
Pipeline
#85716
passed with stages
in 2 minutes 7 seconds
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
87 additions
and
89 deletions
+87
-89
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+75
-88
ChangeFlowExecService.java
...ail/yanxuan/change/biz/service/ChangeFlowExecService.java
+7
-1
ChangeFlowExecServiceImpl.java
...an/change/biz/service/impl/ChangeFlowExecServiceImpl.java
+5
-0
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
6118f52a
...
...
@@ -267,41 +267,15 @@ public class ChangeFlowBiz {
// 保存工单数据
ChangeRecord
changeRecord
=
buildChangeRecord
(
flowId
,
nodeId
,
changeFlowCreateReq
,
changeCommander
,
uid
);
changeFlowService
.
saveRecord
(
changeRecord
);
// 保存变更行动方案记录,新增流程绑定
List
<
ChangeExecRecord
>
changeExecRecords
=
new
ArrayList
<>();
for
(
ChangeExecConfigReq
changeExecConfigReq
:
changeExecProject
)
{
// 构建子流程工单内容(包含主流程信息)
Map
<
String
,
Object
>
subFlowContent
=
buildFlowContent
(
uid
);
subFlowContent
.
put
(
"changeRecordId"
,
changeRecord
.
getId
());
subFlowContent
.
put
(
"mainFlowId"
,
flowId
);
// 构建子流程工单名称:主流程名称 + 行动项内容(截取前50字符)
String
subFlowName
=
flowName
+
"-"
+
changeExecConfigReq
.
getChangeExecProject
();
if
(
subFlowName
.
length
()
>
100
)
{
subFlowName
=
subFlowName
.
substring
(
0
,
100
)
+
"..."
;
}
FlowCreateReqDTO
subFlowCreateReqDTO
=
buildFlowCreateReqDTO
(
ChangeFlowEnum
.
CHANGE_SUB_FLOW
.
getTopoId
(),
uid
,
JSON
.
toJSONString
(
subFlowContent
),
FlowxOperationEnum
.
CREATE
.
getName
(),
name
,
subFlowName
);
String
subFlowId
=
flowService
.
createFlow
(
subFlowCreateReqDTO
);
// 查询工单详情
FlowDataDTO
subFlowDataDTO
=
flowService
.
flowDetail
(
subFlowId
);
// 获取流程节点ID
String
subNodeId
=
subFlowDataDTO
.
getFlowMeta
().
getCurrNodeDataList
().
get
(
0
).
getNodeId
();
log
.
info
(
"[createSubFlowTopo] changeRecordId:{}, subFlowId:{}, nodeId:{}"
,
changeRecord
.
getId
(),
subFlowId
,
subNodeId
);
// 构建执行记录
ChangeExecRecord
execRecord
=
buildChangeExecRecord
(
changeRecord
.
getId
(),
changeExecConfigReq
,
subFlowId
,
subNodeId
);
// 入库
changeFlowExecService
.
saveRecord
(
execRecord
);
changeExecRecords
.
add
(
execRecord
);
}
// 保存变更行动方案记录(不绑定子流程,待触发时再创建)
List
<
ChangeExecRecord
>
changeExecRecords
=
buildChangeExecRecord
(
changeRecord
.
getId
(),
changeExecProject
);
changeExecRecords
.
forEach
(
exec
->
changeFlowExecService
.
saveRecord
(
exec
));
// 保存附件
saveChangeFiles
(
changeRecord
.
getId
(),
changeFlowCreateReq
);
// 完成流程创建(提交节点、发送邮件)
finalizeFlowCreation
(
flowId
,
flowDataDTO
,
changeRecord
,
changeExecRecords
,
changeCommander
,
changeType
,
content
,
uid
,
changeFlowCreateReq
);
// 完成流程创建(提交节点、发送邮件
、创建子流程
)
finalizeFlowCreation
(
flowId
,
flowDataDTO
,
changeRecord
,
changeExecRecords
,
changeCommander
,
changeType
,
content
,
uid
,
name
,
flowName
,
changeFlowCreateReq
);
return
flowId
;
}
...
...
@@ -326,7 +300,7 @@ public class ChangeFlowBiz {
}
/**
* 完成流程创建(提交节点、发送邮件)
* 完成流程创建(提交节点、发送邮件
、创建子流程
)
*
* @param flowId 工单ID
* @param flowDataDTO 工单详情
...
...
@@ -336,23 +310,70 @@ public class ChangeFlowBiz {
* @param changeType 变更类型
* @param content 工单内容
* @param uid 创建人
* @param name 创建人姓名
* @param flowName 主流程名称
* @param changeFlowCreateReq 创建请求
*/
private
void
finalizeFlowCreation
(
String
flowId
,
FlowDataDTO
flowDataDTO
,
ChangeRecord
changeRecord
,
List
<
ChangeExecRecord
>
changeExecRecords
,
String
changeCommander
,
StringBuilder
changeType
,
Map
<
String
,
Object
>
content
,
String
uid
,
ChangeFlowCreateReq
changeFlowCreateReq
)
{
// 如果发起人=变更负责人,直接提交到执行节点并发送邮件
String
name
,
String
flowName
,
ChangeFlowCreateReq
changeFlowCreateReq
)
{
// 如果发起人=变更负责人,直接提交到执行节点
,创建子流程
并发送邮件
if
(
changeCommander
.
equals
(
uid
))
{
submitToExecutionNode
(
flowId
,
flowDataDTO
,
uid
,
content
,
changeRecord
);
// 创建子流程并绑定
createAndBindSubFlows
(
changeRecord
,
uid
,
name
,
flowName
);
buildAndSendEmail
.
buildAndSendEmailCreate
(
changeRecord
,
changeExecRecords
,
changeType
,
changeCommander
,
changeFlowCreateReq
);
}
else
{
// 如果发起人≠变更负责人,只发送邮件(不提交节点)
// 如果发起人≠变更负责人,只发送邮件(不提交节点
,不创建子流程
)
sendCreateFlowEmail
(
changeRecord
,
changeCommander
,
changeType
,
changeFlowCreateReq
);
}
}
/**
* 创建子流程并绑定到执行记录
*
* @param changeRecord 主流程记录
* @param uid 创建人
* @param name 创建人姓名
* @param flowName 主流程名称
*/
private
void
createAndBindSubFlows
(
ChangeRecord
changeRecord
,
String
uid
,
String
name
,
String
flowName
)
{
// 从数据库查询执行记录列表
List
<
ChangeExecRecord
>
execRecords
=
changeFlowExecService
.
getChangeExecRecordList
(
changeRecord
.
getId
());
if
(
CollectionUtils
.
isEmpty
(
execRecords
))
{
log
.
warn
(
"[createAndBindSubFlows] 未查询到执行记录, changeRecordId:{}"
,
changeRecord
.
getId
());
return
;
}
for
(
ChangeExecRecord
execRecord
:
execRecords
)
{
// 构建子流程工单内容
Map
<
String
,
Object
>
subFlowContent
=
buildFlowContent
(
uid
);
// 构建子流程工单名称:主流程名称 + 行动项内容(截取前100字符)
String
subFlowName
=
flowName
+
"-"
+
execRecord
.
getChangeExecProject
();
if
(
subFlowName
.
length
()
>
100
)
{
subFlowName
=
subFlowName
.
substring
(
0
,
100
)
+
"..."
;
}
FlowCreateReqDTO
subFlowCreateReqDTO
=
buildFlowCreateReqDTO
(
ChangeFlowEnum
.
CHANGE_SUB_FLOW
.
getTopoId
(),
uid
,
JSON
.
toJSONString
(
subFlowContent
),
FlowxOperationEnum
.
CREATE
.
getName
(),
name
,
subFlowName
);
String
subFlowId
=
flowService
.
createFlow
(
subFlowCreateReqDTO
);
// 查询工单详情
FlowDataDTO
subFlowDataDTO
=
flowService
.
flowDetail
(
subFlowId
);
// 获取流程节点ID
String
subNodeId
=
subFlowDataDTO
.
getFlowMeta
().
getCurrNodeDataList
().
get
(
0
).
getNodeId
();
log
.
info
(
"[createAndBindSubFlows] changeRecordId:{}, subFlowId:{}, nodeId:{}"
,
changeRecord
.
getId
(),
subFlowId
,
subNodeId
);
// 更新执行记录,绑定子流程
execRecord
.
setSubFlowId
(
Long
.
parseLong
(
subFlowId
));
execRecord
.
setSubFlowNode
(
subNodeId
);
changeFlowExecService
.
update
(
execRecord
);
}
}
/**
* 提交到执行节点
*/
private
void
submitToExecutionNode
(
String
flowId
,
FlowDataDTO
flowDataDTO
,
String
uid
,
Map
<
String
,
Object
>
content
,
ChangeRecord
changeRecord
)
{
...
...
@@ -470,58 +491,24 @@ public class ChangeFlowBiz {
}).
collect
(
Collectors
.
toList
());
}
/**
* 构建单个执行记录
*
* @param changeRecordId 主流程记录ID
* @param changeExecConfigReq 行动项配置
* @return 执行记录
*/
private
ChangeExecRecord
buildChangeExecRecord
(
Long
changeRecordId
,
ChangeExecConfigReq
changeExecConfigReq
)
{
ChangeExecRecord
changeExecRecord
=
new
ChangeExecRecord
();
changeExecRecord
.
setChangeRecordId
(
changeRecordId
);
changeExecRecord
.
setChangeExecDepartment
(
changeExecConfigReq
.
getChangeExecDepartment
());
changeExecRecord
.
setChangeExecUserType
(
changeExecConfigReq
.
getChangeExecUserType
());
changeExecRecord
.
setChangeExecUser
(
changeExecConfigReq
.
getChangeExecUser
());
changeExecRecord
.
setChangeExecUserEmail
(
changeExecConfigReq
.
getChangeExecUserEmail
());
changeExecRecord
.
setChangeRiskDesc
(
changeExecConfigReq
.
getChangeRiskDesc
());
changeExecRecord
.
setChangeExecProject
(
changeExecConfigReq
.
getChangeExecProject
());
changeExecRecord
.
setChangeChecking
(
changeExecConfigReq
.
getChangeChecking
());
changeExecRecord
.
setChangeExecFinishTime
(
changeExecConfigReq
.
getChangeExecFinishTime
());
changeExecRecord
.
setChangeExecFinishDesc
(
changeExecConfigReq
.
getChangeExecFinishDesc
());
changeExecRecord
.
setCreateTime
(
DateUtils
.
getCurrentTime
());
changeExecRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
return
changeExecRecord
;
}
/**
* 构建执行记录(包含子流程信息)
*
* @param changeRecordId 主流程记录ID
* @param changeExecConfigReq 执行配置请求
* @param subFlowId 子流程ID
* @param subNodeId 子流程节点ID
* @return 执行记录
*/
private
ChangeExecRecord
buildChangeExecRecord
(
Long
changeRecordId
,
ChangeExecConfigReq
changeExecConfigReq
,
String
subFlowId
,
String
subNodeId
)
{
ChangeExecRecord
changeExecRecord
=
buildChangeExecRecord
(
changeRecordId
,
changeExecConfigReq
);
changeExecRecord
.
setSubFlowId
(
Long
.
parseLong
(
subFlowId
));
changeExecRecord
.
setSubFlowNode
(
subNodeId
);
return
changeExecRecord
;
}
/**
* 批量构建执行记录
*
* @param changeRecordId 主流程记录ID
* @param changeExecProject 行动项配置列表
* @return 执行记录列表
*/
private
List
<
ChangeExecRecord
>
buildChangeExecRecordList
(
Long
changeRecordId
,
List
<
ChangeExecConfigReq
>
changeExecProject
)
{
return
changeExecProject
.
stream
()
.
map
(
c
->
buildChangeExecRecord
(
changeRecordId
,
c
))
.
collect
(
Collectors
.
toList
());
private
List
<
ChangeExecRecord
>
buildChangeExecRecord
(
Long
changeRecordId
,
List
<
ChangeExecConfigReq
>
changeExecProject
)
{
return
changeExecProject
.
stream
().
map
(
c
->
{
ChangeExecRecord
changeExecRecord
=
new
ChangeExecRecord
();
changeExecRecord
.
setChangeRecordId
(
changeRecordId
);
changeExecRecord
.
setChangeExecDepartment
(
c
.
getChangeExecDepartment
());
changeExecRecord
.
setChangeExecUserType
(
c
.
getChangeExecUserType
());
changeExecRecord
.
setChangeExecUser
(
c
.
getChangeExecUser
());
changeExecRecord
.
setChangeExecUserEmail
(
c
.
getChangeExecUserEmail
());
changeExecRecord
.
setChangeRiskDesc
(
c
.
getChangeRiskDesc
());
changeExecRecord
.
setChangeExecProject
(
c
.
getChangeExecProject
());
changeExecRecord
.
setChangeChecking
(
c
.
getChangeChecking
());
changeExecRecord
.
setChangeExecFinishTime
(
c
.
getChangeExecFinishTime
());
changeExecRecord
.
setChangeExecFinishDesc
(
c
.
getChangeExecFinishDesc
());
changeExecRecord
.
setCreateTime
(
DateUtils
.
getCurrentTime
());
changeExecRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
return
changeExecRecord
;
}).
collect
(
Collectors
.
toList
());
}
/**
...
...
@@ -672,7 +659,7 @@ public class ChangeFlowBiz {
Integer
changeExecCount
=
changeFlowExecService
.
deleteByChangeRecordId
(
changeRecord
.
getId
());
log
.
debug
(
"[CHANGE_FLOW_SUBMIT] delete id:{}, changeExecCount:{}"
,
changeRecord
.
getId
(),
changeExecCount
);
// 保存变更行动方案记录
List
<
ChangeExecRecord
>
changeExecRecords
=
buildChangeExecRecord
List
(
changeRecord
.
getId
(),
List
<
ChangeExecRecord
>
changeExecRecords
=
buildChangeExecRecord
(
changeRecord
.
getId
(),
changeFlowSubmitReq
.
getChangeExecProjectList
());
changeExecRecords
.
forEach
(
exec
->
changeFlowExecService
.
saveRecord
(
exec
));
// 更新附件,覆盖操作,先删除,后插入
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/ChangeFlowExecService.java
View file @
6118f52a
...
...
@@ -9,7 +9,6 @@ package com.netease.mail.yanxuan.change.biz.service;
import
java.util.List
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeExecConfigReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO
;
/**
...
...
@@ -26,6 +25,13 @@ public interface ChangeFlowExecService {
List
<
ChangeFlowExecVO
>
getChangeFlowExecRecord
(
Long
changeRecordId
);
/**
* 查询行动项实体列表
* @param changeRecordId
* @return
*/
List
<
ChangeExecRecord
>
getChangeExecRecordList
(
Long
changeRecordId
);
/**
* 批量保存变更行动执行记录
* @param changeExecRecordList
*/
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/ChangeFlowExecServiceImpl.java
View file @
6118f52a
...
...
@@ -46,6 +46,11 @@ public class ChangeFlowExecServiceImpl implements ChangeFlowExecService {
}
@Override
public
List
<
ChangeExecRecord
>
getChangeExecRecordList
(
Long
changeRecordId
)
{
return
changeExecRecordMapper
.
selectByChangeRecordId
(
changeRecordId
);
}
@Override
public
void
batchSaveRecord
(
List
<
ChangeExecRecord
>
changeExecRecordList
)
{
changeExecRecordMapper
.
insertList
(
changeExecRecordList
);
}
...
...
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