yangys
2025-09-18 0d61b9bfca526e9c3da2209de8f9f367e76fd013
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DncBackFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,204 @@
package org.springblade.mdm.program.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.HistoryService;
import org.flowable.engine.ProcessEngine;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.oss.model.BladeFile;
import org.springblade.core.tool.utils.FileUtil;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.FlowBusinessService;
import org.springblade.mdm.program.entity.DncBackFile;
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.mapper.DncBackFileMapper;
import org.springblade.mdm.program.vo.DncBackFileQueryVO;
import org.springblade.mdm.program.vo.DncBackFileVO;
import org.springblade.mdm.program.vo.DncSendBackFile;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.mdm.utils.ZipTextFileContentUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import java.util.Optional;
import java.util.zip.ZipEntry;
/**
 * DNC回传文件处理服务
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class DncBackFileService extends BizServiceImpl<DncBackFileMapper, DncBackFile> {
   private final NcNodeService ncNodeService;
   private final OssTemplate ossTemplate;
   private final HistoryService historyService;
   private final FlowBusinessService businessService;
   public IPage<DncBackFileVO> pageQuery(DncBackFileQueryVO query) {
      IPage<DncBackFileVO> page=  this.baseMapper.pageQuery(Condition.getPage(query),query);
      page.getRecords().forEach(item->{
         item.setProcessExecuted(isProcessExecuted(item.getProcessInstanceId()));
      });
      return page;
   }
   /**
    * æ£€æŸ¥æµç¨‹å®žä¾‹æ˜¯å¦è¢«æ‰§è¡Œè¿‡ï¼ˆé€šè¿‡åŽ†å²è®°å½•ï¼‰
    */
   public boolean isProcessExecuted(String processInstanceId) {
      // æ£€æŸ¥æ˜¯å¦æœ‰åŽ†å²æ´»åŠ¨è®°å½•
      /*
      long activityCount = historyService.createHistoricActivityInstanceQuery()
         .processInstanceId(processInstanceId)
         .count();
   */
      // æ£€æŸ¥æ˜¯å¦æœ‰åŽ†å²ä»»åŠ¡è®°å½•
      long taskCount = historyService.createHistoricTaskInstanceQuery()
         .processInstanceId(processInstanceId)
         .count();
      //多于一个任务被处理,说明至少流转到第二个节点了
      return taskCount > 1;
   }
   /**
    * å–消流程
    * @param id å›žä¼ è®°å½•id
    */
   @Transactional
   public void cancelProcess(long id) {
      DncBackFile backFIle = this.getById(id);
      NcNode packageNode = ncNodeService.getById(backFIle.getNcNodeId());
      //多于一个任务被处理,说明至少流转到第二个节点了
      if(isProcessExecuted(packageNode.getProcessInstanceId())){
         throw new ServiceException("流程已经开始处理,不可取消");
      }
      businessService.deleteProcessInstance(packageNode.getProcessInstanceId());
      this.baseMapper.deleteById(id);
   }
   /**
    * èŽ·å–å›žä¼ è®°å½•çš„æ–‡ä»¶åˆ—è¡¨
    * @param id å›žä¼ è®°å½•id
    * @return
    */
   public List<DncSendBackFile> filesById(long id) throws IOException {
      List<DncSendBackFile> fileList = new ArrayList<>();
      DncBackFile backFIle = this.getById(id);
      InputStream inputStream = this.ossTemplate.statFileStream(backFIle.getOssName());
      Path tempZipFile = createTempFile(inputStream);
      List<String> entryNameList = new ArrayList<>();
      NcNode packageNode =  this.ncNodeService.getById(backFIle.getNcNodeId());
      String targetFolder = packageNode.getName()+"-"+packageNode.getProcessEdition()+"/";
      ZipEntry entry;
      try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
         Enumeration<? extends ZipEntry> entries = zipFile.entries();
         while(entries.hasMoreElements()) {
            entry = entries.nextElement();
            if(!entry.isDirectory() && entry.getName().startsWith(targetFolder)){
               //这里面之前时入库的文件
               DncSendBackFile file = new DncSendBackFile();
               file.setName(entry.getName().substring(targetFolder.length()));
               file.setEntryName(entry.getName());
               fileList.add(file);
            }
         }
      }
      return fileList;
   }
   Path createTempFile(InputStream inputStream) throws IOException {
      byte[] zipData = FileUtil.copyToByteArray(inputStream);
      Path tempFile = Files.createTempFile("tempzip"+System.currentTimeMillis(), ".zip");
      // å†™å…¥å­—节数据到临时文件
      Files.write(tempFile, zipData, StandardOpenOption.WRITE);
      return tempFile;
   }
   /**
    * ä»Žæ–‡ä»¶å¤¹åè§£æžå‡ºç¨‹åºåŒ…名和和工序版次
    * @param folderName æ–‡ä»¶å¤¹å
    * @return ç»“构数据
    */
   PackageAndProcessEdition parseProgramPackageFromFolderName(String folderName){
      int index = StringUtils.lastIndexOf(folderName,'-');
      String processEditon = "";
      String temp;
      String packageName = "";
      if(index != -1){
         processEditon = folderName.substring(index+1);
         packageName = folderName.substring(0,index);
      }
      PackageAndProcessEdition result = new PackageAndProcessEdition();;
      result.setProgramPackageName(packageName);
      result.setProcessEdition(processEditon);
      return result;
   }
   /**
    * èŽ·å–åŽ†å²è®°å½•ä¸­çš„æ–‡ä»¶å†…å®¹
    * @param id å›žä¼ åŽ†å²è®°å½•id
    * @param entryName åŽ‹ç¼©åŒ…æ–‡ä»¶è·¯å¾„
    * @return
    */
   public String getEntryFileContent(long id, String entryName) throws IOException {
      DncBackFile backFIle = this.getById(id);
      return ZipTextFileContentUtil.getTextContent(this.ossTemplate.statFileStream(backFIle.getOssName()),entryName);
      /*
      try(InputStream inputStream = this.ossTemplate.statFileStream(backFIle.getOssName());){
         Path tempZipFile = createTempFile(inputStream);
         ZipEntry entry;
         try (java.util.zip.ZipFile zipFile = new java.util.zip.ZipFile(tempZipFile.toFile())) {
            Enumeration<? extends ZipEntry> entries = zipFile.entries();
            while (entries.hasMoreElements()) {
               entry = entries.nextElement();
               if (!entryName.equals(entry.getName())) {
                  continue;
               }
               try (InputStream fileIns = zipFile.getInputStream(zipFile.getEntry(entryName))) {
                  ByteArrayInputStream bos = new ByteArrayInputStream(fileIns.readAllBytes());
                  boolean isText = StringUtils.endsWithIgnoreCase(entryName,".txt") || StringUtils.endsWithIgnoreCase(entryName,".nc")|| StringUtils.endsWithIgnoreCase(entryName,".xml");
                  if(!isText) {
                     isText = FileContentUtil.isTextFile(bos);
                  }
                  if (isText) {
                     bos.reset();
                     result = FileContentUtil.getContentFromStream(bos);
                  } else {
                     result = "<非文本文件>";
                  }
               }
            }
         }
      }*/
   }
}