yangys
2025-09-17 1e2b04fabbbc4b1ae37d7951068d7ab235f5b5f9
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -3,20 +3,32 @@
import com.alibaba.excel.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.basesetting.machine.service.MachineService;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.excution.ListenerHelper;
import org.springblade.mdm.flow.service.FlowProgramFileService;
import org.springblade.mdm.flow.service.FlowProgramProperties;
import org.springblade.mdm.gkw.programnode.vo.ProgramNameVO;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgramApproved;
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.program.service.ProgramAnnotationService;
import org.springblade.mdm.program.service.programannotation.*;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.time.LocalDateTime;
import java.util.List;
@@ -27,18 +39,27 @@
@Component("normalDispatchFinishDataHandler")
public class NormalFinishDataHandler implements FinishDataHandler{
   @Autowired
   private NcProgramApprovedService approvedService;
   @Autowired
   private FlowProgramFileService flowProgramFileService;
   @Autowired
   private MachineAnnotationConfig annotationConfig;
   @Autowired
   private MachineService machineService;
   @Autowired
   private NcNodeService ncNodeService;
   @Autowired
   private NcNodeAutoCreateService ncNodeAutoCreateService;
   @Autowired
   private ProgramAnnotationService programAnnotationService;
   @Autowired
   private ListenerHelper listenerHelper;
   @Autowired
   private OssTemplate ossTemplate;
   /**
    * DispatchFinishListener中调用
    * @param props 流程属性
    */
   public void handleData(FlowProgramProperties props) {
   public void handleData(FlowProgramProperties props) throws IOException {
      // 执行业务逻辑
      LocalDateTime now = LocalDateTime.now();
      NcNode packageNode;
@@ -57,8 +78,12 @@
            packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,newVersion);
         }else{
            //可用,升版(修改其工序版次),原来的节点清除
            //String oriProcessEdition = packageNode.getProcessEdition();
            //可用,空升版(修改其工序版次),原来的节点清除
            moveToNewProcessEdition(packageNode,props);
            //更新已固化的,同名、不同机床组的程序为锁定状态
            ncNodeService.lockSameNameOtherMachineGroupProgramPackage(packageNode);
         }
      }else{
         //普通试切
@@ -68,7 +93,7 @@
         ncNodeService.updateById(packageNode);
      }
      addApproveTable(packageNode,props);
      listenerHelper.addApproveTable(packageNode,props);
      log.info("普通流程已完成in DispatchFinishListener");
   }
@@ -78,8 +103,9 @@
    * @param packageNode 程序包名节点
    * @param props 流程属性
    */
   private void moveToNewProcessEdition(NcNode packageNode, FlowProgramProperties props) {
      ncNodeService.deleteMachineNodeByParentId(packageNode.getParentId());
   private void moveToNewProcessEdition(NcNode packageNode, FlowProgramProperties props) throws IOException {
      //ncNodeService.deleteMachineGroupNodeByParentId();
      ncNodeService.getBaseMapper().deleteById(packageNode.getParentId());//删除机床组节点
      FlowProgramProperties tempProps = new FlowProgramProperties();
      BeanUtils.copyProperties(props,tempProps);
@@ -87,6 +113,7 @@
      NcNode machineGroupNode = ncNodeAutoCreateService.createNodeTreeToMachineGroup(tempProps);
      //移动历史节点到新的版次节点下
      /*
      List<NcNode> packageHisNodes = ncNodeService.getTryNodeHistory(packageNode);//该包的历史节点列表
      for(NcNode hisPackageNode : packageHisNodes){
         hisPackageNode.setParentId(machineGroupNode.getId());
@@ -100,27 +127,39 @@
         ncNodeService.updateBatchById(oriProgramNodes);
      }
      ncNodeService.updateBatchById(packageHisNodes);
      */
      //移动程序包名节点
      packageNode.setProcessEdition(tempProps.getProcessEdition());
      packageNode.setParentId(machineGroupNode.getId());
      packageNode.setParentIds(machineGroupNode.getParentIds()+","+machineGroupNode.getId());
      packageNode.setParentIds(machineGroupNode.subNodeParentIds());
      packageNode.setName(tempProps.getDrawingNo()+"-"+tempProps.getProcessNo()+"-"+tempProps.getProcessEdition());
      this.ncNodeService.updateById(packageNode);
      this.ncNodeService.updateById(packageNode);
      Machine machine = machineService.getByCode(packageNode.getMachineCode());
      //移动程序节点
      //List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
      List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
      for(NcNode programNode : programNodes){
         FlowProgramFile progFile = this.flowProgramFileService.getById(programNode.getFlowProgramFileId());
         programNode.setName(buildNewFilename(programNode.getName(),tempProps.getProcessEdition()));//名称修改,工序版次部分
         programNode.setParentIds(packageNode.getParentIds()+","+packageNode.getId());
         programNode.setParentIds(packageNode.subNodeParentIds());
         programNode.setProcessEdition(tempProps.getProcessEdition());//修改工序版次
         programNode.setVersionNumber(packageNode.getVersionNumber());
         if(progFile.isProgram()) {
            programNode.setName(buildNewFilename(programNode.getName(), tempProps.getProcessEdition()));//名称修改,工序版次部分
            setNewProgramNameAnnotation(programNode.getName(), progFile, machine.getControlSystem());
         }
      }
      ncNodeService.updateBatchById(programNodes);
   }
   /**
    * 构建新的程序市名
    * @param filename 程序包名
    * @param newProcessEdition 新的工序版次
    * @return 新的程序文件名
    */
   String buildNewFilename(String filename,String newProcessEdition){
      ProgramNameVO pnameVO = ProgramFileNameParser.parseProgramName(filename);
      String ext = FilenameUtils.getExtension(filename);
@@ -132,20 +171,34 @@
   }
   /**
    * 保存审批完成的记录
    * @param packageNode
    * @param props
    * 设置固化注释,实现方式,获取文件字节下,修改后替换文件
    * @param flowProgramFile oss 文件
    *
    */
   void addApproveTable(NcNode packageNode,FlowProgramProperties props){
      NcProgramApproved approved = new NcProgramApproved();
   void setNewProgramNameAnnotation(String filename,FlowProgramFile flowProgramFile, String controlSystem) throws IOException {
      approved.setProgramName(packageNode.getName());
      approved.setNcNodeId(packageNode.getId());//程序包节点id
      approved.setTitle(props.getTitle());
      approved.setProgrammerId(props.getActProgrammerId());
      approved.setProcessInstanceId(props.getProcessInstanceId());
      approvedService.save(approved);
      try(InputStream ins = ossTemplate.statFileStream(flowProgramFile.getOssName());){
         ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(ins));
         //List<DictBiz> annoDictList = programAnnotationService.getAnnotionDictList();
         AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(controlSystem,this.annotationConfig);
         /*
         AnnotationProperties annoProps = annotationConfig.getConfigMap().get(controlSystem);
         if(annoProps == null){
            annoProps = AnnotationProperties.getDefault();
         }*/
         InputStream finishedStream = annoProcessor.setFilenameAnnotation(filename,byteInputStream);
         //InputStream finishedStream = AnnotationUtil.setAnnotationAndGetInputStream(byteInputStream, "GH", annoProps.getStatusLineIndex(), controlSystem, annoDictList);
         try(finishedStream) {
            finishedStream.reset();
            BladeFile bfile = ossTemplate.putFile(flowProgramFile.getName(), finishedStream);
            //替换原有的文件地址
            flowProgramFile.setOssName(bfile.getName());
            flowProgramFile.setName(filename);
            flowProgramFileService.updateById(flowProgramFile);
         }
      }
   }
}