package org.springblade.mdm.flow.excution.cure; import lombok.extern.slf4j.Slf4j; import org.springblade.mdm.basesetting.machine.service.MachineService; import org.springblade.mdm.flow.entity.ApproveRecord; import org.springblade.mdm.flow.entity.FlowProgramFile; import org.springblade.mdm.flow.excution.dispatch.FinishDataHandler; import org.springblade.mdm.flow.service.FlowProgramFileService; import org.springblade.mdm.flow.service.FlowProgramProperties; import org.springblade.mdm.program.entity.NcNode; import org.springblade.mdm.program.service.NcNodeAutoCreateService; import org.springblade.mdm.program.service.NcNodeService; import org.springblade.mdm.program.service.NcProgramApprovedService; import org.springblade.mdm.utils.EntityUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.List; /** * 偏离单固化完成数据处理器,功能:梳理树节点 */ @Slf4j @Component("deviationCureFinishDataHandler") public class DeviationCureFinishDataHandler implements FinishDataHandler { @Autowired private FlowProgramFileService flowProgramFileService; @Autowired private NcNodeService nodeService; /** * cureFinishOperateTask调用,偏离单回传审批完成处理业务 * @param props 属性 */ public void handleData(FlowProgramProperties props) { // 执行业务逻辑 NcNode pkgNode = nodeService.lambdaQuery().eq(NcNode::getProcessInstanceId, props.getProcessInstanceId()).one(); pkgNode.lock("偏离单回传锁定"); pkgNode.setIsLastEdition(0); nodeService.updateById(pkgNode); NcNode newPkgNode = new NcNode(); BeanUtils.copyProperties(pkgNode, newPkgNode); EntityUtil.clearBaseProperties(newPkgNode); newPkgNode.setIsLastEdition(1); newPkgNode.upgradeVersionNumber(); nodeService.save(newPkgNode); copyNonProgramNodes(pkgNode,newPkgNode); addNewProgramNode(newPkgNode,props.getProcessInstanceId()); log.info("偏离回传Listener完成"); } /** * 从待固化节点复制非程序文件节点到固化节点下 * @param oriPkgNode 待固化节点 * @param cureNode 固化节点 */ void copyNonProgramNodes(NcNode oriPkgNode,NcNode cureNode){ //处理程序包下层的程序节点1 List oriProgramNodes = nodeService.lambdaQuery().eq(NcNode::getParentId,oriPkgNode.getId()).list(); FlowProgramFile pfile; for(NcNode oldProgramNode : oriProgramNodes){ pfile = flowProgramFileService.getById(oldProgramNode.getFlowProgramFileId()); if(!pfile.isProgram()){ //当前固化程序包名下的“其他文件”非程序文件。不设置为老版本,复制到固化树下,两个网络之间只交换程序文件,其他文件只能保留 //其他文件,需要复制到新建的固化节点下 NcNode newOtherFileNode = new NcNode(); BeanUtils.copyProperties(oldProgramNode,newOtherFileNode); EntityUtil.clearBaseProperties(newOtherFileNode); newOtherFileNode.setParentId(cureNode.getId()); newOtherFileNode.setParentIds(cureNode.subNodeParentIds()); newOtherFileNode.setIsLastEdition(1); nodeService.save(newOtherFileNode); } } } /** * 加入新的程序文件节点 * @param newPkgNode 新的节点(固化的) * @param processInstanceId 流程实例id */ void addNewProgramNode(NcNode newPkgNode,String processInstanceId){ //新的文件作为最新版本 List files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,processInstanceId).list(); for(FlowProgramFile flowProgramFile : files){ NcNode newProgNode = new NcNode(); BeanUtils.copyProperties(newPkgNode, newProgNode); EntityUtil.clearBaseProperties(newProgNode); newProgNode.setName(flowProgramFile.getName()); newProgNode.setNodeType(NcNode.TYPE_PROGRAM_FILE); newProgNode.setParentId(newPkgNode.getId()); newProgNode.setParentIds(newPkgNode.subNodeParentIds()); newProgNode.setIsLastEdition(1); newProgNode.setVersionNumber(newPkgNode.getVersionNumber()); newProgNode.setFlowProgramFileId(flowProgramFile.getId()); newProgNode.setIsCured(0); nodeService.save(newProgNode); } } }