Commit 6f82da45 by 王志超

feat: 变更行动工单列表

parent 0f85eac1
......@@ -130,14 +130,19 @@ public class ChangeSubFlowBiz {
log.info("[submitSubFlow] changeSubFlowSubmitReq:{}", JSON.toJSONString(changeSubFlowSubmitReq));
String subFlowId = changeSubFlowSubmitReq.getSubFlowId();
// 通过子流程工单ID查询行动记录
ChangeExecRecord execRecord = changeFlowExecService.getBySubFlowId(subFlowId);
Assert.notNull(execRecord, "行动项记录不存在");
// 通过子流程工单ID查询行动工单记录
ChangeSubFlowRecord subFlowRecord = changeSubFlowRecordService.getBySubFlowId(subFlowId);
Assert.notNull(subFlowRecord, "行动工单记录不存在");
// 检查工单节点
String currentNode = execRecord.getSubFlowNode();
// 检查工单节点(从行动工单获取)
String currentNode = subFlowRecord.getSubFlowNode();
this.checkNode(currentNode, Collections.singletonList(changeSubFlowSubmitReq.getCurrentNodeId()));
// 通过行动工单记录ID查询行动项记录(取第一个)
List<ChangeExecRecord> execRecords = changeFlowExecService.getBySubFlowRecordId(subFlowRecord.getId());
Assert.notEmpty(execRecords, "行动项记录不存在");
ChangeExecRecord execRecord = execRecords.get(0);
String uid = RequestLocalBean.getUid();
// 验证执行人权限
if (!uid.equals(execRecord.getChangeExecUserEmail())) {
......@@ -150,15 +155,15 @@ public class ChangeSubFlowBiz {
throw ExceptionFactory.createBiz(ResponseCode.DETAIL_FLOW_ERROR, "子流程工单查询错误,不存在");
}
return checkUpdateAndSubmit(subFlowId, flowDataDTO, uid, execRecord, currentNode, changeSubFlowSubmitReq);
return checkUpdateAndSubmit(subFlowId, flowDataDTO, uid, execRecord, subFlowRecord, currentNode, changeSubFlowSubmitReq);
}
/**
* 检查并提交子流程节点
*/
private String checkUpdateAndSubmit(String subFlowId, FlowDataDTO flowDataDTO, String uid,
ChangeExecRecord execRecord, String currentNode,
ChangeSubFlowSubmitReq changeSubFlowSubmitReq) {
ChangeExecRecord execRecord, ChangeSubFlowRecord subFlowRecord,
String currentNode, ChangeSubFlowSubmitReq changeSubFlowSubmitReq) {
ChangeFlowEnum node = ChangeFlowEnum.getByNodeId(currentNode);
Assert.notNull(node, "节点配置不存在");
log.debug("[checkUpdateAndSubmit] subFlowId:{}, nodeEnum:{}, changeSubFlowSubmitReq:{}",
......@@ -175,10 +180,10 @@ public class ChangeSubFlowBiz {
String nextNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime());
// 更新节点ID
execRecord.setSubFlowNode(nextNodeId);
execRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowExecService.update(execRecord);
// 更新行动工单节点ID
subFlowRecord.setSubFlowNode(nextNodeId);
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
return nextNodeId;
case CHANGE_SUB_FLOW_SUBMIT:
......@@ -186,10 +191,10 @@ public class ChangeSubFlowBiz {
String execNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime());
// 更新节点ID
execRecord.setSubFlowNode(execNodeId);
execRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowExecService.update(execRecord);
// 更新行动工单节点ID
subFlowRecord.setSubFlowNode(execNodeId);
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
return execNodeId;
case CHANGE_SUB_FLOW_EXE:
......@@ -197,10 +202,10 @@ public class ChangeSubFlowBiz {
String confirmNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime());
// 更新节点ID
execRecord.setSubFlowNode(confirmNodeId);
execRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowExecService.update(execRecord);
// 更新行动工单节点ID
subFlowRecord.setSubFlowNode(confirmNodeId);
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
return confirmNodeId;
case CHANGE_SUB_FLOW_CONFIRM:
......@@ -210,21 +215,26 @@ public class ChangeSubFlowBiz {
Assert.notNull(finishTime, "行动完成时间不可为空");
Assert.isTrue(StringUtils.isNotBlank(finishDesc), "行动完成情况不可为空");
// 更新完成信息
execRecord.setChangeExecFinishTime(finishTime);
execRecord.setChangeExecFinishDesc(finishDesc);
// 更新完成信息(更新所有关联的行动项)
List<ChangeExecRecord> allExecRecords = changeFlowExecService.getBySubFlowRecordId(subFlowRecord.getId());
for (ChangeExecRecord exec : allExecRecords) {
exec.setChangeExecFinishTime(finishTime);
exec.setChangeExecFinishDesc(finishDesc);
exec.setUpdateTime(DateUtils.getCurrentTime());
changeFlowExecService.update(exec);
}
// 提交到结束节点
String endNodeId = flowService.submitFlow(subFlowId, flowDataDTO, uid,
ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(), JSON.toJSONString(content), true,
FlowxOperationEnum.SUBMIT.getName(), "提交工单", execRecord.getCreateTime());
// 更新节点ID
execRecord.setSubFlowNode(endNodeId);
execRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowExecService.update(execRecord);
// 更新行动工单节点ID
subFlowRecord.setSubFlowNode(endNodeId);
subFlowRecord.setUpdateTime(DateUtils.getCurrentTime());
changeSubFlowRecordService.update(subFlowRecord);
// TODO: 子流程完成后,检查主流程是否可以进入确认节点
log.info("[CHANGE_SUB_FLOW_CONFIRM] 子流程完成,subFlowId:{}, changeExecId:{}", subFlowId, execRecord.getId());
log.info("[CHANGE_SUB_FLOW_CONFIRM] 子流程完成,subFlowId:{}, subFlowRecordId:{}", subFlowId, subFlowRecord.getId());
return endNodeId;
......@@ -291,7 +301,6 @@ public class ChangeSubFlowBiz {
.changeExecFinishTime(c.getChangeExecFinishTime())
.changeExecFinishDesc(c.getChangeExecFinishDesc())
.subFlowId(c.getSubFlowId())
.subFlowNode(c.getSubFlowNode())
.build())
.collect(Collectors.toList());
......@@ -341,10 +350,11 @@ public class ChangeSubFlowBiz {
log.info("[querySubFlowList] page:{}, pageSize:{}, queryReq:{}", page, pageSize, JSON.toJSONString(queryReq));
// 根据主单条件(flowId, itemId, supplier, onlyMyFollowed)查询主单,获取 changeRecordIds
List<Long> changeRecordIds = null;
if (queryReq.getFlowId() != null || StringUtils.isNotBlank(queryReq.getItemId())
|| StringUtils.isNotBlank(queryReq.getSupplier()) || queryReq.getOnlyMyFollowed()) {
List<Long> flowRecordIds = fileterFlowRecordIds(queryReq);
if (CollectionUtils.isEmpty(flowRecordIds)) {
changeRecordIds = filterFlowRecordIds(queryReq);
if (CollectionUtils.isEmpty(changeRecordIds)) {
// 如果主单查询结果为空,直接返回
PageVO pageVO = buildPageVo(0L, pageSize, page);
ChangeSubFlowListVO result = new ChangeSubFlowListVO();
......@@ -352,68 +362,17 @@ public class ChangeSubFlowBiz {
result.setChangeSubFlowList(new ArrayList<>());
return result;
}
queryReq.setChangeRecordIds(flowRecordIds);
}
// 根据行动项条件(changeExecUser, changeExecDepartment)查询执行项,获取 subFlowRecordId,然后查询子单获取 subFlowId 列表
List<String> subFlowIds = null;
if (StringUtils.isNotBlank(queryReq.getChangeExecUser())
|| StringUtils.isNotBlank(queryReq.getChangeExecDepartment())) {
List<Long> subFlowRecordIds = new ArrayList<>();
// 根据 changeExecUser 查询
if (StringUtils.isNotBlank(queryReq.getChangeExecUser())) {
List<Long> userSubFlowRecordIds = changeFlowExecService.querySubFlowRecordIdsByExecUser(queryReq.getChangeExecUser());
if (CollectionUtils.isNotEmpty(userSubFlowRecordIds)) {
subFlowRecordIds.addAll(userSubFlowRecordIds);
}
}
// 根据 changeExecDepartment 查询
if (StringUtils.isNotBlank(queryReq.getChangeExecDepartment())) {
List<Long> deptSubFlowRecordIds = changeFlowExecService.querySubFlowRecordIdsByExecDepartment(queryReq.getChangeExecDepartment());
if (CollectionUtils.isNotEmpty(deptSubFlowRecordIds)) {
if (CollectionUtils.isNotEmpty(subFlowRecordIds)) {
// 取交集
subFlowRecordIds = subFlowRecordIds.stream()
.filter(deptSubFlowRecordIds::contains)
.collect(Collectors.toList());
} else {
subFlowRecordIds = deptSubFlowRecordIds;
}
}
}
// 如果行动项查询结果为空,直接返回
if (CollectionUtils.isEmpty(subFlowRecordIds)) {
PageVO pageVO = buildPageVo(0L, pageSize, page);
ChangeSubFlowListVO result = new ChangeSubFlowListVO();
result.setPageVo(pageVO);
result.setChangeSubFlowList(new ArrayList<>());
return result;
}
// 根据 subFlowRecordId 查询子单,获取 subFlowId 列表
List<ChangeSubFlowRecord> subFlowRecords = subFlowRecordIds.stream()
.map(id -> changeSubFlowRecordMapper.selectByPrimaryKey(id))
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(subFlowRecords)) {
subFlowIds = subFlowRecords.stream()
.map(ChangeSubFlowRecord::getSubFlowId)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
}
// 根据行动项条件(changeExecUser, changeExecDepartment)查询执行项,获取 subFlowId 列表
List<String> subFlowIds = filterSubFlowIdsByExecCondition(queryReq);
if (subFlowIds != null && CollectionUtils.isEmpty(subFlowIds)) {
// 如果子单ID列表为空,直接返回
if (CollectionUtils.isEmpty(subFlowIds)) {
PageVO pageVO = buildPageVo(0L, pageSize, page);
ChangeSubFlowListVO result = new ChangeSubFlowListVO();
result.setPageVo(pageVO);
result.setChangeSubFlowList(new ArrayList<>());
return result;
}
PageVO pageVO = buildPageVo(0L, pageSize, page);
ChangeSubFlowListVO result = new ChangeSubFlowListVO();
result.setPageVo(pageVO);
result.setChangeSubFlowList(new ArrayList<>());
return result;
}
// 第三步:将查询条件填充到 queryReq,用 changeRecordIds + subFlowIds + 其他条件(subFlowNode, startTime, endTime)直接查询子单
......@@ -547,7 +506,13 @@ public class ChangeSubFlowBiz {
return result;
}
private List<Long> fileterFlowRecordIds(ChangeSubFlowListQueryReq queryReq) {
/**
* 根据主单条件查询主单记录ID列表
*
* @param queryReq 查询条件
* @return 主单记录ID列表
*/
private List<Long> filterFlowRecordIds(ChangeSubFlowListQueryReq queryReq) {
// 构建主单查询条件
ChangeFlowListQueryReq mainQueryReq = new ChangeFlowListQueryReq();
mainQueryReq.setFlowId(queryReq.getFlowId());
......@@ -574,6 +539,66 @@ public class ChangeSubFlowBiz {
}
/**
* 根据行动项条件(changeExecUser, changeExecDepartment)查询执行项,获取 subFlowId 列表
*
* @param queryReq 查询条件
* @return subFlowId 列表,如果没有行动项条件则返回 null
*/
private List<String> filterSubFlowIdsByExecCondition(ChangeSubFlowListQueryReq queryReq) {
// 如果没有行动项条件,返回 null
if (StringUtils.isBlank(queryReq.getChangeExecUser())
&& StringUtils.isBlank(queryReq.getChangeExecDepartment())) {
return null;
}
List<Long> subFlowRecordIds = new ArrayList<>();
// 根据 changeExecUser 查询(只查询 email,使用 LIKE)
if (StringUtils.isNotBlank(queryReq.getChangeExecUser())) {
List<Long> userSubFlowRecordIds = changeFlowExecService.querySubFlowRecordIdsByExecUser(queryReq.getChangeExecUser());
if (CollectionUtils.isNotEmpty(userSubFlowRecordIds)) {
subFlowRecordIds.addAll(userSubFlowRecordIds);
}
}
// 根据 changeExecDepartment 查询
if (StringUtils.isNotBlank(queryReq.getChangeExecDepartment())) {
List<Long> deptSubFlowRecordIds = changeFlowExecService.querySubFlowRecordIdsByExecDepartment(queryReq.getChangeExecDepartment());
if (CollectionUtils.isNotEmpty(deptSubFlowRecordIds)) {
if (CollectionUtils.isNotEmpty(subFlowRecordIds)) {
// 取交集
subFlowRecordIds = subFlowRecordIds.stream()
.filter(deptSubFlowRecordIds::contains)
.collect(Collectors.toList());
} else {
subFlowRecordIds = deptSubFlowRecordIds;
}
}
}
// 如果行动项查询结果为空,返回空列表
if (CollectionUtils.isEmpty(subFlowRecordIds)) {
return new ArrayList<>();
}
// 根据 subFlowRecordId 查询子单,获取 subFlowId 列表
List<ChangeSubFlowRecord> subFlowRecords = subFlowRecordIds.stream()
.map(id -> changeSubFlowRecordMapper.selectByPrimaryKey(id))
.filter(Objects::nonNull)
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(subFlowRecords)) {
return new ArrayList<>();
}
return subFlowRecords.stream()
.map(ChangeSubFlowRecord::getSubFlowId)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
}
/**
* 构建分页信息
*
* @param total 总记录数
......
......@@ -51,13 +51,6 @@ public interface ChangeFlowExecService {
List<Long> queryByExecUser(String changeExecUser);
/**
* 根据子流程工单ID查询行动项记录
* @param subFlowId
* @return
*/
ChangeExecRecord getBySubFlowId(String subFlowId);
/**
* 根据变更行动工单记录ID查询行动项列表
* @param subFlowRecordId 变更行动工单记录ID
* @return 行动项列表
......
......@@ -41,7 +41,7 @@ public class ChangeFlowExecServiceImpl implements ChangeFlowExecService {
.changeRiskDesc(c.getChangeRiskDesc()).changeExecProject(c.getChangeExecProject())
.changeChecking(c.getChangeChecking()).changeExecFinishTime(c.getChangeExecFinishTime())
.changeExecFinishDesc(c.getChangeExecFinishDesc())
.subFlowId(c.getSubFlowId()).subFlowNode(c.getSubFlowNode()).build())
.subFlowId(c.getSubFlowId()).build())
.collect(Collectors.toList());
}
return new ArrayList<>();
......@@ -78,11 +78,6 @@ public class ChangeFlowExecServiceImpl implements ChangeFlowExecService {
}
@Override
public ChangeExecRecord getBySubFlowId(String subFlowId) {
return changeExecRecordMapper.selectBySubFlowId(subFlowId);
}
@Override
public List<ChangeExecRecord> getBySubFlowRecordId(Long subFlowRecordId) {
if (subFlowRecordId == null) {
return new ArrayList<>();
......
......@@ -84,16 +84,11 @@ public class ChangeExecRecord {
private String changeExecFinishDesc;
/**
* 子流程工单ID
* 变更执行工单topo ID
*/
private String subFlowId;
/**
* 子流程当前节点
*/
private String subFlowNode;
/**
* 变更行动工单记录ID(关联到变更行动工单中间表,新数据使用)
*/
private Long subFlowRecordId;
......
......@@ -43,9 +43,6 @@ public interface ChangeExecRecordMapper extends tk.mybatis.mapper.common.Mapper<
@Select("SELECT * FROM TB_YX_QC_CHANGE_EXEC_RECORD ORDER BY id DESC LIMIT #{limit},#{offset}")
List<ChangeExecRecord> queryList(@Param("limit") int limit, @Param("offset") Integer offset);
@Select("SELECT * FROM TB_YX_QC_CHANGE_EXEC_RECORD WHERE sub_flow_id = #{subFlowId} LIMIT 1")
ChangeExecRecord selectBySubFlowId(@Param("subFlowId") String subFlowId);
/**
* 根据变更行动工单记录ID查询行动项列表
* @param subFlowRecordId 变更行动工单记录ID
......@@ -55,11 +52,11 @@ public interface ChangeExecRecordMapper extends tk.mybatis.mapper.common.Mapper<
List<ChangeExecRecord> selectBySubFlowRecordId(@Param("subFlowRecordId") Long subFlowRecordId);
/**
* 根据变更行动人查询变更行动工单记录ID列表
* @param changeExecUser 变更行动人(邮箱或姓名
* 根据变更行动人查询变更行动工单记录ID列表(只查询 email,使用 LIKE)
* @param changeExecUser 变更行动人(邮箱)
* @return 变更行动工单记录ID列表
*/
@Select("SELECT DISTINCT(sub_flow_record_id) FROM TB_YX_QC_CHANGE_EXEC_RECORD WHERE sub_flow_record_id IS NOT NULL AND (change_exec_user_email LIKE #{changeExecUser} OR change_exec_user LIKE #{changeExecUser})")
@Select("SELECT DISTINCT(sub_flow_record_id) FROM TB_YX_QC_CHANGE_EXEC_RECORD WHERE sub_flow_record_id IS NOT NULL AND change_exec_user_email LIKE #{changeExecUser}")
List<Long> querySubFlowRecordIdsByExecUser(@Param("changeExecUser") String changeExecUser);
/**
......
......@@ -84,9 +84,4 @@ public class ChangeFlowExecVO {
* 子流程工单ID
*/
private String subFlowId;
/**
* 子流程当前节点
*/
private String subFlowNode;
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment