yangys
2025-09-10 dc01577b31204fd3c80645b45d81ff693f79a985
程序包名增加版次
已添加8个文件
已修改5个文件
403 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationData.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/MachineAnnotationConfig.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/StartDispatcher.java
@@ -21,7 +21,6 @@
import org.springblade.mdm.program.service.ProgramSeqService;
import org.springblade.mdm.utils.EntityUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.flowable.engine.RuntimeService;
import org.springframework.transaction.annotation.Transactional;
@@ -97,7 +96,7 @@
        NcNode curedProgramPackage = null;
        if(!startVO.isTemporaryFlow() && !startVO.isDeviationFlow()) {
            //正常流程(非临时流程) ä¸”不是 åç¦»å•,才匹配固化程序
            curedProgramPackage = ncNodeService.getLastCuredProgramPackageWithoutProcessEdition(programPkgName,startVO.getMachineCode());
            curedProgramPackage = ncNodeService.getLastCuredProgramWithoutProcessEdition(startVO.getDrawingNo(),startVO.getProcessNo(),startVO.getMachineCode());
            //设置是否有固化程序标记
            vars.put(FlowContants.HAS_CURED_PROGRAM, curedProgramPackage != null ? FlowContants.Y : FlowContants.N);
            //工序版次是否一致,是否在有效期内
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/dispatch/NormalFinishDataHandler.java
@@ -1,17 +1,21 @@
package org.springblade.mdm.flow.excution.dispatch;
import com.alibaba.excel.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.entity.FlowProgramFile;
import org.springblade.mdm.flow.service.ApproveRecordService;
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.utils.EntityUtil;
import org.springblade.mdm.utils.ProgramFileNameParser;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@@ -52,7 +56,7 @@
                Integer newVersion = packageNode.genNewVersionNumber();
                packageNode = ncNodeAutoCreateService.createNodeTreeWithProgram(props,newVersion);
            }else{
                //可用,升版(修改其工序版本),原来的节点清除
                //可用,升版(修改其工序版次),原来的节点清除
                moveToNewProcessEdition(packageNode,props);
            }
        }else{
@@ -97,20 +101,31 @@
        packageNode.setProcessEdition(tempProps.getProcessEdition());
        packageNode.setParentId(machineNode.getParentId());
        packageNode.setParentIds(machineNode.getParentIds());
        packageNode.setName(tempProps.getDrawingNo()+"-"+tempProps.getProcessNo()+"-"+tempProps.getProcessEdition());
        this.ncNodeService.updateById(packageNode);
        //移动程序节点
        List<NcNode> programNodes = ncNodeService.getProgramFilesByPackageId(packageNode.getId());
        for(NcNode programNode : programNodes){
            programNode.setName(buildNewFilename(programNode.getName(),tempProps.getProcessEdition()));//名称修改,工序版次部分
            programNode.setParentIds(packageNode.getParentIds()+","+packageNode.getId());
            programNode.setProcessEdition(tempProps.getProcessEdition());//修改工序版次
            programNode.setVersionNumber(packageNode.getVersionNumber());
        }
        ncNodeService.updateBatchById(programNodes);
    }
    String buildNewFilename(String filename,String newProcessEdition){
        ProgramNameVO pnameVO = ProgramFileNameParser.parseProgramName(filename);
        String ext = FilenameUtils.getExtension(filename);
        String name= pnameVO.getDrawingNo()+"-"+pnameVO.getProcessNo()+"-"+newProcessEdition+"-"+pnameVO.getSegmentCount()+"-"+pnameVO.getSegmentNo();
        if(StringUtils.isNotBlank(ext)){
            name += "."+ext;
        }
        return name;
    }
    /**
     * ä¿å­˜å®¡æ‰¹å®Œæˆçš„记录
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/DNCSendBackService.java
@@ -5,6 +5,7 @@
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.base.BizServiceImpl;
@@ -25,6 +26,10 @@
import org.springblade.mdm.program.entity.NcNode;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.service.programannotation.AnnotationProcessor;
import org.springblade.mdm.program.service.programannotation.DefaultProcessor;
import org.springblade.mdm.program.service.programannotation.FanucProcessor;
import org.springblade.mdm.program.service.programannotation.MachineAnnotationConfig;
import org.springblade.mdm.program.vo.DncSendBackData;
import org.springblade.mdm.program.vo.DncSendBackFile;
import org.springblade.mdm.program.vo.ProgramAnnotation;
@@ -36,11 +41,13 @@
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.lang.annotation.Annotation;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;
import java.time.Duration;
import java.util.*;
import java.util.regex.Pattern;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
@@ -62,6 +69,10 @@
    private final DncBackFileService dncBackFileService;
    private final MachineService machineService;
    private final ParamService paramService;
    private final MachineAnnotationConfig machineAnnotationConfig;
    private final FanucProcessor fanucProcessor;
    private final DefaultProcessor defaultProcessor;
    /**
     * åç¦»å•文件末尾的模式:P+数字
     */
@@ -134,12 +145,13 @@
                DncSendBackData progData = new DncSendBackData();
                String folderName = StringUtils.removeEnd(entryName,"/");
                PackageAndProcessEdition pkgAndEdition = parseProgramPackageFromFolderName(folderName);
                String packageName = pkgAndEdition.getProgramPackageName();
                String processEdition = pkgAndEdition.getProcessEdition();
                //PackageAndProcessEdition pkgAndEdition = parseProgramPackageFromFolderName(folderName);
                String packageName = folderName;//pkgAndEdition.getProgramPackageName();
                //String processEdition = pkgAndEdition.getProcessEdition();
                /*
                if(StringUtils.isBlank(packageName) || StringUtils.isBlank(processEdition)){
                    throw new ServiceException("包内文件夹名格式错误应该为[零组件号-工序号-工序版次]:"+folderName);
                }
                    throw new ServiceException("包内文件夹名格式错误,应该为[零组件号-工序号-工序版次]:"+folderName);
                }*/
                progData.setProgramName(packageName);
                String statusLine;
@@ -147,20 +159,32 @@
                if(optFilename.isPresent()){
                    entry = zipFile.getEntry(optFilename.get());
                    InputStream ins = zipFile.getInputStream(entry);
                    ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(ins));;
                    progData.setFileBackTime(DateUtil.fromInstant(entry.getLastModifiedTime().toInstant()));
                    statusLine = FileContentUtil.readLineAt(ins,2);
                    //machineAnnotationConfig.getConfigMap().get(machine.getcon)
                    Pattern fanucPattern = Pattern.compile("^[oO]\\d{4}");
                    String testLine = FileContentUtil.readLineAt(bais,2);//TODO,fanuc这行是下发路径,其他机器是状态
                    bais.reset();
                    //boolean isFanuc = fanucPattern.matcher(testLine).matches();
                    boolean isFanuc = !StringUtils.containsAny(testLine,"(SQ)","(GH)","(PL)");
                    if(isFanuc){
                        statusLine = FileContentUtil.readLineAt(bais,3);//fanuc的状态读第4行
                    }else{
                        statusLine = testLine;
                    }
                    if(statusLine.contains("SQ")){
                        //试切
                        programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName,processEdition);
                        programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);//,processEdition
                    }else if(statusLine.contains("GH")){
                        //固化
                        programPackageNode = ncNodeService.getLastEditionCuredProgramPackage(packageName,processEdition);
                        programPackageNode = ncNodeService.getLastEditionCuredProgramPackage(packageName);
                    }else if(statusLine.contains("PL")){
                        //偏离
                        programPackageNode =ncNodeService.getLastEditionDeviationProgramPackage(packageName,processEdition);
                        programPackageNode =ncNodeService.getLastEditionDeviationProgramPackage(packageName);
                    }else{
                        //查询是否车床,是车床可以放过,按试切处理
                        programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName,processEdition);
                        programPackageNode = ncNodeService.getLastEditionTryingProgramPackage(packageName);
                        if(programPackageNode!=null){
                            Machine machine = machineService.getByCode(programPackageNode.getMachineCode());
                            String chechuangVal = paramService.turninngValue();
@@ -205,10 +229,10 @@
     * @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);
@@ -219,7 +243,7 @@
        result.setProgramPackageName(packageName);
        result.setProcessEdition(processEditon);
        return result;
    }
    }*/
    /**
     * å…¥åº“回传文件,并启动固化流程
@@ -269,8 +293,8 @@
            for(String dir : dirList){
                String folderName = StringUtils.removeEnd(dir,"/");
                PackageAndProcessEdition pkgAndEdition = parseProgramPackageFromFolderName(folderName);
                String programPackageName = pkgAndEdition.getProgramPackageName();
                //PackageAndProcessEdition pkgAndEdition = folderName;//parseProgramPackageFromFolderName(folderName);
                String programPackageName = folderName; //pkgAndEdition.getProgramPackageName();
                Optional<NcNode> optPackageNode = allAcceptPackages.stream().filter(node -> StringUtils.equals(node.getName(),programPackageName)).findFirst();
@@ -414,4 +438,7 @@
    private String programPackageName;
    private String processEdition;
    public String programName(){
        return programPackageName+"-"+processEdition;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcNodeService.java
@@ -197,13 +197,13 @@
     * @param name èŠ‚ç‚¹åç§°
     * @return æœ€æ–°ç‰ˆæœ¬ç¨‹åºæŠ¥åèŠ‚ç‚¹
     */
    public NcNode getLastEditionTryingProgramPackage(String name,String processEdition){
    public NcNode getLastEditionTryingProgramPackage(String name){
        //.or(NcNode::getIsCured,0)
        List<NcNode> pkgList = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, name).and(i->{
                i.eq(NcNode::getIsCured, 0).or().isNull(NcNode::getIsCured);
            }).likeRight(NcNode::getParentIds,"0,1,")
            .eq(NcNode::getIsLastEdition,1).eq(NcNode::getProcessEdition,processEdition).orderByDesc(NcNode::getCreateTime).list();
            .eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list();//.eq(NcNode::getProcessEdition,processEdition)
        if(pkgList.isEmpty()){
            return null;
@@ -253,10 +253,10 @@
     * @param programPkgName
     * @return
     */
    public NcNode getLastEditionCuredProgramPackage(String programPkgName,String processEdition) {
    public NcNode getLastEditionCuredProgramPackage(String programPkgName) {
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, programPkgName).likeRight(NcNode::getParentIds,"0,2,").eq(NcNode::getIsCured,1)
            .eq(NcNode::getProcessEdition, processEdition)
            //.eq(NcNode::getProcessEdition, processEdition)
            .eq(NcNode::getIsLastEdition,1).list();
        if(nodes.isEmpty()){
@@ -292,16 +292,17 @@
    /**
     * èŽ·å–æœ€æ–°çš„å›ºåŒ–ç¨‹åºï¼Œä¸ç”¨å·¥åºç‰ˆæ¬¡åŒ¹é…
     * @param programPkgName
     * @param drawingNo
     * @param processNo
     * @param machineCode
     * @return
     */
    public NcNode getLastCuredProgramPackageWithoutProcessEdition(String programPkgName,String machineCode) {
    public NcNode getLastCuredProgramWithoutProcessEdition(String drawingNo, String processNo, String machineCode) {
        Machine machine = machineService.getByCode(machineCode);
        List<Machine> sameGroupMachines = machineService.lambdaQuery().eq(Machine::getMachineGroupCode,machine.getMachineGroupCode()).list();
        List<String> machineCodesInGroup = sameGroupMachines.stream().map(Machine::getCode).toList();
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, programPkgName)
            .eq(NcNode::getDrawingNo, drawingNo).eq(NcNode::getProcessNo, processNo)
            .likeRight(NcNode::getParentIds,"0,2,").eq(NcNode::getIsCured,1)
            .in(!machineCodesInGroup.isEmpty(),NcNode::getMachineCode,machineCodesInGroup)
            .eq(NcNode::getIsLastEdition,1).orderByDesc(NcNode::getCreateTime).list();
@@ -318,10 +319,10 @@
     * @param programPkgName ç¨‹åºåŒ…名
     * @return åç¦»çš„程序节点
     */
    public NcNode getLastEditionDeviationProgramPackage(String programPkgName,String processEdition) {
    public NcNode getLastEditionDeviationProgramPackage(String programPkgName) {//,String processEdition
        List<NcNode> nodes = lambdaQuery().eq(NcNode::getNodeType,NcNode.TYPE_PROGRAM_PACKAGE)
            .eq(NcNode::getName, programPkgName)
            .eq(NcNode::getProcessEdition, processEdition)
            //.eq(NcNode::getProcessEdition, processEdition)
            .likeRight(NcNode::getParentIds,"0,3,")
            .eq(NcNode::getIsLastEdition,1).list();
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -17,6 +17,10 @@
import org.springblade.mdm.program.entity.NcProgramApproved;
import org.springblade.mdm.program.entity.NcProgramExchange;
import org.springblade.mdm.program.mapper.NcProgramExchangeMapper;
import org.springblade.mdm.program.service.programannotation.AnnotationData;
import org.springblade.mdm.program.service.programannotation.AnnotationProcessor;
import org.springblade.mdm.program.service.programannotation.MachineAnnotationConfig;
import org.springblade.mdm.program.service.programannotation.ProcessorHelper;
import org.springblade.system.feign.IDictClient;
import org.springblade.system.pojo.entity.DictBiz;
import org.springframework.stereotype.Service;
@@ -44,7 +48,7 @@
    private final FlowProgramFileService flowProgramFileService;
    private final ProgramAnnotationService programAnnotationService;
    private final MachineAnnotationConfig annotationConfig;
    /**
     * å¯¼å‡ºdnc压缩包
     * @param approvedIdArray å¾…导出审批表id数组
@@ -75,7 +79,7 @@
    private void addProgramPackageToZip(ZipOutputStream zipOut, NcProgramApproved approved) throws IOException{
        NcNode packageNode = ncNodeService.getById(approved.getNcNodeId());
        String packageFolder = packageNode.getName()+"-"+packageNode.getProcessEdition()+"/";
        String packageFolder = packageNode.getName()+"/";
        ZipEntry zipEntry = new ZipEntry(packageFolder);// "/"结尾表示文件夹
        zipOut.putNextEntry(zipEntry);
        zipOut.closeEntry();
@@ -97,13 +101,23 @@
            deviationSerial = ncNodeService.getDeviationSerialForNode(packageNode);
        }
        List<DictBiz> annotationDictList= programAnnotationService.getAnnotionDictList();
        //List<DictBiz> annotationDictList= programAnnotationService.getAnnotionDictList();
        for (NcNode node : programNodes) {
            String filePathInZip = genFilePathInZip(packageFolder,node,deviationSerial);
            programFile = this.flowProgramFileService.getById(node.getFlowProgramFileId());
            if(programFile.isProgram()) {//程序文件,才会加入压缩包
                InputStream inputStream = ossTemplate.statFileStream(programFile.getOssName());
                String sendDir = machine.getProgSendDir()==null? StringUtil.EMPTY:machine.getProgSendDir();
                AnnotationProcessor annoProcessor = ProcessorHelper.getProcessor(machine.getControlSystem(),annotationConfig);
                AnnotationData annoData = new AnnotationData();
                annoData.setSendPath(sendDir);
                annoData.setProgramStatus(status);
                annoData.setDeviation(programPackageNode.getDeviation());
                annoData.setFilename(programFile.getName());
                InputStream addedInsFinal = annoProcessor.setAnnotation(annoData,inputStream);
                addedInsFinal.reset();
                /*
                InputStream addedInsFinal;
                InputStream addedIns2 = programAnnotationService.setSendDirAndStatusAnnotation(sendDir,status,inputStream,machine.getControlSystem());
                if(StringUtils.isNotBlank(programPackageNode.getDeviation())) {
@@ -111,7 +125,7 @@
                    addedInsFinal = programAnnotationService.setPldAnnotation(programPackageNode.getDeviation(),addedIns2, machine.getControlSystem(), annotationDictList);;
                }else{
                    addedInsFinal = addedIns2;
                }
                }*/
                this.addInputStreamToZip(zipOut, addedInsFinal, filePathInZip);
            }
        }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AbstractProcessor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,69 @@
package org.springblade.mdm.program.service.programannotation;
import org.apache.commons.io.IOUtils;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.system.pojo.entity.DictBiz;
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.util.List;
public abstract class AbstractProcessor implements AnnotationProcessor{
    @Autowired
    private ProgramAnnotationService programAnnotationService;
    protected AnnotationProperties annotationProperties;
    @Override
    public InputStream setAnnotation(AnnotationData annoData,InputStream inputStream) throws IOException {
        List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
        InputStream finishedStream;
        try(inputStream){
            ByteArrayInputStream byteInputStream =  new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
            //1加入发送路径的注释
            String sendPathAnnotation = generateAnnotation(annoData.getSendPath(),getControlSystem(),annoDicts);//加了注释之后的文本
            String sendDirLine = FileContentUtil.readLineAt(byteInputStream,annotationProperties.getSendPathLineIndex());//第2行是发送路径
            byteInputStream.reset();
            String statusLine = FileContentUtil.readLineAt(byteInputStream,annotationProperties.getStatusLineIndex());//状态注释
            byteInputStream.reset();
            InputStream insAfterSetSendDir ;
            if(isAnnotation(sendDirLine,getControlSystem(),annoDicts)){
                insAfterSetSendDir = FileContentUtil.replaceAtLine(byteInputStream,annotationProperties.getSendPathLineIndex(),sendPathAnnotation);
            }else{
                insAfterSetSendDir = FileContentUtil.insertLine(byteInputStream,annotationProperties.getSendPathLineIndex(),sendPathAnnotation);
            }
            insAfterSetSendDir.reset();
            //加入状态注释行
            String statusAnnotation = generateAnnotation(annoData.getProgramStatus(),getControlSystem(),annoDicts);//注释后的状态文本
            if(isAnnotation(statusLine,getControlSystem(),annoDicts)){
                finishedStream = FileContentUtil.replaceAtLine(insAfterSetSendDir,annotationProperties.getStatusLineIndex(),statusAnnotation);
            }else{
                finishedStream = FileContentUtil.insertLine(insAfterSetSendDir,annotationProperties.getStatusLineIndex(),statusAnnotation);
            }
        }
        return finishedStream;
    }
    @Override
    public abstract void setControlSystem(String controlSystemDictVal) ;
    @Override
    public void setAnnotationProperties(AnnotationProperties annotationProperties) {
        this.annotationProperties= annotationProperties;
    }
    public abstract String getControlSystem();
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationData.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package org.springblade.mdm.program.service.programannotation;
import lombok.Data;
@Data
public class AnnotationData {
    /**
     * ä¸‹å‘路径
     */
    private String filename;
    /**
     * ä¸‹å‘路径
     */
    private String sendPath;
    /**
     * ç¨‹åºçŠ¶æ€
     */
    private String programStatus;
    /**
     * åç¦»å•号
     */
    private String deviation;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProcessor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,58 @@
package org.springblade.mdm.program.service.programannotation;
import org.apache.commons.lang3.StringUtils;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.program.vo.ProgramAnnotation;
import org.springblade.system.pojo.entity.DictBiz;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.Optional;
public interface AnnotationProcessor {
    static final String DEFAULT_ANNOTATION_SETTING = "(,)";
    default String generateAnnotation(String oriTest, String systemDictVal, List<DictBiz> annotationList) {
        ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
        return progAnnotation.addAnnotation(oriTest);
    }
    default boolean isAnnotation(String line,String systemDictVal,List<DictBiz> annotationList){
        ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(systemDictVal,annotationList);
        line = StringUtils.trim(line);//去首尾空格
        return progAnnotation.isAnnotation(line);
    }
    default 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;
    }
    void setControlSystem(String controlSystemDictVal);
    void setAnnotationProperties(AnnotationProperties annotationProperties);
    String getControlSystem();
    InputStream setAnnotation(AnnotationData annoData,InputStream inputStream) throws IOException;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/AnnotationProperties.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package org.springblade.mdm.program.service.programannotation;
import lombok.Data;
@Data
public class AnnotationProperties {
    private String beanId;
    private int sendPathLineIndex;
    private int statusLineIndex;
    private int deviationLineIndex;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/DefaultProcessor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
package org.springblade.mdm.program.service.programannotation;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("defaultProcessor")
public class DefaultProcessor extends AbstractProcessor{
    @Autowired
    private ProgramAnnotationService programAnnotationService;
    private String controlSystem;
    private AnnotationProperties annotationPropreties;
    @Override
    public void setControlSystem(String controlSystemDictVal) {
        this.controlSystem = controlSystemDictVal;
    }
    @Override
    public void setAnnotationProperties(AnnotationProperties annotationProperties) {
        this.annotationPropreties= annotationProperties;
    }
    @Override
    public String getControlSystem() {
        return this.controlSystem;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/FanucProcessor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,54 @@
package org.springblade.mdm.program.service.programannotation;
import com.qiniu.util.IOUtils;
import org.apache.commons.io.FilenameUtils;
import org.springblade.mdm.program.service.ProgramAnnotationService;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.system.pojo.entity.DictBiz;
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.util.List;
import java.util.regex.Pattern;
@Component("fanucProcessor")
public class FanucProcessor  extends AbstractProcessor{
    @Autowired
    private ProgramAnnotationService programAnnotationService;
    private String controlSystem;
    //AnnotationProperties annotationProperties;
    private Pattern PATTERN = Pattern.compile("^[oO]\\d{4}");
    private final int O_LINE = 1;
    @Override
    public InputStream setAnnotation(AnnotationData annoData,InputStream inputStream) throws IOException {
        //在O0001 è¿™ç§æ–‡å­—后面增加文件名(不带扩展名)
        ByteArrayInputStream bais = new ByteArrayInputStream(IOUtils.toByteArray(inputStream));
        String line = FileContentUtil.readLineAt(bais,O_LINE);
        bais.reset();
        boolean oMatched = PATTERN.matcher(line).matches();
        InputStream ins1;
        if(oMatched){
            List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
            String newline =  line + generateAnnotation(FilenameUtils.removeExtension(annoData.getFilename()),getControlSystem(),annoDicts);
            ins1 = FileContentUtil.replaceAtLine(bais,O_LINE,newline);
        }else{
            ins1 = bais;
        }
        return super.setAnnotation(annoData, ins1);
    }
    @Override
    public void setControlSystem(String controlSystemDictVal) {
        this.controlSystem = controlSystemDictVal;
    }
    @Override
    public String getControlSystem() {
        return this.controlSystem;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/MachineAnnotationConfig.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package org.springblade.mdm.program.service.programannotation;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.Map;
@Configuration
@ConfigurationProperties(prefix = "program-annotation")
@Data
public class MachineAnnotationConfig {
    private Map<String, AnnotationProperties> configMap;
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/programannotation/ProcessorHelper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.springblade.mdm.program.service.programannotation;
import org.springblade.core.tool.utils.SpringUtil;
/**
 * è´Ÿè´£åˆ‡æ¢åˆé€‚的注释处理器
 */
public class ProcessorHelper {
    public static AnnotationProcessor getProcessor(String controlSystem,MachineAnnotationConfig config){
        AnnotationProperties props = config.getConfigMap().get(controlSystem);
        AnnotationProcessor processor;
        if(props != null){
            processor = SpringUtil.getBean(props.getBeanId());
        }else{
            processor = SpringUtil.getBean(DefaultProcessor.class);
        }
        processor.setAnnotationProperties(props);
        return processor;
    }
}