feat: 企标更改流程

This commit is contained in:
2023-10-31 11:07:28 +08:00
parent 5112324140
commit 67336295e6
4 changed files with 204 additions and 41 deletions
@@ -2,12 +2,10 @@ package com.jero.modules.activiti.process.esChange.entity.vo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.jero.modules.activiti.process.common.entity.CommonVO;
import com.jero.modules.activiti.process.esInitChange.entity.ProcessEsInitChange;
import com.jero.modules.activiti.process.esRecheck.entity.ProcessEsRecheck;
import com.jero.modules.activiti.process.esChange.entity.ProcessEsChange;
import com.jero.modules.activiti.process.esRecheck.entity.vo.ESRecheckFlowUserVO;
import lombok.Data;
import java.util.List;
/**
* @author: Mzaxd
@@ -17,11 +15,11 @@ import java.util.List;
public class ESChangeDataVO {
@JsonProperty("common")
CommonVO commonVO;
CommonVO common;
@JsonProperty("data")
ProcessEsRecheck data;
ProcessEsChange data;
@JsonProperty("flowUser")
ESRecheckFlowUserVO flowUser;
ESChangeFlowUserVO flowUser;
}
@@ -15,16 +15,6 @@ public class ESChangeFlowUserVO {
@ApiModelProperty("主起草人")
private String mainDraftUser;
// 部所联络人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("部所联络人")
private String contactUser;
// 标准专家
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("标准专家")
private String standardExpert;
// 主起草人主管级领导
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("主起草人主管级领导")
@@ -38,30 +28,10 @@ public class ESChangeFlowUserVO {
// 标准化审批人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("标准化审批人")
private String standardizationApprovalUser;
// 新起草部门主管级领导上级领导
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("新起草部门主管级领导上级领导")
private String newMainDraftUserLeaderLeader;
// 新起草部门主管级领导
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("新起草部门主管级领导")
private String newMainDraftUserLeader;
private String standardizationUser;
// 相关人员
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("相关人员")
private String relatedUser;
// 抄送人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("抄送人")
private String copyUser;
// 创建人
@Dict(dictTable = "sys_user", dicCode = "id", dicText = "username")
@ApiModelProperty("创建人")
private String createUser;
}
@@ -15,7 +15,7 @@ public interface ProcessEsChangeService extends IService<ProcessEsChange> {
void saveToDraft(ESChangeDataVO changeData);
ProcessEsChange getHandleData(String taskId);
ESChangeDataVO getHandleData(String taskId);
void approvalInitChange(ESChangeDataVO changeData, boolean pass);
}
@@ -1,15 +1,38 @@
package com.jero.modules.activiti.process.esChange.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.jero.common.constant.enums.YesOrNoEnum;
import com.jero.common.exception.JeroBootException;
import com.jero.modules.activiti.entity.ProcessAll;
import com.jero.modules.activiti.entity.ProcessNode;
import com.jero.modules.activiti.enums.ProcessTypeEnum;
import com.jero.modules.activiti.process.common.entity.CommonVO;
import com.jero.modules.activiti.process.common.entity.ProcessDraft;
import com.jero.modules.activiti.process.common.enums.ProcessType;
import com.jero.modules.activiti.process.common.service.ActFlowCommonService;
import com.jero.modules.activiti.process.common.service.ProcessDraftService;
import com.jero.modules.activiti.process.esChange.entity.vo.ESChangeFlowUserVO;
import com.jero.modules.activiti.process.esChange.entity.ProcessEsChange;
import com.jero.modules.activiti.process.esChange.entity.vo.ESChangeDataVO;
import com.jero.modules.activiti.process.esChange.service.ProcessEsChangeService;
import com.jero.modules.activiti.process.esChange.mapper.ProcessEsChangeMapper;
import com.jero.modules.activiti.service.ProcessAllService;
import com.jero.modules.activiti.service.ProcessNodeLinkService;
import com.jero.modules.activiti.service.ProcessNodeService;
import com.jero.modules.sys.utils.UserUtils;
import lombok.extern.slf4j.Slf4j;
import org.activiti.engine.RuntimeService;
import org.activiti.engine.runtime.ProcessInstance;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author ThinkBook
* @description 针对表【process_es_change(企业标准)】的数据库操作Service实现
@@ -21,24 +44,196 @@ import org.springframework.transaction.annotation.Transactional;
public class ProcessEsChangeServiceImpl extends ServiceImpl<ProcessEsChangeMapper, ProcessEsChange>
implements ProcessEsChangeService{
@Resource
private ProcessAllService processAllService;
@Resource
private ActFlowCommonService actFlowCommonService;
@Resource
private ProcessDraftService processDraftService;
@Resource
private ProcessNodeLinkService processNodeLinkService;
@Resource
private ProcessNodeService processNodeService;
@Resource
private RuntimeService runtimeService;
@Override
public void startProcess(ESChangeDataVO changeData) {
// 执行流程发起前的操作
this.startRunTask(changeData);
// 流程Key
String processDefinitionKey = ProcessType.ES_INIT_CHANGE.getProcessKey();
// 当前用户Id
String userId = UserUtils.getUserId();
// 业务数据
ProcessEsChange esChange = changeData.getData();
// 通用数据
CommonVO common = changeData.getCommon();
// 人员数据
ESChangeFlowUserVO flowUser = changeData.getFlowUser();
// 设置流程变量
Map<String, Object> variables = this.setVariables(flowUser);
// 启动流程
ProcessInstance processInstance = actFlowCommonService.startProcess(processDefinitionKey, variables);
// 获取流程实例ID
String processDefinitionId = processInstance.getProcessDefinitionId();
String processInstanceId = processInstance.getId();
// 手动设置所有流程变量
actFlowCommonService.setProcessVariables(processInstanceId, variables);
// 自动完成第一个任务
actFlowCommonService.autoCompleteFirstTask(userId, processInstanceId, processDefinitionId, common);
// 设置流程实例Id
esChange.setProcessInstanceId(processInstanceId);
// 保存到业务流程表
save(esChange);
// 保存选人信息
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, this.getUserMap(variables));
// 根据流程实例id更新流程总表
String prcName = common.getPrcName();
String prcMes = common.getPrcMes();
Date dueTime = common.getDueTime();
Integer prcType = ProcessTypeEnum.ES_CHANGE.getValue();
actFlowCommonService.updateProcessAll(processInstanceId, userId, prcName, prcMes, prcType, dueTime);
}
public Map<String, Object> setVariables(ESChangeFlowUserVO flowUser) {
boolean counterSign = StrUtil.isNotBlank(flowUser.getRelatedUser());
HashMap<String, Object> map = new HashMap<>(this.setUserVariables(flowUser));
actFlowCommonService.putIfNotNull(map, "counterSign", counterSign);
return map;
}
public Map<String, Object> setUserVariables(ESChangeFlowUserVO flowUser) {
HashMap<String, Object> map = new HashMap<>();
// 使用一个通用方法来只在不为空时添加键值对
actFlowCommonService.putIfNotNull(map, "mainDraftUser", flowUser.getMainDraftUser());
actFlowCommonService.putIfNotNull(map, "relatedUserList", Optional.ofNullable(flowUser.getRelatedUser()).map(s -> Arrays.asList(s.split(","))).orElse(null));
actFlowCommonService.putIfNotNull(map, "mainDraftUserLeader", flowUser.getMainDraftUserLeader());
actFlowCommonService.putIfNotNull(map, "mainDraftUserLeaderLeader", flowUser.getMainDraftUserLeaderLeader());
actFlowCommonService.putIfNotNull(map, "standardizationUser", flowUser.getStandardizationUser());
return map;
}
private Map<String, Object> getUserMap(Map<String, Object> variables) {
variables.remove("pass");
// 转成逗号拼接
variables.put("relatedUserList", Optional.ofNullable((List<String>) variables.get("relatedUserList"))
.map(list -> String.join(",", list))
.orElse(""));
return variables;
}
@Override
public void saveToDraft(ESChangeDataVO changeData) {
CommonVO commonVO = changeData.getCommon();
String taskId = commonVO.getTaskId();
ProcessEsChange esChange = changeData.getData();
saveOrUpdate(esChange);
// 先删后增
LambdaUpdateWrapper<ProcessDraft> draftWrapper = new LambdaUpdateWrapper<>();
if (StrUtil.isBlank(taskId)) {
// 第一个节点点击保存没有taskId
draftWrapper.eq(ProcessDraft::getPrcType, ProcessTypeEnum.ES_CHANGE.getValue());
draftWrapper.eq(ProcessDraft::getCreateBy, UserUtils.getUserId());
processDraftService.remove(draftWrapper);
List<ProcessDraft> draftList = new ArrayList<>();
ProcessDraft draft = new ProcessDraft();
draft.setProjectId(esChange.getId());
draft.setPrcType(ProcessTypeEnum.ES_CHANGE.getValue());
draftList.add(draft);
processDraftService.saveBatch(draftList);
} else {
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
draftWrapper.eq(ProcessDraft::getProjectId, esChange.getId());
processDraftService.remove(draftWrapper);
List<ProcessDraft> draftList = new ArrayList<>();
ProcessDraft draft = new ProcessDraft();
draft.setProjectId(esChange.getId());
draft.setProcessInstanceId(processInstanceId);
draft.setPrcName(commonVO.getPrcName());
draft.setPrcType(ProcessTypeEnum.ES_CHANGE.getValue());
draftList.add(draft);
processDraftService.saveBatch(draftList);
}
}
public void startRunTask(ESChangeDataVO changeData) {
// do nothing now
}
@Override
public ProcessEsChange getHandleData(String taskId) {
return null;
public ESChangeDataVO getHandleData(String taskId) {
if (!actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("任务不存在");
}
ESChangeDataVO changeData = new ESChangeDataVO();
// 使用流程引擎根据taskId找到流程实例Id
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
String processDefinitionId = actFlowCommonService.getProcessDefId(processInstanceId);
// 获取流程通用数据
ProcessAll process = processAllService.getByProcessInstanceId(processInstanceId);
CommonVO commonVO = new CommonVO();
commonVO.setPrcName(process.getPrcName());
commonVO.setTaskId(process.getTaskId());
commonVO.setPrcMes(process.getPrcMes());
commonVO.setDueTime(process.getDueTime());
changeData.setCommon(commonVO);
// 获取流程实例数据
LambdaQueryWrapper<ProcessEsChange> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(ProcessEsChange::getProcessInstanceId, processInstanceId);
lambdaQueryWrapper.eq(ProcessEsChange::getDelFlag, YesOrNoEnum.NO.getValue());
ProcessEsChange data = getOne(lambdaQueryWrapper);
changeData.setData(data);
// 选人组件内容填充
changeData.setFlowUser(this.getProcessUserInfo(processDefinitionId, processInstanceId));
return changeData;
}
private ESChangeFlowUserVO getProcessUserInfo(String processDefinitionId, String processInstanceId) {
List<ProcessNode> nodeList = processNodeService.getNodeList(processDefinitionId, processInstanceId);
ESChangeFlowUserVO flowUser = new ESChangeFlowUserVO();
Map<String, ProcessNode> userMap = nodeList.stream().collect(Collectors.toMap(ProcessNode::getVariableName, node -> node));
Optional.ofNullable(userMap.get("mainDraftUser")).ifPresent(node -> flowUser.setMainDraftUser(node.getLinkUserIds()));
Optional.ofNullable(userMap.get("relatedUserList")).ifPresent(node -> flowUser.setRelatedUser(node.getLinkUserIds()));
Optional.ofNullable(userMap.get("mainDraftUserLeader")).ifPresent(node -> flowUser.setMainDraftUserLeader(node.getLinkUserIds()));
Optional.ofNullable(userMap.get("standardizationUser")).ifPresent(node -> flowUser.setStandardizationUser(node.getLinkUserIds()));
Optional.ofNullable(userMap.get("mainDraftUserLeaderLeader")).ifPresent(node -> flowUser.setMainDraftUserLeaderLeader(node.getLinkUserIds()));
return flowUser;
}
@Override
public void approvalInitChange(ESChangeDataVO changeData, boolean pass) {
String userId = UserUtils.getUserId();
CommonVO commonVO = changeData.getCommon();
ProcessEsChange data = changeData.getData();
String taskId = commonVO.getTaskId();
if (StrUtil.isBlank(taskId) && !actFlowCommonService.taskExists(taskId)) {
throw new JeroBootException("taskId为空或任务不存在");
}
String processInstanceId = actFlowCommonService.getProcessInstanceIdByTaskId(taskId);
String processDefinitionId = actFlowCommonService.getProcessDefId(processInstanceId);
if (pass) {
if (data != null) {
saveOrUpdate(data);
ESChangeFlowUserVO flowUserInfoVO = changeData.getFlowUser();
Map<String, Object> variables = this.setVariables(flowUserInfoVO);
processNodeLinkService.saveNodeUserLink(processDefinitionId, processInstanceId, this.getUserMap(variables));
actFlowCommonService.setProcessVariables(processInstanceId, variables);
}
runtimeService.setVariable(processInstanceId, "pass", true);
} else {
// 设置流程变量
runtimeService.setVariable(processInstanceId, "pass", false);
}
// 更新审批表为完成,填充数据
actFlowCommonService.updateApprovalInfo(commonVO, taskId, pass);
//审批节点
actFlowCommonService.completeTask(taskId, userId);
}
}