yangys
2025-09-01 15884b65f03121e0fa4c0f8120cbc2d740333d44
审批表打印改为模板
已添加1个文件
已修改4个文件
168 ■■■■■ 文件已修改
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/support/TemplatedPdfWriter.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sql/mdm/mdm.mysql.all.create.sql 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/service/ParamService.java
@@ -40,7 +40,16 @@
     */
    public static String NETWORK_TYPE_SHEMI= "0";
    /**
     * ç¡®è®¤è¡¨æ¨¡æ¿çš„参数key
     */
    public static String CONFIRM_TABLE_TEMPLATE= "confirmTableTemplate";
    /**
     * å®¡æ‰¹è¡¨æ¨¡æ¿çš„参数key
     */
    public static String APPROVE_TABLE_TEMPLATE= "approveTableTemplate";
    /**
     * å®¡æ‰¹ç”¨æˆ·è§’色别名参数key,逗号分隔
@@ -93,4 +102,8 @@
            ROOT_DEPT_ID,"0");
    }
    public String approveTableTemplateOssFileName() {
        return getParamValue(
            APPROVE_TABLE_TEMPLATE,"");
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/commons/support/TemplatedPdfWriter.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
package org.springblade.mdm.commons.support;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Map;
/**
 * æ¨¡æ¿ç”Ÿæˆpdf
 */
public class TemplatedPdfWriter {
    private byte[] templateBytes;
    public TemplatedPdfWriter(byte[] templateBytes){
        this.templateBytes = templateBytes;
    }
    public void setTemplateBytes(byte[] templateBytes){
        this.templateBytes = templateBytes;
    }
    public void write(Map<String,String> data, OutputStream outputStream) throws DocumentException, IOException {
        PdfReader reader = null;
        PdfStamper pdfStamper = null;
        reader = new PdfReader(this.templateBytes);
        pdfStamper =  new PdfStamper(reader, outputStream);
        // ä½¿ç”¨ä¸­æ–‡å­—体
        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        ArrayList<BaseFont> fontList = new ArrayList<>();
        fontList.add(bf);
        AcroFields fields = pdfStamper.getAcroFields();
        fields.setSubstitutionFonts(fontList);
        fillData(fields, data);//染
        //必须要调用这个,否则文档不会生成的
        pdfStamper.setFormFlattening(true);
        pdfStamper.close();
    }
    void fillData(AcroFields fields, Map<String, String> data) throws DocumentException, IOException {
        for (String key : data.keySet()) {
            String value = data.get(key);
            // ä¸ºå­—段赋值,注意字段名称是区分大小写的fields.setField(key,value);
            fields.setField(key,value,true);
            //form.setFieldProperty("fieldName", "clrflags", PdfAnnotation.FLAGS_HIDDEN, null);
            //fields.setFieldRichValue()
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
@@ -7,11 +7,14 @@
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.runtime.ProcessInstance;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springblade.core.oss.OssTemplate;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.core.tool.utils.Func;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.commons.service.ParamService;
import org.springblade.mdm.commons.support.TemplatedPdfWriter;
import org.springblade.mdm.flow.constants.FlowContants;
import org.springblade.mdm.flow.vo.ApproveTableInfo;
import org.springblade.mdm.program.entity.NcNode;
@@ -24,11 +27,10 @@
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Date;
import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
@@ -52,6 +54,13 @@
    private IUserClient useClient;
    @Autowired
    private NcProgramApprovedService programApprovedService;
    @Autowired
    private ParamService paramService;
    @Autowired
    private OssTemplate ossTemplate;
    private final String DATE_PATTERN = "yyyy-M-d";
    private static final String UNCHECK_BOX = "☐";
    private static final String CHECKED_BOX = "☑";
    static Chunk square = new Chunk("o", new Font(Font.FontFamily.ZAPFDINGBATS, 12)); // ç©ºæ–¹æ¡†
@@ -66,7 +75,71 @@
        return new Font(bfChinese, 12, Font.NORMAL);
    }
    public void exportApproveTable(String processInstanceId, OutputStream os) throws DocumentException, IOException {
    public void exportApproveTable(String processInstanceId, OutputStream os) throws IOException, DocumentException {
        FlowProgramProperties props = flowCommonService.getProgramPropertiesFromHis(processInstanceId);
        ApproveTableInfo approveInfo = getApproveInfo(props);
        Machine machine;
        String machineCode = props.getMachineCode();
        machine = machineService.getByCode(machineCode);
        Map<String,String> pdfData = new HashMap<>();
        pdfData.put("drawingNo",props.getDrawingNo());
        pdfData.put("processNo",props.getProcessNo());
        pdfData.put("craftEdition",props.getCraftEdition());
        pdfData.put("machineMode",machine.getName());
        String dispatchDateStr = " ";
        if (approveInfo.getDispatchDate() != null) {
            dispatchDateStr = DateUtil.format(approveInfo.getDispatchDate(), DATE_PATTERN);
        }
        pdfData.put("teamLeader",approveInfo.getTeamLeaderName()+"/"+dispatchDateStr);
        if(StringUtils.equals(props.getHasCuredProgram(),FlowContants.Y)){
            pdfData.put("fuzeren",approveInfo.getCheckerName());
            pdfData.put("checkY","Y");//固化,属于校对任务
        }else{
            pdfData.put("fuzeren",approveInfo.getProgrammerName());
            pdfData.put("programY","Y");//其他,属于编制任务
        }
        pdfData.put("fangzhenY","Y");
        Date programDate = approveInfo.getCheckDate();
        Date checkDate = approveInfo.getCheckDate();
        String pDateStr = " ";
        if (programDate != null) {
            pDateStr = DateUtil.format(programDate, DATE_PATTERN);
        }
        String checkDateStr = " ";
        if (checkDate != null) {
            checkDateStr = DateUtil.format(programDate, DATE_PATTERN);
        }
        String approveDateStr = " ";
        if (approveInfo.getApproveDate() != null) {
            approveDateStr = DateUtil.format(approveInfo.getApproveDate(), DATE_PATTERN);
        }
        pdfData.put("programmer",approveInfo.getProgrammerName()+"/"+pDateStr);
        pdfData.put("checker",approveInfo.getCheckerName()+"/"+checkDateStr);
        pdfData.put("senior",approveInfo.getSeniorName()+"/"+approveDateStr);
        pdfData.put("sendDir",machine.getProgSendDir()!=null?machine.getProgSendDir():"");
        TemplatedPdfWriter pdfWriter = new TemplatedPdfWriter(getTemplateBytes());
        pdfWriter.write(pdfData,os);
    }
    private byte[] getTemplateBytes() throws IOException {
        String tplOssName = paramService.approveTableTemplateOssFileName();
        try (InputStream inputStream = this.ossTemplate.statFileStream(tplOssName)) {
            return inputStream.readAllBytes();
        }
    }
    public void exportApproveTableOld(String processInstanceId, OutputStream os) throws DocumentException, IOException {
        BaseFont bfChinese = getBaseFont();
@@ -247,8 +320,7 @@
        PdfPCell cell2 = getCell("00001", ft);
        cell2.setColspan(2);
        //cell2.addElement(new Phrase(programPackageNode.getProgramNo(),ft));//数控程序编号
        //cell2.addElement(new Phrase("00001",ft));
        table.addCell(cell2);
        String pDateStr = " ";
@@ -337,6 +409,10 @@
            .processInstanceId(props.getProcessInstanceId()).orderByTaskCreateTime().desc().list();
        for(HistoricTaskInstance task : hisTasks){
            if(appInfo.getDispatchDate()== null && task.getTaskDefinitionKey().contains("teamLeaderTask")){
                appInfo.setDispatchDate(task.getEndTime());
            }
            if(appInfo.getProgrammingDate()== null && task.getTaskDefinitionKey().contains("program")){
                appInfo.setProgrammingDate(task.getEndTime());
            }
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/vo/ApproveTableInfo.java
@@ -10,7 +10,10 @@
    private String programmerName;
    private String checkerName;
    private String seniorName;
    /**
     * ä»»åŠ¡åˆ†é…æ—¶é—´
     */
    private Date dispatchDate;
    private Date programmingDate;
    /**
doc/sql/mdm/mdm.mysql.all.create.sql
@@ -423,7 +423,8 @@
CREATE TABLE `mdm_machine_accepted_file` (
     `id` bigint NOT NULL,
     `tenant_id` varchar(6) DEFAULT NULL COMMENT '所属租户',
     `confirm_time` datetime DEFAULT NULL COMMENT '确认时间',
     `name` varchar(100) NOT NULL COMMENT '文件名称',
     `export_time` datetime DEFAULT NULL COMMENT '导出时间',
     `oss_name` varchar(100) NULL COMMENT 'oss中的文件名',
     `machine_file_id` bigint NOT NULL COMMENT '机床文件id(mdm_machine_file.id)',
     `status` int DEFAULT NULL COMMENT '业务状态',