diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeDataVO.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeDataVO.java index e3e9f151..e108b8a1 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeDataVO.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeDataVO.java @@ -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; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeFlowUserVO.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeFlowUserVO.java index 202d3e2a..847d53c2 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeFlowUserVO.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/entity/vo/ESChangeFlowUserVO.java @@ -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; } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/ProcessEsChangeService.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/ProcessEsChangeService.java index cbe2cd9f..b051f2ea 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/ProcessEsChangeService.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/ProcessEsChangeService.java @@ -15,7 +15,7 @@ public interface ProcessEsChangeService extends IService { void saveToDraft(ESChangeDataVO changeData); - ProcessEsChange getHandleData(String taskId); + ESChangeDataVO getHandleData(String taskId); void approvalInitChange(ESChangeDataVO changeData, boolean pass); } diff --git a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/impl/ProcessEsChangeServiceImpl.java b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/impl/ProcessEsChangeServiceImpl.java index 22f1031e..8dd34f3a 100644 --- a/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/impl/ProcessEsChangeServiceImpl.java +++ b/laws-modules/src/main/java/com/jero/modules/activiti/process/esChange/service/impl/ProcessEsChangeServiceImpl.java @@ -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 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 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 setVariables(ESChangeFlowUserVO flowUser) { + boolean counterSign = StrUtil.isNotBlank(flowUser.getRelatedUser()); + HashMap map = new HashMap<>(this.setUserVariables(flowUser)); + actFlowCommonService.putIfNotNull(map, "counterSign", counterSign); + return map; + } + + public Map setUserVariables(ESChangeFlowUserVO flowUser) { + HashMap 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 getUserMap(Map variables) { + variables.remove("pass"); + // 转成逗号拼接 + variables.put("relatedUserList", Optional.ofNullable((List) 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 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 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 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 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 nodeList = processNodeService.getNodeList(processDefinitionId, processInstanceId); + ESChangeFlowUserVO flowUser = new ESChangeFlowUserVO(); + Map 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 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); } }