package org.springblade.mdm.flow.service; import lombok.AllArgsConstructor; import org.flowable.engine.IdentityService; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; import org.springblade.core.log.exception.ServiceException; import org.springblade.core.secure.utils.AuthUtil; import org.springblade.mdm.basesetting.producedivision.entity.ProduceDivision; import org.springblade.mdm.basesetting.producedivision.service.ProduceDivisionService; import org.springblade.mdm.flow.constants.FlowContants; import org.springblade.mdm.flow.constants.FlowVariableContants; import org.springblade.mdm.flow.entity.FlowProgramFile; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.service.NcNodeService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.HashMap; import java.util.List; import java.util.Map; @AllArgsConstructor @Service public class LockFlowService { private final NcNodeService nodeService; private final RuntimeService runtimeService; private final IdentityService identityService; private final ProduceDivisionService produceDivisionService; private final FlowCommonService flowCommonService; private final FlowProgramFileService flowProgramFileService; /** * 启动解锁流程 */ @Transactional public void startUnlock(Long nodeId,String unlockReason){ NcNode programPackage = nodeService.getById(nodeId); if(flowCommonService.isProcessInstanceActive(programPackage.getProcessInstanceId())){ throw new ServiceException("流程正在进行"); } Map vars = new HashMap<>(); flowCommonService.putFlowVariablesByNode(vars,programPackage); ProduceDivision div = produceDivisionService.getByDrawingNoWithQinzhe(programPackage.getDrawingNo()); vars.put(FlowVariableContants.PROGRAMMER,div.getProgrammerId()); vars.put(FlowVariableContants.SENIOR,div.getSeniorId()); vars.put(FlowVariableContants.ASSIGNEE,div.getSeniorId());//审批用户:高师 vars.put(FlowVariableContants.TITLE,programPackage.getName()+"程序解锁"); vars.put(FlowVariableContants.MY_PROCESS_NAME,"解锁流程"); vars.put("comment", "解锁程序"+programPackage.getName()); vars.put("unlockReason", unlockReason); String userId = String.valueOf(AuthUtil.getUserId()); identityService.setAuthenticatedUserId(userId);//设置流程发起人 vars.put(FlowVariableContants.ACT_PROGRAMMER,userId); ProcessInstance inst = runtimeService.startProcessInstanceByKey(FlowContants.UNLOCK_PROCESS_KEY,nodeId+"",vars); programPackage.setProcessInstanceId(inst.getId()); this.nodeService.updateById(programPackage); //更新节点文件的流程实例id updateFlowProgramFilesProcessInstance(programPackage); } /** * 更新所属流程文件的流程实例id * @param programPackage 要解锁的程序报名节点 */ void updateFlowProgramFilesProcessInstance(NcNode programPackage){ List fileNodes = nodeService.getProgramFilesByPackageId(programPackage.getId()); List fileIds = fileNodes.stream().map(NcNode::getFlowProgramFileId).toList(); if(!fileIds.isEmpty()){ flowProgramFileService.lambdaUpdate().in(FlowProgramFile::getId, fileIds) .set(FlowProgramFile::getProcessInstanceId, programPackage.getProcessInstanceId()).update(); } } }