Commit 397ca4b3 by 王志超

feat: 增加变更行动工单

parent d7ea8e35
Pipeline #86077 passed with stages
in 1 minute 25 seconds
......@@ -34,6 +34,7 @@ import com.netease.mail.yanxuan.change.biz.service.BuildAndSendEmail;
import com.netease.mail.yanxuan.change.biz.service.ChangeFileService;
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.InteriorChangeConfigService;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeConfigService;
import com.netease.mail.yanxuan.change.biz.service.change.ChangeTypeService;
......@@ -61,6 +62,7 @@ import com.netease.mail.yanxuan.change.dal.entity.ChangeConfig;
import com.netease.mail.yanxuan.change.dal.entity.ChangeExecRecord;
import com.netease.mail.yanxuan.change.dal.entity.ChangeFile;
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.entity.ChangeType;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeRecordMapper;
import com.netease.mail.yanxuan.change.dal.meta.model.po.ChangeCommanderPO;
......@@ -131,6 +133,9 @@ public class ChangeFlowBiz {
private ChangeFlowExecService changeFlowExecService;
@Autowired
private ChangeSubFlowRecordService changeSubFlowRecordService;
@Autowired
private ChangeRecordMapper changeRecordMapper;
@Autowired
......@@ -315,7 +320,9 @@ public class ChangeFlowBiz {
}
/**
* 创建子流程并绑定到执行记录
* 创建变更行动工单并绑定行动项
* 说明:按照 changeExecDepartment + changeExecUserEmail 维度分组,每个分组创建一个变更行动工单
* 前端传值是拆分的(每个行动项一条记录),但需要汇总到同一个变更行动工单
*
* @param changeRecord 主流程记录
* @param flowName 主流程名称
......@@ -328,29 +335,46 @@ public class ChangeFlowBiz {
return;
}
for (ChangeExecRecord execRecord : execRecords) {
// 子流程使用行动人作为创建人和审批人
String execUserEmail = execRecord.getChangeExecUserEmail();
if (StringUtils.isBlank(execUserEmail)) {
log.warn("[createAndBindSubFlows] 行动人邮箱为空, execRecordId:{}, changeRecordId:{}",
execRecord.getId(), changeRecord.getId());
// 按照 changeExecDepartment + changeExecUserEmail 维度分组
Map<String, List<ChangeExecRecord>> groupedRecords = execRecords.stream()
.filter(record -> StringUtils.isNotBlank(record.getChangeExecUserEmail()))
.collect(Collectors.groupingBy(record ->
(StringUtils.isNotBlank(record.getChangeExecDepartment()) ? record.getChangeExecDepartment() : "")
+ "_" + record.getChangeExecUserEmail()));
if (groupedRecords.isEmpty()) {
log.warn("[createAndBindSubFlows] 未找到有效的执行记录(行动人邮箱为空), changeRecordId:{}", changeRecord.getId());
return;
}
// 为每个分组创建一个变更行动工单
for (Map.Entry<String, List<ChangeExecRecord>> entry : groupedRecords.entrySet()) {
List<ChangeExecRecord> groupRecords = entry.getValue();
if (CollectionUtils.isEmpty(groupRecords)) {
continue;
}
// 取第一个记录作为代表(同一分组下的记录,changeExecDepartment 和 changeExecUserEmail 相同)
ChangeExecRecord firstRecord = groupRecords.get(0);
String execUserEmail = firstRecord.getChangeExecUserEmail();
String execDepartment = firstRecord.getChangeExecDepartment();
// 查询行动人名称
IusUserInfoRsp execUser = iusService.queryUserInfo(execUserEmail);
String execUserName = execUser == null || StringUtils.isBlank(execUser.getName())
? execUserEmail : execUser.getName();
// 构建子流程工单内容
// 构建变更行动工单内容
Map<String, Object> subFlowContent = buildFlowContent(execUserEmail);
// 构建子流程工单名称:主流程名称 + 行动项内容(截取前100字符)
String subFlowName = flowName + "-" + execRecord.getChangeExecProject();
// 构建变更行动工单名称:主流程名称 + 变更行动部门 + 行动人(截取前100字符)
String subFlowName = flowName + "-" + execDepartment + "-" + execUserName;
if (subFlowName.length() > 100) {
subFlowName = subFlowName.substring(0, 100) + "...";
}
// 创建变更行动工单
FlowCreateReqDTO subFlowCreateReqDTO = buildFlowCreateReqDTO(ChangeFlowEnum.CHANGE_SUB_FLOW.getTopoId(),
execUserEmail, JSON.toJSONString(subFlowContent), FlowxOperationEnum.CREATE.getName(),
execUserName, subFlowName);
......@@ -359,15 +383,28 @@ public class ChangeFlowBiz {
FlowDataDTO subFlowDataDTO = flowService.flowDetail(subFlowId);
// 获取流程节点ID
String subNodeId = subFlowDataDTO.getFlowMeta().getCurrNodeDataList().get(0).getNodeId();
log.info("[createAndBindSubFlows] changeRecordId:{}, subFlowId:{}, nodeId:{}, execUserEmail:{}",
changeRecord.getId(), subFlowId, subNodeId, execUserEmail);
// 更新执行记录,绑定子流程
execRecord.setSubFlowId(subFlowId);
execRecord.setSubFlowNode(subNodeId);
// 创建变更行动工单记录
ChangeSubFlowRecord subFlowRecord = ChangeSubFlowRecord.builder()
.changeRecordId(changeRecord.getId())
.subFlowId(subFlowId)
.subFlowNode(subNodeId)
.createTime(DateUtils.getCurrentTime())
.updateTime(DateUtils.getCurrentTime())
.build();
changeSubFlowRecordService.saveRecord(subFlowRecord);
log.info("[createAndBindSubFlows] changeRecordId:{}, subFlowRecordId:{}, subFlowId:{}, nodeId:{}, execDepartment:{}, execUserEmail:{}, execCount:{}",
changeRecord.getId(), subFlowRecord.getId(), subFlowId, subNodeId, execDepartment, execUserEmail, groupRecords.size());
// 将该分组下的所有行动项关联到变更行动工单
for (ChangeExecRecord execRecord : groupRecords) {
execRecord.setSubFlowRecordId(subFlowRecord.getId());
execRecord.setUpdateTime(DateUtils.getCurrentTime());
changeFlowExecService.update(execRecord);
}
}
}
/**
* 提交到执行节点
......
......@@ -56,4 +56,11 @@ public interface ChangeFlowExecService {
* @return
*/
ChangeExecRecord getBySubFlowId(String subFlowId);
/**
* 根据变更行动工单记录ID查询行动项列表
* @param subFlowRecordId 变更行动工单记录ID
* @return 行动项列表
*/
List<ChangeExecRecord> getBySubFlowRecordId(Long subFlowRecordId);
}
\ No newline at end of file
/**
* @(#)ChangeSubFlowRecordService.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.biz.service;
import java.util.List;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord;
/**
* 变更行动工单服务
* @Author system
* @Date 2024/01/01
*/
public interface ChangeSubFlowRecordService {
/**
* 保存变更行动工单记录
* @param subFlowRecord 变更行动工单记录
*/
void saveRecord(ChangeSubFlowRecord subFlowRecord);
/**
* 更新变更行动工单记录
* @param subFlowRecord 变更行动工单记录
* @return 是否成功
*/
Boolean update(ChangeSubFlowRecord subFlowRecord);
/**
* 根据主单记录ID查询变更行动工单列表
* @param changeRecordId 主单记录ID
* @return 变更行动工单列表
*/
List<ChangeSubFlowRecord> getByChangeRecordId(Long changeRecordId);
/**
* 根据变更行动工单ID查询变更行动工单记录
* @param subFlowId 变更行动工单ID(即topo)
* @return 变更行动工单记录
*/
ChangeSubFlowRecord getBySubFlowId(String subFlowId);
}
......@@ -80,4 +80,12 @@ public class ChangeFlowExecServiceImpl implements ChangeFlowExecService {
public ChangeExecRecord getBySubFlowId(String subFlowId) {
return changeExecRecordMapper.selectBySubFlowId(subFlowId);
}
@Override
public List<ChangeExecRecord> getBySubFlowRecordId(Long subFlowRecordId) {
if (subFlowRecordId == null) {
return new ArrayList<>();
}
return changeExecRecordMapper.selectBySubFlowRecordId(subFlowRecordId);
}
}
/**
* @(#)ChangeSubFlowRecordServiceImpl.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.biz.service.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.netease.mail.yanxuan.change.biz.service.ChangeSubFlowRecordService;
import com.netease.mail.yanxuan.change.dal.entity.ChangeSubFlowRecord;
import com.netease.mail.yanxuan.change.dal.mapper.ChangeSubFlowRecordMapper;
/**
* @Author system
* @Date 2024/01/01
*/
@Service
public class ChangeSubFlowRecordServiceImpl implements ChangeSubFlowRecordService {
@Autowired
private ChangeSubFlowRecordMapper changeSubFlowRecordMapper;
@Override
public void saveRecord(ChangeSubFlowRecord subFlowRecord) {
changeSubFlowRecordMapper.insertSelective(subFlowRecord);
}
@Override
public Boolean update(ChangeSubFlowRecord subFlowRecord) {
return changeSubFlowRecordMapper.updateByPrimaryKeySelective(subFlowRecord) > 0;
}
@Override
public List<ChangeSubFlowRecord> getByChangeRecordId(Long changeRecordId) {
return changeSubFlowRecordMapper.selectByChangeRecordId(changeRecordId);
}
@Override
public ChangeSubFlowRecord getBySubFlowId(String subFlowId) {
return changeSubFlowRecordMapper.selectBySubFlowId(subFlowId);
}
}
......@@ -94,6 +94,11 @@ public class ChangeExecRecord {
private String subFlowNode;
/**
* 变更行动工单记录ID(关联到变更行动工单中间表,新数据使用)
*/
private Long subFlowRecordId;
/**
* 创建时间
*/
private Long createTime;
......
/**
* @(#)ChangeSubFlowRecord.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.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;
/**
* 变更行动工单
* 关系:主单 1 - 变更行动工单 N - 行动项 N
*
* @Author system
* @Date 2024/01/01
*/
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@Entity
@Table(name = "TB_YX_QC_CHANGE_SUB_FLOW_RECORD")
public class ChangeSubFlowRecord {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
/**
* 主单记录ID(变更记录ID)
*/
private Long changeRecordId;
/**
* 变更行动工单ID(即topo)
*/
private String subFlowId;
/**
* 变更行动工单当前节点
*/
private String subFlowNode;
/**
* 创建时间
*/
private Long createTime;
/**
* 更新时间
*/
private Long updateTime;
}
......@@ -45,4 +45,12 @@ public interface ChangeExecRecordMapper extends tk.mybatis.mapper.common.Mapper<
@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
* @return 行动项列表
*/
@Select("SELECT * FROM TB_YX_QC_CHANGE_EXEC_RECORD WHERE sub_flow_record_id = #{subFlowRecordId}")
List<ChangeExecRecord> selectBySubFlowRecordId(@Param("subFlowRecordId") Long subFlowRecordId);
}
/**
* @(#)ChangeSubFlowRecordMapper.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.mapper;
import java.util.List;
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.ChangeSubFlowRecord;
/**
* @Author system
* @Date 2024/01/01
*/
@Mapper
public interface ChangeSubFlowRecordMapper extends tk.mybatis.mapper.common.Mapper<ChangeSubFlowRecord> {
/**
* 根据主单记录ID查询变更行动工单列表
* @param changeRecordId 主单记录ID
* @return 变更行动工单列表
*/
@Select("SELECT * FROM TB_YX_QC_CHANGE_SUB_FLOW_RECORD WHERE change_record_id = #{changeRecordId}")
List<ChangeSubFlowRecord> selectByChangeRecordId(@Param("changeRecordId") Long changeRecordId);
/**
* 根据变更行动工单ID查询变更行动工单记录
* @param subFlowId 变更行动工单ID(即topo)
* @return 变更行动工单记录
*/
@Select("SELECT * FROM TB_YX_QC_CHANGE_SUB_FLOW_RECORD WHERE sub_flow_id = #{subFlowId} LIMIT 1")
ChangeSubFlowRecord selectBySubFlowId(@Param("subFlowId") String subFlowId);
}
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