yangys
2025-08-29 70b4334de4fb9a7055fc4e6956f8666ebe867b94
注释功能调整
已添加1个文件
已修改8个文件
330 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/TaskDispatchService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/ProgramAnnotation.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/excution/cure/NormalCureFinishDataHandler.java
@@ -152,7 +152,7 @@
        nodeService.updateBatchById(historyProgramPackageNodes);
        Machine machine = machineService.getByCode(cureNode.getMachineCode());
        List<DictBiz> annoDicts = programAnnotationService.getAnnotionList();
        List<DictBiz> annoDicts = programAnnotationService.getAnnotionDictList();
        //新的流程文件,需要在包节点下新建,不能用老的
        List<FlowProgramFile> files = flowProgramFileService.lambdaQuery().eq(FlowProgramFile::getProcessInstanceId,pkgNode1.getProcessInstanceId()).list();
        for(FlowProgramFile flowProgramFile : files){
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ProgramConfirmTableService.java
@@ -2,10 +2,7 @@
package org.springblade.mdm.flow.service;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfPCell;
import com.itextpdf.text.pdf.PdfPTable;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.engine.HistoryService;
@@ -25,11 +22,12 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.ByteArrayOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.*;
import java.util.List;
import java.util.Optional;
/**
 * æ•°æŽ§ç¨‹åºç¡®è®¤è¡¨è¾“出服务
@@ -64,7 +62,68 @@
        BaseFont bfChinese = getBaseFont();
        return new Font(bfChinese, 12, Font.NORMAL);
    }
    public void generateTempPDF()throws Exception {
        PdfReader reader = null;
        PdfStamper ps = null;
        OutputStream fos = null;
        ByteArrayOutputStream bos = null;
        try {
            String fileName = "d:/qrb.pdf";//模板绝对路径
            reader = new PdfReader(fileName);
            bos = new ByteArrayOutputStream();
            ps = new PdfStamper(reader, bos);
            // ä½¿ç”¨ä¸­æ–‡å­—体
            //BaseFont bf = BaseFont.createFont("sTsong-Light", "uniGB-Ucs2-H", BaseFont.NOT_EMBEDDED);
            BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            ArrayList<BaseFont> fontList = new ArrayList<BaseFont>();
            fontList.add(bf);
            AcroFields fields = ps.getAcroFields();
            fields.setSubstitutionFonts(fontList);
            fillData(fields, data());//染
            //必须要调用这个,否则文档不会生成的
            ps.setFormFlattening(true);
            if (ps != null) {
                ps.close();
            }
            //生成pdf路径存放的路径
            fos = new FileOutputStream("d:/bb2.pdf");
            fos.write(bos.toByteArray());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (fos != null) {
                fos.flush();
                fos.close();
                if (bos != null) {
                    bos.close();
                }
                if (reader != null) {
                    reader.close();
                }
            }
        }
    }
    public void fillData(AcroFields fields, Map<String, String> data) {
        try {
            for (String key : data.keySet()) {
                String value = data.get(key);
                // ä¸ºå­—段赋值,注意字段名称是区分大小写的fields.setField(key,value);
                fields.setField(key,value);
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }
    Map<String,String> data(){
        Map<String,String> ret = new HashMap<>();
        ret.put("drawingName","中文图名");
        ret.put("craftEdition","TH0001");
        return ret;
    }
    public void exportConfirmTable(String processInstanceId, OutputStream os) throws DocumentException, IOException {
        BaseFont bfChinese = getBaseFont();
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/TaskDispatchService.java
@@ -67,7 +67,7 @@
        LocalDateTime checkStartDate = LocalDateTime.now().minusDays(taskDupDays);
        LambdaQueryChainWrapper<TaskDispatch> q = lambdaQuery().eq(TaskDispatch::getDrawingNo,startVO.getDrawingNo())
            .eq(TaskDispatch::getProcessNo,startVO.getProcessNo())
            .eq(TaskDispatch::getProcessEdition,startVO.getProcessEdition())
            //.eq(TaskDispatch::getProcessEdition,startVO.getProcessEdition())
            .eq(TaskDispatch::getMachineCode,startVO.getMachineCode())
            .gt(TaskDispatch::getCreateTime,checkStartDate);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/MdmProgramImportService.java
@@ -255,11 +255,11 @@
                        if (matchedMachine != null) {
                            vo.setName(parseProgramName(vo.getFilename()));
                            vo.setMachineCode(matchedMachine.getCode());
                            //String sendPath = programAnnotationService.removeAnnotation(matchedMachine.getMachineGroupCode(),line1,"(",")");
                            vo.setFullPath(path.toString());//文件地址
                            vo.setSendPath(matchedMachine.getProgSendDir());
                            vo.setId(vo.getFullPath());
                            vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getMachineGroupCode(),line2,"(",")"));
                            vo.setProgramStatus(programAnnotationService.removeAnnotation(matchedMachine.getMachineGroupCode(),line2));
                            list.add(vo);
                        }
@@ -267,17 +267,9 @@
                    } catch (IOException e) {
                        log.error("读取文件md5失败",e);
                    }
                    //List<String> files = new ArrayList<>();
                    // è¿™é‡Œå¯ä»¥æ·»åŠ å¯¹æ–‡ä»¶çš„å¤„ç†é€»è¾‘
                }
            }
        }
        return list;
    }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/NcProgramExportDNCService.java
@@ -104,7 +104,7 @@
            deviationSerial = ncNodeService.getDeviationSerialForNode(packageNode);
        }
        List<DictBiz> annotationDictList= programAnnotationService.getAnnotionList();
        List<DictBiz> annotationDictList= programAnnotationService.getAnnotionDictList();
        for (NcNode node : programNodes) {
            String filePathInZip = genFilePathInZip(packageFolder,node,deviationSerial);
            programFile = this.flowProgramFileService.getById(node.getFlowProgramFileId());
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/service/ProgramAnnotationService.java
@@ -5,7 +5,9 @@
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.vo.ProgramAnnotation;
import org.springblade.mdm.utils.FileContentUtil;
import org.springblade.system.feign.IDictBizClient;
import org.springblade.system.pojo.entity.DictBiz;
@@ -52,12 +54,10 @@
    public static final String GH = "GH";
    public static final String PL = "PL";
    public List<DictBiz> getAnnotionList(){
    public List<DictBiz> getAnnotionDictList(){
        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{
@@ -76,30 +76,20 @@
     */
    public boolean isAnnotation(String line,String machineGroupCode,List<DictBiz> annotationList){
        boolean isAnno = false;
        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();
        }
        String begin = "";
        String end = "";
        String[] arr = annotationSetting.split(",");
        if(arr.length == 2){
            begin = arr[0];
            end = arr[1];
        }
        ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(machineGroupCode,annotationList);
        line = StringUtils.trim(line);//去首尾空格
        isAnno = StringUtils.startsWith(line,begin) && StringUtils.endsWith(line,end);
        return isAnno;
        return progAnnotation.isAnnotation(line);
    }
    public String generateAnnotation(String oriTest,String machineGroupCode,List<DictBiz> annotationList) {
        /*
        String annotation = oriTest;
        String begin = "(";
        String end = ")";
        Optional<DictBiz> dictOpt = annotationList.stream().filter(dict -> {return dict.getDictKey().equals(machineGroupCode);}).findFirst();
        String annotationSetting = DEFAULT_ANNOTATION_SETTING;
        if(dictOpt.isPresent()) {
@@ -110,14 +100,14 @@
            begin = arr[0];
            end = arr[1];
        }else if(arr.length == 1){
            begin = begin = arr[0];
            begin = arr[0];
            end = "";
        }
        annotation = begin + oriTest + end;
        return annotation;
        */
        ProgramAnnotation progAnnotation = this.getProgramAnnotationFormat(machineGroupCode,annotationList);
        return progAnnotation.addAnnotation(oriTest);
    }
    /*
    public String[] getAnnotationStartAndEnd(String machineGroupCode,List<DictBiz> annotationList) {
        String begin = "(";
@@ -136,47 +126,44 @@
            begin = arr[0];
            end = "";
        }
        ProgramAnnotation progAnno = this.getProgramAnnotationFormat(machineGroupCode,annotationList);
        return new String[]{begin,end};
    }
    public String removeAnnotation(String machineGroupCode,String text,String begin,String end){
        List<DictBiz> 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
     * æå–注释中的文本
     * @param machineGroupCode æœºåºŠç»„代码
     * @param text æ¸…除注释标记
     * @return æ¸…除后的文本
     */
        public String removeAnnotation(String machineGroupCode,String text){
            List<DictBiz> annoDicts = getAnnotionDictList();
            ProgramAnnotation panno = this.getProgramAnnotationFormat(machineGroupCode,annoDicts);
            //String[] arr = getAnnotationStartAndEnd(machineGroupCode,annoDicts);
            return panno.cleanAnnotation(text);
        }
        /**
         * è®¾ç½®å›ºåŒ–注释行
         * @param inputStream è¾“入框
         * @param machineGroup æœºåºŠç»„编码
         * @param annoDictList æ³¨é‡Šå­—典配置
         * @return åŠ å¥½æ³¨é‡Šçš„
         * @throws IOException
         */
    public InputStream setGHAnnotation(InputStream inputStream, String machineGroup,List<DictBiz> annoDictList) throws IOException {
        return setAnnotationAndGetInputStream(inputStream, machineGroup, annoDictList, GH, STATUS_LINE_INDEX);
    }
    /**
     * è®¾ç½®åç¦»å•注释
     * @param inputStream
     * @param machineGroup
     * @param annoDictList
     * @return
     * @throws IOException
     * @param inputStream æ–‡æœ¬è¾“入流
     * @param machineGroup æœºåºŠç»„代码
     * @param annoDictList æ³¨é‡Šå­—典配置
     * @return åŠ å¥½æ³¨é‡Šçš„è¾“å…¥æµ
     * @throws IOException è®¿é—®æµå¯èƒ½æŠ›å‡ºå¼‚常
     */
    public InputStream setPldAnnotation(String deviation,InputStream inputStream,String machineGroup,List<DictBiz> annoDictList) throws IOException {
        //
        return setAnnotationAndGetInputStream(inputStream, machineGroup, annoDictList, deviation, STATUS_DEVIATION_INDEX);
    }
@@ -213,7 +200,7 @@
     * @throws IOException
     */
    public InputStream setSendDirAndStatusAnnotation(String sendPath,String statusText,InputStream inputStream, String machineGroup) throws IOException {
        List<DictBiz> annoDicts = getAnnotionList();
        List<DictBiz> annoDicts = getAnnotionDictList();
        InputStream finishedStream;
        try(inputStream){
@@ -222,12 +209,13 @@
            //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();
            InputStream insAfterSetSendDir ;
            if(isAnnotation(sendDirLine,machineGroup,annoDicts)){
                insAfterSetSendDir = FileContentUtil.replaceAtLine(byteInputStream,SENDPATH_LINE_INDEX,sendPathAnnotation);
            }else{
@@ -246,5 +234,39 @@
        return finishedStream;
    }
    /**
     * è§£æžå‡ºæœºåºŠç¨‹åºæ³¨é‡Šçš„æ ¼å¼
     * @param machineGroupCode æœºåºŠç»„
     * @param annoDictList é…ç½®çš„æ³¨é‡Šå­—典数据
     * @return
     */
    ProgramAnnotation getProgramAnnotationFormat(String machineGroupCode,List<DictBiz> annoDictList){
        String begin;
        String end;
        Optional<DictBiz> dictOpt = annoDictList.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 = "";
        }else{
            throw new ServiceException("注释格式配置错误,应该为1到2段,中间用逗号分隔");
        }
        ProgramAnnotation programAnnotation = new ProgramAnnotation();
        programAnnotation.setBegin(begin);
        programAnnotation.setEnd(end);
        return programAnnotation;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/vo/ProgramAnnotation.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,43 @@
package org.springblade.mdm.program.vo;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
/**
 * ç¨‹åºæ³¨é‡Š
 */
@Getter
@Setter
public class ProgramAnnotation {
    /**
     * æ³¨é‡Šå¼€å§‹
     */
    private String begin;
    /**
     * æ³¨é‡Šç»“束
     */
    private String end;
    /**
     * åˆ¤æ–­æ–‡æœ¬æ˜¯å¦æ˜¯æ³¨é‡Š
     * @param text å¾…判断文本
     * @return çŸ³ä½›iu
     */
    public boolean isAnnotation(String text){
        return StringUtils.startsWith(text,this.begin) && StringUtils.endsWith(text,this.end);
    }
    /**
     * ç”Ÿè¾°æ³¨é‡Š
     * @param oriTest åŽŸå§‹æ–‡æœ¬
     * @return åŠ ä¸Šæ³¨é‡ŠåŽçš„æ–‡æœ¬
     */
    public String addAnnotation(String oriTest) {
        return begin + oriTest + end;
    }
    public String cleanAnnotation(String annotatedText){
        return StringUtils.removeEnd(StringUtils.removeStart(annotatedText,begin),end);
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/test/OssTestController.java
@@ -90,7 +90,7 @@
        BladeFile bfile = ossTemplate.putFile("replaceok.txt",newins);
        return R.data(bfile.getLink()+","+bfile.getName());
    }
    /*
    @GetMapping("/replace2")
    @ApiOperationSupport(order = 2)
    @Operation(summary = "替换内容2")
@@ -122,14 +122,14 @@
                //flowProgramFile.setOssName(bfile.getName());
            }
        }
        /*
        InputStream ins  = ossTemplate.statFileStream(ossName);
        InputStream newins = FileContentUtil.replaceAtLine(fis,2,"GHTEST");
        BladeFile bfile = ossTemplate.putFile("replaceok.txt",newins);
         */
        return R.data(bfile.getLink()+","+bfile.getName());
    }
*/
}
blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ProgramConfirmTableServiceTest.java
@@ -2,68 +2,32 @@
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.*;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.flow.vo.ApproveTableInfo;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
public class ProgramConfirmTableServiceTest {
    @Test
    public void testExportConfirmTable(){
    public void test(){
        ProgramConfirmTableService s = new ProgramConfirmTableService();
        try {
            BaseFont bfChinese =  s.getBaseFont();
            Document document = new Document(PageSize.B5.rotate());
            String filename = "c"+System.currentTimeMillis()+".pdf";
            File pdf = new File(filename);
            if(pdf.exists()){
                pdf.delete();
            }
            PdfWriter.getInstance(document,new FileOutputStream(pdf));
            document.open();
            FlowProgramProperties props = new FlowProgramProperties();
            props.setDrawingNo("CP3-1");
            props.setProcessNo("A");
            props.setProcessEdition("93");
            props.setCraftEdition("工艺版次");
            props.setProductModel("CP3");
            //编制
            Machine machine = new Machine();
            machine.setName("1075");
            machine.setProgSendDir("d:\\mdm\\send");
            ApproveTableInfo appInfo = new ApproveTableInfo();
            appInfo.setTeamLeaderName("组长1");
            appInfo.setProgrammerName("编制1");
            appInfo.setCheckerName("校对1");
            appInfo.setSeniorName("审核1");
            Calendar startCal = Calendar.getInstance();
            startCal.add(Calendar.DAY_OF_MONTH, -5);
            appInfo.setProgrammingDate(startCal.getTime());
            startCal.add(Calendar.DAY_OF_MONTH, 2);
            appInfo.setCheckDate(startCal.getTime());
            startCal.add(Calendar.DAY_OF_MONTH, 2);
            appInfo.setApproveDate(startCal.getTime());
            s.printPage(document,bfChinese,props,machine);
            document.close();
            s.generateTempPDF();
            Assertions.assertTrue(true);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}