yangys
2025-08-22 ddafa0375398053baaafdee8612f68c1b75ff7cb
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java
@@ -2,13 +2,18 @@
package org.springblade.mdm.program.service;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.tool.api.R;
import org.springblade.system.feign.IDictClient;
import org.springblade.system.pojo.entity.Dict;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.system.feign.IDictBizClient;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
@@ -23,17 +28,32 @@
public class ProgramAnnotationService {
   @Autowired
   private IDictClient dictClient;
   private IDictBizClient bizDictClient;
   private static final String DEFAULT_ANNOTATION_SETTING = "(,)";
   public static final String ANNOTATION_DICT = "machine_annotation";
   /**
    * 发送目录行索引(第2行) 0 based
    */
   public static final int SENDPATH_LINE_INDEX = 1;
   /**
    * 状态行索引(第三行) 0 based
    */
   public static final int STATUS_LINE_INDEX = 2;
   public List<Dict> getAnnotionList(){
      List<Dict> annotationList;
      R<List<Dict>> dictsResult = dictClient.getList(ANNOTATION_DICT);
      if(dictsResult.isSuccess()) {
         annotationList = dictsResult.getData();
   public static final String SQ = "SQ";
   public static final String GH = "GH";
   public static final String PL = "PL";
   public List<DictBiz> getAnnotionList(){
      List<DictBiz> annotationList;
      //R<List<Dict>> dictsResult = dictClient.getList(ANNOTATION_DICT);
      R<List<DictBiz>> dictBizResult = bizDictClient.getList(ANNOTATION_DICT);
      R<List<DictBiz>> gr = bizDictClient.getList("machine_group");
      R<List<DictBiz>> gcate = bizDictClient.getList("org_category");
      if(dictBizResult.isSuccess()) {
         annotationList = dictBizResult.getData();
      }else{
         annotationList = Collections.emptyList();
      }
@@ -48,9 +68,9 @@
    * @param annotationList 注释注释字典项列表
    * @return
    */
   public boolean isAnnotation(String line,String machineGroupCode,List<Dict> annotationList){
   public boolean isAnnotation(String line,String machineGroupCode,List<DictBiz> annotationList){
      boolean isAnno = false;
      Optional<Dict> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
      Optional<DictBiz> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
      String annotationSetting = DEFAULT_ANNOTATION_SETTING;
      if(dictOpt.isPresent()) {
         annotationSetting = dictOpt.get().getRemark();
@@ -62,19 +82,19 @@
         begin = arr[0];
         end = arr[1];
      }
      line = StringUtils.trim(line);//去首尾空格
      isAnno = StringUtils.startsWith(line,begin) && StringUtils.endsWith(line,end);
      return isAnno;
   }
   public String generateAnnotation(String oriTest,String machineGroupCode,List<Dict> annotationList) {
   public String generateAnnotation(String oriTest,String machineGroupCode,List<DictBiz> annotationList) {
      String annotation = oriTest;
      String begin = "(";
      String end = ")";
      Optional<Dict> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
      Optional<DictBiz> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
      String annotationSetting = DEFAULT_ANNOTATION_SETTING;
      if(dictOpt.isPresent()) {
         annotationSetting = dictOpt.get().getRemark();
@@ -92,12 +112,12 @@
      return annotation;
   }
   public String[] getAnnotationStartAndEnd(String machineGroupCode,List<Dict> annotationList) {
   public String[] getAnnotationStartAndEnd(String machineGroupCode,List<DictBiz> annotationList) {
      String begin = "(";
      String end = ")";
      Optional<Dict> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
      Optional<DictBiz> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
      String annotationSetting = DEFAULT_ANNOTATION_SETTING;
      if(dictOpt.isPresent()) {
         annotationSetting = dictOpt.get().getRemark();
@@ -107,7 +127,7 @@
         begin = arr[0];
         end = arr[1];
      }else if(arr.length == 1){
         begin = begin = arr[0];
         begin = arr[0];
         end = "";
      }
@@ -116,7 +136,7 @@
   }
   public String removeAnnotation(String machineGroupCode,String text,String begin,String end){
      List<Dict> annoDicts = getAnnotionList();
      List<DictBiz> annoDicts = getAnnotionList();
      String[] arr = getAnnotationStartAndEnd(machineGroupCode,annoDicts);
      return removeAnnotationInner(text,begin,end);
   }
@@ -125,5 +145,82 @@
      String temp = StringUtils.removeEnd(StringUtils.removeStart(text,begin),end);
      return temp;
   }
   /**
    * 设置固化注释行
    * @param inputStream
    * @param machineGroup
    * @param annoDicts
    * @return
    * @throws IOException
    */
   public InputStream setGHAnnotation(InputStream inputStream, String machineGroup,List<DictBiz> annoDicts) throws IOException {
      //
      InputStream finishedStream;
      try(inputStream){
         ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
         String annoTxt = generateAnnotation(GH,machineGroup,annoDicts);//加了注释之后的文本
         String lineText = FileContentUtil.readLineAt(byteInputStream,STATUS_LINE_INDEX);//第三行应该是状态注释
         byteInputStream.reset();
         if(isAnnotation(lineText,machineGroup,annoDicts)){
            finishedStream = FileContentUtil.replaceAtLine(byteInputStream,STATUS_LINE_INDEX,annoTxt);
         }else{
            finishedStream = FileContentUtil.insertLine(byteInputStream,STATUS_LINE_INDEX,annoTxt);
         }
         finishedStream.reset();
      }
      return finishedStream;
   }
   /**
    * 为输入流设置发送目录(第二行)和状态(第三行)
    * @param sendPath 发送路径
    * @param statusText 状态文本
    * @param inputStream 输入流
    * @param machineGroup 机床组代码
    * @return 加好发送路径和状态文本的输入流
    * @throws IOException
    */
   public InputStream setSendDirAndStatusAnnotation(String sendPath,String statusText,InputStream inputStream, String machineGroup) throws IOException {
      List<DictBiz> annoDicts = getAnnotionList();
      InputStream finishedStream;
      try(inputStream){
         ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
         //1加入发送路径的注释
         String sendPathAnnotation = generateAnnotation(sendPath,machineGroup,annoDicts);//加了注释之后的文本
         InputStream insAfterSetSendDir ;
         String sendDirLine = FileContentUtil.readLineAt(byteInputStream,SENDPATH_LINE_INDEX);//第2行是发送路径
         byteInputStream.reset();
         String statusLine = FileContentUtil.readLineAt(byteInputStream,STATUS_LINE_INDEX);//第三行是状态注释
         byteInputStream.reset();
         if(isAnnotation(sendDirLine,machineGroup,annoDicts)){
            insAfterSetSendDir = FileContentUtil.replaceAtLine(byteInputStream,SENDPATH_LINE_INDEX,sendPathAnnotation);
         }else{
            insAfterSetSendDir = FileContentUtil.insertLine(byteInputStream,SENDPATH_LINE_INDEX,sendPathAnnotation);
         }
         insAfterSetSendDir.reset();
         //加入状态注释行
         String statusAnnotation = generateAnnotation(statusText,machineGroup,annoDicts);//注释后的状态文本
         if(isAnnotation(statusLine,machineGroup,annoDicts)){
            finishedStream = FileContentUtil.replaceAtLine(insAfterSetSendDir,STATUS_LINE_INDEX,statusAnnotation);
         }else{
            finishedStream = FileContentUtil.insertLine(insAfterSetSendDir,STATUS_LINE_INDEX,statusAnnotation);
         }
      }
      return finishedStream;
   }
}