|
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.log.exception.ServiceException;
|
import org.springblade.core.tool.api.R;
|
import org.springblade.mdm.program.service.programannotation.AnnotationUtil;
|
import org.springblade.mdm.program.vo.ProgramAnnotation;
|
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 = 2;
|
/**
|
* 状态行索引(第三行) 0 based
|
*/
|
//public static final int STATUS_LINE_INDEX = 3;
|
|
/**
|
* 偏离单注释行索引号 0 based
|
*/
|
//public static final int STATUS_DEVIATION_INDEX = 4;
|
|
|
|
public List<DictBiz> getAnnotionDictList(){
|
List<DictBiz> annotationList;
|
|
R<List<DictBiz>> dictBizResult = bizDictClient.getList(ANNOTATION_DICT);
|
if(dictBizResult.isSuccess()) {
|
annotationList = dictBizResult.getData();
|
}else{
|
annotationList = Collections.emptyList();
|
}
|
|
return annotationList;
|
}
|
|
|
/**
|
* 判断一行文本是否是注释
|
* @param line
|
* @param annotationList 注释注释字典项列表
|
* @return
|
*/
|
/*
|
public boolean isAnnotation(String line,String systemDictVal,List<DictBiz> annotationList){
|
ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
|
|
line = StringUtils.trim(line);//去首尾空格
|
return progAnnotation.isAnnotation(line);
|
}
|
|
|
|
public String generateAnnotation(String oriTest,String systemDictVal,List<DictBiz> annotationList) {
|
ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
|
return progAnnotation.addAnnotation(oriTest);
|
}*/
|
|
/**
|
* 提取注释中的文本
|
* @param systemDictVal 机床组代码
|
* @param text 清除注释标记
|
* @return 清除后的文本
|
*/
|
|
public String removeAnnotation(String systemDictVal,String text){
|
List<DictBiz> annoDicts = getAnnotionDictList();
|
return removeAnnotation(systemDictVal,text,annoDicts);
|
}
|
public String removeAnnotation(String systemDictVal,String text,List<DictBiz> annotatiionList){
|
ProgramAnnotation panno = AnnotationUtil.getProgramAnnotationFormat(systemDictVal,annotatiionList);
|
return panno.cleanAnnotation(text);
|
}
|
/**
|
* 设置固化注释行
|
* @param inputStream 输入框
|
* @param systemDictVal 机床组编码
|
* @param annoDictList 注释字典配置
|
* @return 加好注释的
|
* @throws IOException
|
*/
|
/*
|
public InputStream setGHAnnotation(InputStream inputStream, String systemDictVal,List<DictBiz> annoDictList) throws IOException {
|
return setAnnotationAndGetInputStream(inputStream, systemDictVal, annoDictList, GH, STATUS_LINE_INDEX);
|
}*/
|
|
/**
|
* 设置偏离单注释
|
* @param inputStream 文本输入流
|
* @param systemDictVal 控制系统字典值
|
* @param annoDictList 注释字典配置
|
* @return 加好注释的输入流
|
* @throws IOException 访问流可能抛出异常
|
*/
|
/*
|
public InputStream setPldAnnotation(String deviation,InputStream inputStream,String systemDictVal,List<DictBiz> annoDictList) throws IOException {
|
return setAnnotationAndGetInputStream(inputStream, systemDictVal, annoDictList, deviation, STATUS_DEVIATION_INDEX);
|
}
|
*/
|
/*
|
@NotNull
|
private InputStream setAnnotationAndGetInputStream(InputStream inputStream, String systemDictVal, List<DictBiz> annoDictList, String text, int lineIndex) throws IOException {
|
InputStream finishedStream;
|
try(inputStream){
|
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
|
|
String annoTxt = generateAnnotation(text,systemDictVal,annoDictList);//加了注释之后的文本
|
|
String lineText = FileContentUtil.readLineAt(byteInputStream, lineIndex);
|
byteInputStream.reset();
|
|
if(isAnnotation(lineText,systemDictVal,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 systemDictVal 控制系统代码
|
* @return 加好发送路径和状态文本的输入流
|
* @throws IOException
|
*/
|
/*
|
public InputStream setSendDirAndStatusAnnotation(String sendPath,String statusText,InputStream inputStream, String systemDictVal) throws IOException {
|
List<DictBiz> annoDicts = getAnnotionDictList();
|
|
InputStream finishedStream;
|
try(inputStream){
|
ByteArrayInputStream byteInputStream = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
|
|
//1加入发送路径的注释
|
String sendPathAnnotation = generateAnnotation(sendPath,systemDictVal,annoDicts);//加了注释之后的文本
|
|
String sendDirLine = FileContentUtil.readLineAt(byteInputStream,SENDPATH_LINE_INDEX);//第2行是发送路径
|
byteInputStream.reset();
|
String statusLine = FileContentUtil.readLineAt(byteInputStream,STATUS_LINE_INDEX);//第三行是状态注释
|
byteInputStream.reset();
|
|
InputStream insAfterSetSendDir ;
|
if(isAnnotation(sendDirLine,systemDictVal,annoDicts)){
|
insAfterSetSendDir = FileContentUtil.replaceAtLine(byteInputStream,SENDPATH_LINE_INDEX,sendPathAnnotation);
|
}else{
|
insAfterSetSendDir = FileContentUtil.insertLine(byteInputStream,SENDPATH_LINE_INDEX,sendPathAnnotation);
|
}
|
|
insAfterSetSendDir.reset();
|
//加入状态注释行
|
String statusAnnotation = generateAnnotation(statusText,systemDictVal,annoDicts);//注释后的状态文本
|
if(isAnnotation(statusLine,systemDictVal,annoDicts)){
|
finishedStream = FileContentUtil.replaceAtLine(insAfterSetSendDir,STATUS_LINE_INDEX,statusAnnotation);
|
}else{
|
finishedStream = FileContentUtil.insertLine(insAfterSetSendDir,STATUS_LINE_INDEX,statusAnnotation);
|
}
|
}
|
|
return finishedStream;
|
}*/
|
|
/**
|
* 解析出机床程序注释的格式
|
* @param systemDictVal 数控系统字典值
|
* @param annoDictList 配置的注释字典数据
|
* @return
|
*/
|
/*
|
ProgramAnnotation getProgramAnnotationFormat(String systemDictVal,List<DictBiz> annoDictList){
|
String begin;
|
String end;
|
|
Optional<DictBiz> dictOpt = annoDictList.stream().filter(dict -> {return dict.getDictKey().equals(systemDictVal);}).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 = "";
|
}else{
|
throw new ServiceException("注释格式配置错误,应该为1到2段,中间用逗号分隔");
|
}
|
|
ProgramAnnotation programAnnotation = new ProgramAnnotation();
|
programAnnotation.setBegin(begin);
|
programAnnotation.setEnd(end);
|
return programAnnotation;
|
}*/
|
}
|