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.jetbrains.annotations.NotNull; import org.springblade.core.tool.api.R; 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; /** * 下发/回传程序统计 * * @author yangys */ @Slf4j @Service public class ProgramAnnotationService { @Autowired 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; /** * 偏离单注释行索引号 0 based */ public static final int STATUS_DEVIATION_INDEX = 3; public static final String SQ = "SQ"; public static final String GH = "GH"; public static final String PL = "PL"; public List getAnnotionList(){ List annotationList; //R> dictsResult = dictClient.getList(ANNOTATION_DICT); R> dictBizResult = bizDictClient.getList(ANNOTATION_DICT); R> gr = bizDictClient.getList("machine_group"); R> gcate = bizDictClient.getList("org_category"); if(dictBizResult.isSuccess()) { annotationList = dictBizResult.getData(); }else{ annotationList = Collections.emptyList(); } return annotationList; } /** * 判断一行文本是否是注释 * @param line * @param annotationList 注释注释字典项列表 * @return */ public boolean isAnnotation(String line,String machineGroupCode,List annotationList){ boolean isAnno = false; Optional dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst(); String annotationSetting = DEFAULT_ANNOTATION_SETTING; if(dictOpt.isPresent()) { annotationSetting = dictOpt.get().getRemark(); } String begin = ""; String end = ""; String[] arr = annotationSetting.split(","); if(arr.length == 2){ 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 annotationList) { String annotation = oriTest; String begin = "("; String end = ")"; Optional dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst(); String annotationSetting = DEFAULT_ANNOTATION_SETTING; if(dictOpt.isPresent()) { annotationSetting = dictOpt.get().getRemark(); } String[] arr = StringUtils.split(annotationSetting,","); if(arr.length == 2){ begin = arr[0]; end = arr[1]; }else if(arr.length == 1){ begin = begin = arr[0]; end = ""; } annotation = begin + oriTest + end; return annotation; } public String[] getAnnotationStartAndEnd(String machineGroupCode,List annotationList) { String begin = "("; String end = ")"; Optional dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst(); String annotationSetting = DEFAULT_ANNOTATION_SETTING; if(dictOpt.isPresent()) { annotationSetting = dictOpt.get().getRemark(); } String[] arr = StringUtils.split(annotationSetting,","); if(arr.length == 2){ begin = arr[0]; end = arr[1]; }else if(arr.length == 1){ begin = arr[0]; end = ""; } return new String[]{begin,end}; } public String removeAnnotation(String machineGroupCode,String text,String begin,String end){ List annoDicts = getAnnotionList(); String[] arr = getAnnotationStartAndEnd(machineGroupCode,annoDicts); return removeAnnotationInner(text,begin,end); } public static String removeAnnotationInner(String text,String begin,String end){ String temp = StringUtils.removeEnd(StringUtils.removeStart(text,begin),end); return temp; } /** * 设置固化注释行 * @param inputStream * @param machineGroup * @param annoDictList * @return * @throws IOException */ public InputStream setGHAnnotation(InputStream inputStream, String machineGroup,List annoDictList) throws IOException { return setAnnotationAndGetInputStream(inputStream, machineGroup, annoDictList, GH, STATUS_LINE_INDEX); } /** * 设置偏离单注释 * @param inputStream * @param machineGroup * @param annoDictList * @return * @throws IOException */ public InputStream setPldAnnotation(String deviation,InputStream inputStream,String machineGroup,List annoDictList) throws IOException { // return setAnnotationAndGetInputStream(inputStream, machineGroup, annoDictList, deviation, STATUS_DEVIATION_INDEX); } @NotNull private InputStream setAnnotationAndGetInputStream(InputStream inputStream, String machineGroup, List annoDictList, String text, int lineIndex) throws IOException { InputStream finishedStream; try(inputStream){ ByteArrayInputStream byteInputStream = new ByteArrayInputStream(IOUtils.toByteArray(inputStream)); String annoTxt = generateAnnotation(text,machineGroup,annoDictList);//加了注释之后的文本 String lineText = FileContentUtil.readLineAt(byteInputStream, lineIndex); byteInputStream.reset(); if(isAnnotation(lineText,machineGroup,annoDictList)){ finishedStream = FileContentUtil.replaceAtLine(byteInputStream, lineIndex,annoTxt); }else{ finishedStream = FileContentUtil.insertLine(byteInputStream, lineIndex,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 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; } }