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
f2eaa556
Commit
f2eaa556
authored
Nov 26, 2025
by
王志超
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
feat: 变更行动工单列表
parent
c2113b8c
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
706 additions
and
5 deletions
+706
-5
ChangeSubFlowBiz.java
...netease/mail/yanxuan/change/biz/biz/ChangeSubFlowBiz.java
+399
-5
ChangeSubFlowService.java
...mail/yanxuan/change/biz/service/ChangeSubFlowService.java
+3
-0
ChangeSubFlowServiceImpl.java
...uan/change/biz/service/impl/ChangeSubFlowServiceImpl.java
+3
-0
ChangeSubFlowRecordMapper.java
.../yanxuan/change/dal/mapper/ChangeSubFlowRecordMapper.java
+7
-0
ChangeSubFlowListQueryReq.java
.../change/dal/meta/model/req/ChangeSubFlowListQueryReq.java
+83
-0
ChangeSubFlowListVO.java
...yanxuan/change/dal/meta/model/vo/ChangeSubFlowListVO.java
+38
-0
ChangeSubFlowVO.java
...ail/yanxuan/change/dal/meta/model/vo/ChangeSubFlowVO.java
+70
-0
ChangeSubFlowRecordMapper.xml
...in/resources/mybatis/mapper/ChangeSubFlowRecordMapper.xml
+44
-0
ChangeSubFlowController.java
...anxuan/change/web/controller/ChangeSubFlowController.java
+59
-0
No files found.
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/biz/ChangeSubFlowBiz.java
View file @
f2eaa556
...
...
@@ -3,8 +3,12 @@ package com.netease.mail.yanxuan.change.biz.biz;
import
com.alibaba.fastjson.JSON
;
import
com.netease.mail.yanxuan.change.biz.meta.exception.ExceptionFactory
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowExecService
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeFlowService
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowRecordService
;
import
com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.FlowService
;
import
com.netease.mail.yanxuan.change.biz.service.rpc.IusService
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.IusRpcService
;
import
com.netease.mail.yanxuan.change.common.bean.CommonConstants
;
import
com.netease.mail.yanxuan.change.common.bean.RequestLocalBean
;
import
com.netease.mail.yanxuan.change.common.bean.ResponseCode
;
...
...
@@ -13,22 +17,32 @@ import com.netease.mail.yanxuan.change.common.enums.FlowOperationTypeEnum;
import
com.netease.mail.yanxuan.change.common.enums.FlowxOperationEnum
;
import
com.netease.mail.yanxuan.change.common.util.DateUtils
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeRecord
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord
;
import
com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowSubmitReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowExecVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeSubFlowListVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeSubFlowVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.PageVO
;
import
com.netease.mail.yanxuan.change.integration.flow.UserQueryDTO
;
import
com.netease.mail.yanxuan.change.integration.flow.ius.rsp.IusUserInfoRsp
;
import
com.netease.yanxuan.flowx.sdk.meta.controller.communal.AjaxResponse
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.base.FlowDataDTO
;
import
com.netease.yanxuan.flowx.sdk.meta.dto.flow.FlowCreateReqDTO
;
import
lombok.extern.slf4j.Slf4j
;
import
org.apache.commons.collections4.CollectionUtils
;
import
org.apache.commons.lang3.StringUtils
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.stereotype.Component
;
import
org.springframework.util.Assert
;
import
javax.validation.Valid
;
import
java.util.Collections
;
import
java.util.HashMap
;
import
java.util.List
;
import
java.util.Map
;
import
java.util.UUID
;
import
java.util.*
;
import
java.util.stream.Collectors
;
@Component
@Slf4j
...
...
@@ -43,6 +57,24 @@ public class ChangeSubFlowBiz {
@Autowired
private
ChangeFlowExecService
changeFlowExecService
;
@Autowired
private
ChangeFlowService
changeFlowService
;
@Autowired
private
ChangeSubFlowRecordService
changeSubFlowRecordService
;
@Autowired
private
ChangeSubFlowRecordMapper
changeSubFlowRecordMapper
;
@Autowired
private
ChangeFlowBiz
changeFlowBiz
;
@Autowired
private
IusRpcService
iusRpcService
;
@Autowired
private
IusService
iusService
;
public
String
createAndSubmit
(
@Valid
ChangeSubFlowCreateReq
changeSubFlowCreateReq
)
{
String
uid
=
RequestLocalBean
.
getUid
();
...
...
@@ -203,4 +235,366 @@ public class ChangeSubFlowBiz {
String
.
format
(
"当前节点[%s]与预期节点[%s]不匹配"
,
currentNode
,
expectedNodes
));
}
}
/**
* 根据变更行动工单ID查询详情
* 说明:展示内容和主单的detail一样,但行动项只展示该变更行动工单下绑定的行动项
*
* @param subFlowId 变更行动工单ID(即topo)
* @return 变更工单详情
*/
public
ChangeFlowVO
detailBySubFlowId
(
String
subFlowId
)
{
if
(
StringUtils
.
isBlank
(
subFlowId
))
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
ERROR_FLOW_ID
,
"变更行动工单ID不能为空"
);
}
// 根据 subFlowId 查询变更行动工单记录
ChangeSubFlowRecord
subFlowRecord
=
changeSubFlowRecordService
.
getBySubFlowId
(
subFlowId
);
if
(
subFlowRecord
==
null
)
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
ERROR_FLOW_ID
,
"变更行动工单不存在"
);
}
Long
changeRecordId
=
subFlowRecord
.
getChangeRecordId
();
Long
subFlowRecordId
=
subFlowRecord
.
getId
();
// 获取主单信息
ChangeRecord
changeRecord
=
changeFlowService
.
getById
(
changeRecordId
);
if
(
changeRecord
==
null
)
{
throw
ExceptionFactory
.
createBiz
(
ResponseCode
.
ERROR_FLOW_ID
,
"主单记录不存在"
);
}
// 调用主单的 detail 方法获取完整信息
ChangeFlowVO
changeFlowVO
=
changeFlowBiz
.
detail
(
changeRecord
.
getFlowId
());
// 只保留该变更行动工单下绑定的行动项
List
<
ChangeExecRecord
>
execRecords
=
changeFlowExecService
.
getBySubFlowRecordId
(
subFlowRecordId
);
if
(
CollectionUtils
.
isNotEmpty
(
execRecords
))
{
// 转换为 ChangeFlowExecVO
List
<
ChangeFlowExecVO
>
filteredExecList
=
execRecords
.
stream
()
.
map
(
c
->
ChangeFlowExecVO
.
builder
()
.
changeExecId
(
c
.
getId
())
.
changeRecordId
(
c
.
getChangeRecordId
())
.
changeExecDepartment
(
c
.
getChangeExecDepartment
())
.
changeExecUserType
(
c
.
getChangeExecUserType
())
.
changeExecUser
(
c
.
getChangeExecUser
())
.
changeExecUserEmail
(
c
.
getChangeExecUserEmail
())
.
changeRiskDesc
(
c
.
getChangeRiskDesc
())
.
changeExecProject
(
c
.
getChangeExecProject
())
.
changeChecking
(
c
.
getChangeChecking
())
.
changeExecFinishTime
(
c
.
getChangeExecFinishTime
())
.
changeExecFinishDesc
(
c
.
getChangeExecFinishDesc
())
.
subFlowId
(
c
.
getSubFlowId
())
.
subFlowNode
(
c
.
getSubFlowNode
())
.
build
())
.
collect
(
Collectors
.
toList
());
// 填充用户名信息
try
{
Set
<
String
>
userEmail
=
filteredExecList
.
stream
()
.
map
(
ChangeFlowExecVO:
:
getChangeExecUserEmail
)
.
collect
(
Collectors
.
toSet
());
AjaxResponse
<
List
<
IusUserInfoRsp
>>
userListInfo
=
iusRpcService
.
queryUserListInfo
(
UserQueryDTO
.
builder
().
uids
(
new
ArrayList
<>(
userEmail
)).
build
());
List
<
IusUserInfoRsp
>
data
=
userListInfo
.
getData
();
filteredExecList
.
forEach
(
i
->
{
Optional
<
IusUserInfoRsp
>
anyExeUser
=
data
.
stream
()
.
filter
(
u
->
u
.
getUid
().
equals
(
i
.
getChangeExecUserEmail
()))
.
findAny
();
if
(
anyExeUser
.
isPresent
())
{
i
.
setChangeExecUserName
(
anyExeUser
.
get
().
getName
());
}
else
{
// 批量查询没查到的人名,通过全量查询单独再查一次
IusUserInfoRsp
user
=
iusService
.
queryUserInfo
(
i
.
getChangeExecUserEmail
());
if
(
user
!=
null
&&
StringUtils
.
isNotBlank
(
user
.
getName
()))
{
i
.
setChangeExecUserName
(
user
.
getName
());
}
}
});
}
catch
(
Exception
ex
)
{
log
.
error
(
"query user info has ex"
,
ex
);
}
changeFlowVO
.
setChangeExecProjectList
(
filteredExecList
);
}
else
{
changeFlowVO
.
setChangeExecProjectList
(
new
ArrayList
<>());
}
return
changeFlowVO
;
}
/**
* 查询变更行动工单列表
*
* @param page 页码
* @param pageSize 每页大小
* @param queryReq 查询条件
* @return 变更行动工单列表
*/
public
ChangeSubFlowListVO
querySubFlowList
(
Integer
page
,
Integer
pageSize
,
ChangeSubFlowListQueryReq
queryReq
)
{
log
.
info
(
"[querySubFlowList] page:{}, pageSize:{}, queryReq:{}"
,
page
,
pageSize
,
JSON
.
toJSONString
(
queryReq
));
// 数据可见范围:仅查看我跟进的工单(默认true)
final
String
currentUser
;
if
(
queryReq
.
getOnlyMyFollowed
())
{
String
uid
=
RequestLocalBean
.
getUid
();
if
(
StringUtils
.
isNotBlank
(
uid
))
{
currentUser
=
uid
;
queryReq
.
setCurrentUser
(
currentUser
);
log
.
info
(
"[querySubFlowList] 数据可见范围:仅查看我跟进的工单, currentUser:{}"
,
currentUser
);
}
else
{
currentUser
=
null
;
}
}
else
{
currentUser
=
null
;
}
// 先查询所有符合条件的变更行动工单(不进行分页,因为需要在内存中过滤)
List
<
ChangeSubFlowRecord
>
allSubFlowRecords
=
changeSubFlowRecordMapper
.
selectByCondition
(
queryReq
);
if
(
CollectionUtils
.
isEmpty
(
allSubFlowRecords
))
{
PageVO
pageVO
=
buildPageVo
(
0L
,
pageSize
,
page
);
ChangeSubFlowListVO
result
=
new
ChangeSubFlowListVO
();
result
.
setPageVo
(
pageVO
);
result
.
setChangeSubFlowList
(
new
ArrayList
<>());
return
result
;
}
// 批量获取主单信息
List
<
Long
>
changeRecordIds
=
allSubFlowRecords
.
stream
()
.
map
(
ChangeSubFlowRecord:
:
getChangeRecordId
)
.
distinct
()
.
collect
(
Collectors
.
toList
());
final
Map
<
Long
,
ChangeRecord
>
changeRecordMap
;
if
(
CollectionUtils
.
isNotEmpty
(
changeRecordIds
))
{
List
<
ChangeRecord
>
changeRecords
=
changeRecordIds
.
stream
()
.
map
(
changeFlowService:
:
getById
)
.
filter
(
Objects:
:
nonNull
)
.
collect
(
Collectors
.
toList
());
changeRecordMap
=
changeRecords
.
stream
()
.
collect
(
Collectors
.
toMap
(
ChangeRecord:
:
getId
,
r
->
r
));
}
else
{
changeRecordMap
=
new
HashMap
<>();
}
// 批量获取行动项信息(用于获取行动人、部门、完成时间等)
List
<
Long
>
subFlowRecordIds
=
allSubFlowRecords
.
stream
()
.
map
(
ChangeSubFlowRecord:
:
getId
)
.
collect
(
Collectors
.
toList
());
Map
<
Long
,
List
<
ChangeExecRecord
>>
execRecordMap
=
new
HashMap
<>();
if
(
CollectionUtils
.
isNotEmpty
(
subFlowRecordIds
))
{
for
(
Long
subFlowRecordId
:
subFlowRecordIds
)
{
List
<
ChangeExecRecord
>
execRecords
=
changeFlowExecService
.
getBySubFlowRecordId
(
subFlowRecordId
);
if
(
CollectionUtils
.
isNotEmpty
(
execRecords
))
{
execRecordMap
.
put
(
subFlowRecordId
,
execRecords
);
}
}
}
// 在内存中过滤
List
<
ChangeSubFlowRecord
>
filteredSubFlowRecords
=
allSubFlowRecords
.
stream
()
.
filter
(
subFlowRecord
->
{
// 过滤 flowId
if
(
queryReq
.
getFlowId
()
!=
null
)
{
ChangeRecord
changeRecord
=
changeRecordMap
.
get
(
subFlowRecord
.
getChangeRecordId
());
if
(
changeRecord
==
null
||
!
queryReq
.
getFlowId
().
equals
(
changeRecord
.
getFlowId
()))
{
return
false
;
}
}
// 过滤 itemId
if
(
StringUtils
.
isNotBlank
(
queryReq
.
getItemId
()))
{
ChangeRecord
changeRecord
=
changeRecordMap
.
get
(
subFlowRecord
.
getChangeRecordId
());
if
(
changeRecord
==
null
||
StringUtils
.
isBlank
(
changeRecord
.
getChangeItem
())
||
!
changeRecord
.
getChangeItem
().
contains
(
queryReq
.
getItemId
()))
{
return
false
;
}
}
// 过滤 supplier
if
(
StringUtils
.
isNotBlank
(
queryReq
.
getSupplier
()))
{
ChangeRecord
changeRecord
=
changeRecordMap
.
get
(
subFlowRecord
.
getChangeRecordId
());
if
(
changeRecord
==
null
||
!
queryReq
.
getSupplier
().
equals
(
changeRecord
.
getChangeSupplier
()))
{
return
false
;
}
}
// 过滤 changeExecUser
if
(
StringUtils
.
isNotBlank
(
queryReq
.
getChangeExecUser
()))
{
List
<
ChangeExecRecord
>
execRecords
=
execRecordMap
.
get
(
subFlowRecord
.
getId
());
if
(
CollectionUtils
.
isEmpty
(
execRecords
))
{
return
false
;
}
boolean
matched
=
execRecords
.
stream
().
anyMatch
(
exec
->
(
StringUtils
.
isNotBlank
(
exec
.
getChangeExecUserEmail
())
&&
exec
.
getChangeExecUserEmail
().
contains
(
queryReq
.
getChangeExecUser
()))
||
(
StringUtils
.
isNotBlank
(
exec
.
getChangeExecUser
())
&&
exec
.
getChangeExecUser
().
contains
(
queryReq
.
getChangeExecUser
())));
if
(!
matched
)
{
return
false
;
}
}
// 过滤 changeExecDepartment
if
(
StringUtils
.
isNotBlank
(
queryReq
.
getChangeExecDepartment
()))
{
List
<
ChangeExecRecord
>
execRecords
=
execRecordMap
.
get
(
subFlowRecord
.
getId
());
if
(
CollectionUtils
.
isEmpty
(
execRecords
))
{
return
false
;
}
boolean
matched
=
execRecords
.
stream
().
anyMatch
(
exec
->
queryReq
.
getChangeExecDepartment
().
equals
(
exec
.
getChangeExecDepartment
()));
if
(!
matched
)
{
return
false
;
}
}
// 过滤 onlyMyFollowed
if
(
queryReq
.
getOnlyMyFollowed
()
&&
currentUser
!=
null
&&
StringUtils
.
isNotBlank
(
currentUser
))
{
ChangeRecord
changeRecord
=
changeRecordMap
.
get
(
subFlowRecord
.
getChangeRecordId
());
boolean
matched
=
false
;
// 检查主单的 creator, changeCommander, approver
if
(
changeRecord
!=
null
)
{
if
(
currentUser
.
equals
(
changeRecord
.
getCreator
())
||
currentUser
.
equals
(
changeRecord
.
getChangeCommander
()))
{
matched
=
true
;
}
else
if
(
StringUtils
.
isNotBlank
(
changeRecord
.
getApprover
())
&&
changeRecord
.
getApprover
().
contains
(
"\""
+
currentUser
+
"\""
))
{
matched
=
true
;
}
}
// 检查行动工单的 approver
if
(!
matched
&&
StringUtils
.
isNotBlank
(
subFlowRecord
.
getApprover
())
&&
subFlowRecord
.
getApprover
().
contains
(
"\""
+
currentUser
+
"\""
))
{
matched
=
true
;
}
// 检查行动项的 changeExecUserEmail
if
(!
matched
)
{
List
<
ChangeExecRecord
>
execRecords
=
execRecordMap
.
get
(
subFlowRecord
.
getId
());
if
(
CollectionUtils
.
isNotEmpty
(
execRecords
))
{
matched
=
execRecords
.
stream
().
anyMatch
(
exec
->
currentUser
.
equals
(
exec
.
getChangeExecUserEmail
()));
}
}
if
(!
matched
)
{
return
false
;
}
}
return
true
;
})
.
collect
(
Collectors
.
toList
());
// 手动分页
long
total
=
filteredSubFlowRecords
.
size
();
int
start
=
(
page
-
1
)
*
pageSize
;
int
end
=
Math
.
min
(
start
+
pageSize
,
filteredSubFlowRecords
.
size
());
List
<
ChangeSubFlowRecord
>
pagedSubFlowRecords
=
start
<
end
?
filteredSubFlowRecords
.
subList
(
start
,
end
)
:
new
ArrayList
<>();
List
<
ChangeSubFlowVO
>
list
=
new
ArrayList
<>();
if
(
CollectionUtils
.
isNotEmpty
(
pagedSubFlowRecords
))
{
// 构建返回列表
for
(
ChangeSubFlowRecord
subFlowRecord
:
pagedSubFlowRecords
)
{
ChangeSubFlowVO
vo
=
new
ChangeSubFlowVO
();
vo
.
setSubFlowId
(
subFlowRecord
.
getSubFlowId
());
vo
.
setSubFlowNode
(
subFlowRecord
.
getSubFlowNode
());
vo
.
setCreateTime
(
subFlowRecord
.
getCreateTime
());
// 获取主单信息
ChangeRecord
changeRecord
=
changeRecordMap
.
get
(
subFlowRecord
.
getChangeRecordId
());
if
(
changeRecord
!=
null
)
{
vo
.
setFlowId
(
changeRecord
.
getFlowId
());
}
// 获取行动项信息(取第一个行动项的信息作为展示)
List
<
ChangeExecRecord
>
execRecords
=
execRecordMap
.
get
(
subFlowRecord
.
getId
());
if
(
CollectionUtils
.
isNotEmpty
(
execRecords
))
{
ChangeExecRecord
firstExec
=
execRecords
.
get
(
0
);
vo
.
setChangeExecUserEmail
(
firstExec
.
getChangeExecUserEmail
());
vo
.
setChangeExecDepartment
(
firstExec
.
getChangeExecDepartment
());
// 完成时间:如果有完成时间则使用,否则使用预期完成时间(从主单获取)
if
(
firstExec
.
getChangeExecFinishTime
()
!=
null
)
{
vo
.
setChangeExecFinishTime
(
firstExec
.
getChangeExecFinishTime
());
}
else
if
(
changeRecord
!=
null
)
{
vo
.
setChangeExecFinishTime
(
changeRecord
.
getChangeConfirmResultTime
());
}
}
list
.
add
(
vo
);
}
// 批量查询用户名信息
try
{
Set
<
String
>
userEmails
=
list
.
stream
()
.
map
(
ChangeSubFlowVO:
:
getChangeExecUserEmail
)
.
filter
(
StringUtils:
:
isNotBlank
)
.
collect
(
Collectors
.
toSet
());
if
(
CollectionUtils
.
isNotEmpty
(
userEmails
))
{
AjaxResponse
<
List
<
IusUserInfoRsp
>>
userListInfo
=
iusRpcService
.
queryUserListInfo
(
UserQueryDTO
.
builder
().
uids
(
new
ArrayList
<>(
userEmails
)).
build
());
List
<
IusUserInfoRsp
>
userData
=
userListInfo
.
getData
();
Map
<
String
,
String
>
userNameMap
=
new
HashMap
<>();
if
(
CollectionUtils
.
isNotEmpty
(
userData
))
{
userNameMap
=
userData
.
stream
()
.
collect
(
Collectors
.
toMap
(
IusUserInfoRsp:
:
getUid
,
IusUserInfoRsp:
:
getName
));
}
// 填充用户名和展示信息
for
(
ChangeSubFlowVO
vo
:
list
)
{
String
email
=
vo
.
getChangeExecUserEmail
();
if
(
StringUtils
.
isNotBlank
(
email
))
{
String
name
=
userNameMap
.
get
(
email
);
if
(
StringUtils
.
isBlank
(
name
))
{
// 批量查询没查到的人名,通过全量查询单独再查一次
IusUserInfoRsp
user
=
iusService
.
queryUserInfo
(
email
);
if
(
user
!=
null
&&
StringUtils
.
isNotBlank
(
user
.
getName
()))
{
name
=
user
.
getName
();
}
}
vo
.
setChangeExecUserName
(
name
);
// 构建展示信息:姓名+邮箱
if
(
StringUtils
.
isNotBlank
(
name
))
{
vo
.
setChangeExecUserView
(
name
+
"("
+
email
+
")"
);
}
else
{
vo
.
setChangeExecUserView
(
email
);
}
}
}
}
}
catch
(
Exception
ex
)
{
log
.
error
(
"query user info has ex"
,
ex
);
}
}
PageVO
pageVO
=
buildPageVo
(
total
,
pageSize
,
page
);
ChangeSubFlowListVO
result
=
new
ChangeSubFlowListVO
();
result
.
setPageVo
(
pageVO
);
result
.
setChangeSubFlowList
(
list
);
return
result
;
}
/**
* 构建分页信息
*
* @param total 总记录数
* @param pageSize 每页大小
* @param page 当前页码
* @return 分页信息
*/
private
PageVO
buildPageVo
(
Long
total
,
Integer
pageSize
,
Integer
page
)
{
Integer
totalCount
=
Math
.
toIntExact
(
total
);
int
totalPage
;
int
i
=
totalCount
%
pageSize
;
if
(
i
!=
0
)
{
totalPage
=
totalCount
/
pageSize
+
1
;
}
else
{
totalPage
=
totalCount
/
pageSize
;
}
return
PageVO
.
builder
().
page
(
page
).
totalPage
(
totalPage
).
pageSize
(
pageSize
).
pageCount
(
pageSize
)
.
totalCount
(
totalCount
).
build
();
}
}
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/ChangeSubFlowService.java
View file @
f2eaa556
...
...
@@ -4,6 +4,9 @@ import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import
java.util.List
;
/**
* @author TmindA
*/
public
interface
ChangeSubFlowService
{
/**
...
...
yanxuan-qc-change-system-biz/src/main/java/com/netease/mail/yanxuan/change/biz/service/impl/ChangeSubFlowServiceImpl.java
View file @
f2eaa556
...
...
@@ -8,6 +8,9 @@ import org.springframework.stereotype.Service;
import
java.util.List
;
/**
* @author TmindA
*/
@Service
public
class
ChangeSubFlowServiceImpl
implements
ChangeSubFlowService
{
...
...
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/mapper/ChangeSubFlowRecordMapper.java
View file @
f2eaa556
...
...
@@ -51,5 +51,12 @@ public interface ChangeSubFlowRecordMapper extends tk.mybatis.mapper.common.Mapp
"</script>"
)
List
<
ChangeSubFlowRecord
>
selectByChangeRecordIds
(
@Param
(
"changeRecordIds"
)
List
<
Long
>
changeRecordIds
);
/**
* 根据条件查询变更行动工单列表
* @param queryReq 查询条件
* @return 变更行动工单列表
*/
List
<
ChangeSubFlowRecord
>
selectByCondition
(
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
meta
.
model
.
req
.
ChangeSubFlowListQueryReq
queryReq
);
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/req/ChangeSubFlowListQueryReq.java
0 → 100644
View file @
f2eaa556
/**
* @(#)ChangeSubFlowListQueryReq.java, 2024/01/01.
* <p/>
* Copyright 2024 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
meta
.
model
.
req
;
import
lombok.Data
;
import
java.util.List
;
/**
* 变更行动工单列表查询请求
*
* @Author system
* @Date 2024/01/01
*/
@Data
public
class
ChangeSubFlowListQueryReq
{
/**
* 变更工单ID(主单flowId)
*/
private
Long
flowId
;
/**
* 变更行动工单ID(subFlowId)
*/
private
String
subFlowId
;
/**
* 商品ID
*/
private
String
itemId
;
/**
* 供应商
*/
private
String
supplier
;
/**
* 变更行动人(姓名或邮箱)
*/
private
String
changeExecUser
;
/**
* 变更行动部门
*/
private
String
changeExecDepartment
;
/**
* 行动工单状态(subFlowNode)
*/
private
String
subFlowNode
;
/**
* 开始时间(行动工单发起时间)
*/
private
Long
startTime
;
/**
* 结束时间(行动工单发起时间)
*/
private
Long
endTime
;
/**
* 数据可见范围:仅查看我跟进的工单(默认true)
* true: 仅展示当前用户相关的变更行动工单
* false: 展示所有变更行动工单
*/
private
Boolean
onlyMyFollowed
;
/**
* 当前用户邮箱(用于数据可见范围过滤)
*/
private
String
currentUser
;
/**
* 变更记录ID列表(用于过滤)
*/
private
List
<
Long
>
changeRecordIds
;
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/vo/ChangeSubFlowListVO.java
0 → 100644
View file @
f2eaa556
/**
* @(#)ChangeSubFlowListVO.java, 2024/01/01.
* <p/>
* Copyright 2024 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
meta
.
model
.
vo
;
import
java.util.List
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* 变更行动工单列表VO
*
* @Author system
* @Date 2024/01/01
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public
class
ChangeSubFlowListVO
{
/**
* 分页信息
*/
private
PageVO
pageVo
;
/**
* 变更行动工单列表
*/
private
List
<
ChangeSubFlowVO
>
changeSubFlowList
;
}
yanxuan-qc-change-system-dal/src/main/java/com/netease/mail/yanxuan/change/dal/meta/model/vo/ChangeSubFlowVO.java
0 → 100644
View file @
f2eaa556
/**
* @(#)ChangeSubFlowVO.java, 2024/01/01.
* <p/>
* Copyright 2024 Netease, Inc. All rights reserved.
* NETEASE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
*/
package
com
.
netease
.
mail
.
yanxuan
.
change
.
dal
.
meta
.
model
.
vo
;
import
lombok.AllArgsConstructor
;
import
lombok.Builder
;
import
lombok.Data
;
import
lombok.NoArgsConstructor
;
/**
* 变更行动工单VO
*
* @Author system
* @Date 2024/01/01
*/
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Data
public
class
ChangeSubFlowVO
{
/**
* 变更行动ID(subFlowId)
*/
private
String
subFlowId
;
/**
* 变更ID(主单的flowId)
*/
private
Long
flowId
;
/**
* 变更行动人邮箱
*/
private
String
changeExecUserEmail
;
/**
* 变更行动人姓名
*/
private
String
changeExecUserName
;
/**
* 变更行动人(姓名+邮箱)
*/
private
String
changeExecUserView
;
/**
* 变更行动部门
*/
private
String
changeExecDepartment
;
/**
* 行动工单状态(subFlowNode)
*/
private
String
subFlowNode
;
/**
* 行动完成时间(变更行动工单的完成时间,或预期完成时间)
*/
private
Long
changeExecFinishTime
;
/**
* 创建时间(行动工单发起时间)
*/
private
Long
createTime
;
}
yanxuan-qc-change-system-dal/src/main/resources/mybatis/mapper/ChangeSubFlowRecordMapper.xml
0 → 100644
View file @
f2eaa556
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace=
"com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper"
>
<resultMap
id=
"BaseResultMap"
type=
"com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord"
>
<id
column=
"id"
jdbcType=
"BIGINT"
property=
"id"
/>
<result
column=
"change_record_id"
jdbcType=
"BIGINT"
property=
"changeRecordId"
/>
<result
column=
"sub_flow_id"
jdbcType=
"VARCHAR"
property=
"subFlowId"
/>
<result
column=
"sub_flow_node"
jdbcType=
"VARCHAR"
property=
"subFlowNode"
/>
<result
column=
"approver"
jdbcType=
"VARCHAR"
property=
"approver"
/>
<result
column=
"create_time"
jdbcType=
"BIGINT"
property=
"createTime"
/>
<result
column=
"update_time"
jdbcType=
"BIGINT"
property=
"updateTime"
/>
</resultMap>
<sql
id=
"Base_Column_List"
>
id, change_record_id, sub_flow_id, sub_flow_node, approver, create_time, update_time
</sql>
<select
id=
"selectByCondition"
resultMap=
"BaseResultMap"
parameterType=
"com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq"
>
SELECT
<include
refid=
"Base_Column_List"
/>
FROM TB_YX_QC_CHANGE_SUB_FLOW_RECORD
<where>
<if
test=
"subFlowId != null and subFlowId != ''"
>
and sub_flow_id = #{subFlowId}
</if>
<if
test=
"subFlowNode != null and subFlowNode != ''"
>
and sub_flow_node = #{subFlowNode}
</if>
<if
test=
"startTime != null"
>
and create_time >= #{startTime}
</if>
<if
test=
"endTime != null"
>
and create_time
<![CDATA[ <= ]]>
#{endTime}
</if>
<if
test=
"changeRecordIds != null and changeRecordIds.size() > 0"
>
and change_record_id in
<foreach
collection=
"changeRecordIds"
close=
")"
open=
"("
item=
"item"
separator=
","
>
#{item}
</foreach>
</if>
</where>
order by create_time desc
</select>
</mapper>
yanxuan-qc-change-system-web/src/main/java/com/netease/mail/yanxuan/change/web/controller/ChangeSubFlowController.java
View file @
f2eaa556
...
...
@@ -10,7 +10,10 @@ import com.netease.mail.yanxuan.change.biz.biz.ChangeSubFlowBiz;
import
com.netease.mail.yanxuan.change.common.bean.AjaxResult
;
import
com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowCreateReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowListQueryReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.req.ChangeSubFlowSubmitReq
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeFlowVO
;
import
com.netease.mail.yanxuan.change.dal.meta.model.vo.ChangeSubFlowListVO
;
import
lombok.extern.slf4j.Slf4j
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.web.bind.annotation.*
;
...
...
@@ -52,6 +55,62 @@ public class ChangeSubFlowController {
}
/**
* 变更行动工单列表查询
*
* @param page 页码
* @param pageSize 每页大小
* @param flowId 变更工单ID(主单flowId)
* @param subFlowId 变更行动工单ID
* @param itemId 商品ID
* @param supplier 供应商
* @param changeExecUser 变更行动人(姓名或邮箱)
* @param changeExecDepartment 变更行动部门
* @param subFlowNode 行动工单状态
* @param startTime 开始时间(行动工单发起时间)
* @param endTime 结束时间(行动工单发起时间)
* @param onlyMyFollowed 数据可见范围:仅查看我跟进的工单(默认true)
* @return 变更行动工单列表
*/
@GetMapping
(
"/page"
)
public
AjaxResult
<
ChangeSubFlowListVO
>
page
(
@RequestParam
(
name
=
"page"
,
defaultValue
=
"1"
)
Integer
page
,
@RequestParam
(
name
=
"pageSize"
,
defaultValue
=
"10"
)
Integer
pageSize
,
@RequestParam
(
name
=
"flowId"
,
required
=
false
)
Long
flowId
,
@RequestParam
(
name
=
"subFlowId"
,
required
=
false
)
String
subFlowId
,
@RequestParam
(
name
=
"itemId"
,
required
=
false
)
String
itemId
,
@RequestParam
(
name
=
"supplier"
,
required
=
false
)
String
supplier
,
@RequestParam
(
name
=
"changeExecUser"
,
required
=
false
)
String
changeExecUser
,
@RequestParam
(
name
=
"changeExecDepartment"
,
required
=
false
)
String
changeExecDepartment
,
@RequestParam
(
name
=
"subFlowNode"
,
required
=
false
)
String
subFlowNode
,
@RequestParam
(
name
=
"startTime"
,
required
=
false
)
Long
startTime
,
@RequestParam
(
name
=
"endTime"
,
required
=
false
)
Long
endTime
,
@RequestParam
(
name
=
"onlyMyFollowed"
,
defaultValue
=
"true"
)
Boolean
onlyMyFollowed
)
{
ChangeSubFlowListQueryReq
queryReq
=
new
ChangeSubFlowListQueryReq
();
queryReq
.
setFlowId
(
flowId
);
queryReq
.
setSubFlowId
(
subFlowId
);
queryReq
.
setItemId
(
itemId
);
queryReq
.
setSupplier
(
supplier
);
queryReq
.
setChangeExecUser
(
changeExecUser
);
queryReq
.
setChangeExecDepartment
(
changeExecDepartment
);
queryReq
.
setSubFlowNode
(
subFlowNode
);
queryReq
.
setStartTime
(
startTime
);
queryReq
.
setEndTime
(
endTime
);
queryReq
.
setOnlyMyFollowed
(
onlyMyFollowed
);
return
AjaxResult
.
success
(
changeSubFlowBiz
.
querySubFlowList
(
page
,
pageSize
,
queryReq
));
}
/**
* 变更行动工单详情查询
* 说明:展示内容和主单的detail一样,但行动项只展示该变更行动工单下绑定的行动项
*
* @param subFlowId 变更行动工单ID(即topo)
* @return 变更工单详情
*/
@GetMapping
(
"/detail"
)
public
AjaxResult
<
ChangeFlowVO
>
detail
(
@RequestParam
String
subFlowId
)
{
return
AjaxResult
.
success
(
changeSubFlowBiz
.
detailBySubFlowId
(
subFlowId
));
}
/**
* 子流程提交
*
* @return
...
...
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