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
5e45ca3d
Commit
5e45ca3d
authored
Dec 03, 2025
by
王志超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 子工单分批流转逻辑处理
parent
479f9a08
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
292 additions
and
1 deletions
+292
-1
ChangeFlowBiz.java
...om/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
+48
-0
ChangeSubFlowBiz.java
...netease/mail/yanxuan/change/biz/biz/ChangeSubFlowBiz.java
+0
-0
ChangeSubFlowFileService.java
.../yanxuan/change/biz/service/ChangeSubFlowFileService.java
+38
-0
ChangeSubFlowFileServiceImpl.java
...change/biz/service/impl/ChangeSubFlowFileServiceImpl.java
+47
-0
ChangeSubFlowFile.java
...ase/mail/yanxuan/change/dal/entity/ChangeSubFlowFile.java
+60
-0
ChangeSubFlowRecord.java
...e/mail/yanxuan/change/dal/entity/ChangeSubFlowRecord.java
+21
-0
ChangeSubFlowFileMapper.java
...il/yanxuan/change/dal/mapper/ChangeSubFlowFileMapper.java
+47
-0
ChangeSubFlowSubmitReq.java
...uan/change/dal/meta/model/req/ChangeSubFlowSubmitReq.java
+26
-0
ChangeSubFlowRecordMapper.xml
...in/resources/mybatis/mapper/ChangeSubFlowRecordMapper.xml
+5
-1
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeFlowBiz.java
View file @
5e45ca3d
...
@@ -721,6 +721,33 @@ public class ChangeFlowBiz {
...
@@ -721,6 +721,33 @@ public class ChangeFlowBiz {
log
.
info
(
"[NEW_CHANGE_FLOW_CONFIRM_EXEC_PLAN] 主工单流转成功,flowId:{}, nextNodeId:{}"
,
log
.
info
(
"[NEW_CHANGE_FLOW_CONFIRM_EXEC_PLAN] 主工单流转成功,flowId:{}, nextNodeId:{}"
,
flowId
,
ownerApproveNodeId
);
flowId
,
ownerApproveNodeId
);
return
ownerApproveNodeId
;
return
ownerApproveNodeId
;
case
NEW_CHANGE_FLOW_OWNER_APPROVE:
case
NEW_CHANGE_FLOW_ADMIN_APPROVE:
case
NEW_CHANGE_FLOW_QUALITY_APPROVE:
// 部门负责人、质量部负责人、变更管理员审批节点:检查所有子单是否都已审批通过
return
null
;
case
NEW_CHANGE_FLOW_EXE:
// todo:
// 这些节点检查所有子单是否都已完成(FINISHED或CANCELLED)
if
(!
checkAllSubFlowsFinishedForMainFlow
(
changeRecord
.
getId
()))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
BAD_REQUEST
,
"存在子单未完成,无法提交主工单"
);
}
// 所有子单都已完成,提交主工单到下一节点
String
mainFlowNextNodeId
=
flowService
.
submitFlow
(
flowId
.
toString
(),
flowDataDTO
,
uid
,
ChangeFlowEnum
.
NEW_CHANGE_FLOW
.
getTopoId
(),
JSON
.
toJSONString
(
content
),
true
,
FlowxOperationEnum
.
SUBMIT
.
getName
(),
"所有子单已完成,主工单流转"
,
changeRecord
.
getCreateTime
());
changeRecord
.
setFlowNode
(
mainFlowNextNodeId
);
changeRecord
.
setUpdateTime
(
DateUtils
.
getCurrentTime
());
changeFlowService
.
updateRecord
(
changeRecord
);
log
.
info
(
"[NEW_CHANGE_FLOW] 主工单流转成功,flowId:{}, node:{}, nextNodeId:{}"
,
flowId
,
node
,
mainFlowNextNodeId
);
return
mainFlowNextNodeId
;
case
NEW_CHANGE_FLOW_CONFIRM:
// todo:
return
null
;
case
CHANGE_FLOW_CONFIRM:
case
CHANGE_FLOW_CONFIRM:
Integer
changeResult
=
changeFlowSubmitReq
.
getChangeResult
();
Integer
changeResult
=
changeFlowSubmitReq
.
getChangeResult
();
ChangeResultEnum
changeResultStatus
=
ChangeResultEnum
.
getByStatus
(
changeResult
);
ChangeResultEnum
changeResultStatus
=
ChangeResultEnum
.
getByStatus
(
changeResult
);
...
@@ -1732,4 +1759,25 @@ public class ChangeFlowBiz {
...
@@ -1732,4 +1759,25 @@ public class ChangeFlowBiz {
);
);
}
}
/**
* 检查主工单下所有子单是否都已完成(供主工单流转时调用)
* 条件:status = FINISHED 或 CANCELLED
*
* @param changeRecordId 主工单ID
* @return true 表示所有子单都已完成
*/
public
boolean
checkAllSubFlowsFinishedForMainFlow
(
Long
changeRecordId
)
{
// 查询该主工单下所有子单
List
<
ChangeSubFlowRecord
>
allSubFlows
=
changeSubFlowRecordMapper
.
selectByChangeRecordId
(
changeRecordId
);
if
(
CollectionUtils
.
isEmpty
(
allSubFlows
))
{
return
false
;
}
// 检查是否所有子单都满足条件:状态是 FINISHED 或 CANCELLED
return
allSubFlows
.
stream
().
allMatch
(
subFlow
->
ChangeSubFlowStatusEnum
.
FINISHED
.
getStatus
().
equals
(
subFlow
.
getStatus
())
||
ChangeSubFlowStatusEnum
.
CANCELLED
.
getStatus
().
equals
(
subFlow
.
getStatus
())
);
}
}
}
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeSubFlowBiz.java
View file @
5e45ca3d
This diff is collapsed.
Click to expand it.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/ChangeSubFlowFileService.java
0 → 100644
View file @
5e45ca3d
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
;
import
java.util.List
;
import
com.netease.mail.yanxuan.change.common.enums.FileTypeEnum
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowFile
;
/**
* 子单文件服务
*/
public
interface
ChangeSubFlowFileService
{
/**
* 保存文件
*/
void
saveRecord
(
ChangeSubFlowFile
file
);
/**
* 批量保存文件
*/
void
batchSaveRecord
(
List
<
ChangeSubFlowFile
>
files
);
/**
* 根据子单记录ID查询文件列表
*/
List
<
ChangeSubFlowFile
>
getFileList
(
Long
subFlowRecordId
);
/**
* 根据子单记录ID删除文件
*/
Integer
deleteBySubFlowRecordId
(
Long
subFlowRecordId
);
/**
* 根据子单记录ID和文件类型删除文件
*/
void
deleteBySubFlowRecordIdAndType
(
Long
subFlowRecordId
,
FileTypeEnum
type
);
}
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/ChangeSubFlowFileServiceImpl.java
0 → 100644
View file @
5e45ca3d
package
com
.
netease
.
mail
.
yanxuan
.
change
.
biz
.
service
.
impl
;
import
java.util.List
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Service
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowFileService
;
import
com.netease.mail.yanxuan.change.common.enums.FileTypeEnum
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowFile
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowFileMapper
;
/**
* 子单文件服务实现
*/
@Service
public
class
ChangeSubFlowFileServiceImpl
implements
ChangeSubFlowFileService
{
@Autowired
private
ChangeSubFlowFileMapper
changeSubFlowFileMapper
;
@Override
public
void
saveRecord
(
ChangeSubFlowFile
file
)
{
changeSubFlowFileMapper
.
insertSelective
(
file
);
}
@Override
public
void
batchSaveRecord
(
List
<
ChangeSubFlowFile
>
files
)
{
changeSubFlowFileMapper
.
insertList
(
files
);
}
@Override
public
List
<
ChangeSubFlowFile
>
getFileList
(
Long
subFlowRecordId
)
{
return
changeSubFlowFileMapper
.
selectBySubFlowRecordId
(
subFlowRecordId
);
}
@Override
public
Integer
deleteBySubFlowRecordId
(
Long
subFlowRecordId
)
{
return
changeSubFlowFileMapper
.
deleteBySubFlowRecordId
(
subFlowRecordId
);
}
@Override
public
void
deleteBySubFlowRecordIdAndType
(
Long
subFlowRecordId
,
FileTypeEnum
type
)
{
changeSubFlowFileMapper
.
deleteBySubFlowRecordIdAndType
(
subFlowRecordId
,
type
.
getType
());
}
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/entity/ChangeSubFlowFile.java
0 → 100644
View file @
5e45ca3d
package
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
entity
;
import
javax.persistence.Entity
;
import
javax.persistence.GeneratedValue
;
import
javax.persistence.GenerationType
;
import
javax.persistence.Id
;
import
javax.persistence.Table
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* 子单文件实体
*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@Entity
@Table
(
name
=
"TB_YX_QC_CHANGE_SUB_FLOW_FILE"
)
public
class
ChangeSubFlowFile
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
private
Long
id
;
/**
* 子单记录ID
*/
private
Long
subFlowRecordId
;
/**
* 文件名
*/
private
String
fileName
;
/**
* 文件URL
*/
private
String
fileUrl
;
/**
* 文件类型
* @see com.netease.mail.yanxuan.change.common.enums.FileTypeEnum
*/
private
Integer
fileType
;
/**
* 创建时间
*/
private
Long
createTime
;
/**
* 更新时间
*/
private
Long
updateTime
;
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/entity/ChangeSubFlowRecord.java
View file @
5e45ca3d
...
@@ -89,6 +89,27 @@ public class ChangeSubFlowRecord {
...
@@ -89,6 +89,27 @@ public class ChangeSubFlowRecord {
private
String
rejectReason
;
private
String
rejectReason
;
/**
/**
* 变更结论(提交执行结果时填写)
* @see com.netease.mail.yanxuan.change.common.enums.ChangeResultEnum
*/
private
Integer
changeResult
;
/**
* 备注
*/
private
String
remark
;
/**
* 取消原因
*/
private
String
cancelReason
;
/**
* 变更确认结果时间(延期时使用)
*/
private
Long
changeConfirmResultTime
;
/**
* 创建时间
* 创建时间
*/
*/
private
Long
createTime
;
private
Long
createTime
;
...
...
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/mapper/ChangeSubFlowFileMapper.java
0 → 100644
View file @
5e45ca3d
package
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
mapper
;
import
java.util.List
;
import
org.apache.ibatis.annotations.Delete
;
import
org.apache.ibatis.annotations.Insert
;
import
org.apache.ibatis.annotations.Mapper
;
import
org.apache.ibatis.annotations.Param
;
import
org.apache.ibatis.annotations.Select
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowFile
;
/**
* 子单文件 Mapper
*/
@Mapper
public
interface
ChangeSubFlowFileMapper
extends
tk
.
mybatis
.
mapper
.
common
.
Mapper
<
ChangeSubFlowFile
>
{
/**
* 根据子单记录ID查询文件列表
*/
@Select
(
"SELECT * FROM TB_YX_QC_CHANGE_SUB_FLOW_FILE WHERE sub_flow_record_id = #{subFlowRecordId}"
)
List
<
ChangeSubFlowFile
>
selectBySubFlowRecordId
(
@Param
(
"subFlowRecordId"
)
Long
subFlowRecordId
);
/**
* 批量插入文件
*/
@Insert
({
"<script>"
,
"insert into TB_YX_QC_CHANGE_SUB_FLOW_FILE(sub_flow_record_id, file_type, file_name, file_url, create_time, update_time) values "
,
"<foreach collection='list' item='item' index='index' separator=','>"
,
"(#{item.subFlowRecordId}, #{item.fileType}, #{item.fileName}, #{item.fileUrl}, #{item.createTime}, #{item.updateTime})"
,
"</foreach>"
,
"</script>"
})
void
insertList
(
List
<
ChangeSubFlowFile
>
files
);
/**
* 根据子单记录ID删除文件
*/
@Delete
(
"delete from TB_YX_QC_CHANGE_SUB_FLOW_FILE where sub_flow_record_id = #{subFlowRecordId}"
)
Integer
deleteBySubFlowRecordId
(
@Param
(
"subFlowRecordId"
)
Long
subFlowRecordId
);
/**
* 根据子单记录ID和文件类型删除文件
*/
@Delete
(
"delete from TB_YX_QC_CHANGE_SUB_FLOW_FILE where sub_flow_record_id = #{subFlowRecordId} and file_type = #{type}"
)
void
deleteBySubFlowRecordIdAndType
(
@Param
(
"subFlowRecordId"
)
Long
subFlowRecordId
,
@Param
(
"type"
)
Integer
type
);
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/req/ChangeSubFlowSubmitReq.java
View file @
5e45ca3d
...
@@ -55,5 +55,31 @@ public class ChangeSubFlowSubmitReq {
...
@@ -55,5 +55,31 @@ public class ChangeSubFlowSubmitReq {
* 拒绝原因(审批不通过时必填)
* 拒绝原因(审批不通过时必填)
*/
*/
private
String
rejectReason
;
private
String
rejectReason
;
/**
* 变更结论(提交执行结果时使用)
* @see com.netease.mail.yanxuan.change.common.enums.ChangeResultEnum
*/
private
Integer
changeResult
;
/**
* 备注
*/
private
String
remark
;
/**
* 取消原因(变更结论为取消时必填)
*/
private
String
cancelReason
;
/**
* 变更确认结果时间(延期时必填)
*/
private
Long
changeConfirmResultTime
;
/**
* 变更结果文件列表
*/
private
List
<
ChangeFlowFile
>
changeResultFiles
;
}
}
yanxuan-qc-change-system-dal/src/main/resources/mybatis/mapper/ChangeSubFlowRecordMapper.xml
View file @
5e45ca3d
...
@@ -13,12 +13,16 @@
...
@@ -13,12 +13,16 @@
<result
column=
"change_commander"
jdbcType=
"VARCHAR"
property=
"changeCommander"
/>
<result
column=
"change_commander"
jdbcType=
"VARCHAR"
property=
"changeCommander"
/>
<result
column=
"change_plan_approved"
jdbcType=
"TINYINT"
property=
"changePlanApproved"
/>
<result
column=
"change_plan_approved"
jdbcType=
"TINYINT"
property=
"changePlanApproved"
/>
<result
column=
"reject_reason"
jdbcType=
"VARCHAR"
property=
"rejectReason"
/>
<result
column=
"reject_reason"
jdbcType=
"VARCHAR"
property=
"rejectReason"
/>
<result
column=
"change_result"
jdbcType=
"INTEGER"
property=
"changeResult"
/>
<result
column=
"remark"
jdbcType=
"VARCHAR"
property=
"remark"
/>
<result
column=
"cancel_reason"
jdbcType=
"VARCHAR"
property=
"cancelReason"
/>
<result
column=
"change_confirm_result_time"
jdbcType=
"BIGINT"
property=
"changeConfirmResultTime"
/>
<result
column=
"create_time"
jdbcType=
"BIGINT"
property=
"createTime"
/>
<result
column=
"create_time"
jdbcType=
"BIGINT"
property=
"createTime"
/>
<result
column=
"update_time"
jdbcType=
"BIGINT"
property=
"updateTime"
/>
<result
column=
"update_time"
jdbcType=
"BIGINT"
property=
"updateTime"
/>
</resultMap>
</resultMap>
<sql
id=
"Base_Column_List"
>
<sql
id=
"Base_Column_List"
>
id, change_record_id, sub_flow_id, sub_flow_node, status, approver, change_exec_user_email, change_exec_department, change_commander, change_plan_approved, reject_reason, create_time, update_time
id, change_record_id, sub_flow_id, sub_flow_node, status, approver, change_exec_user_email, change_exec_department, change_commander, change_plan_approved, reject_reason, c
hange_result, remark, cancel_reason, change_confirm_result_time, c
reate_time, update_time
</sql>
</sql>
<select
id=
"selectByCondition"
resultMap=
"BaseResultMap"
parameterType=
"com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq"
>
<select
id=
"selectByCondition"
resultMap=
"BaseResultMap"
parameterType=
"com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq"
>
...
...
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