0ecd5acd3b9f320a487c68df2ea6234b4dacb12c..833e909fbb25dd1245ec6aabb0c2cbe4c72d31c7
11 小时以前 yangys
审批表打印
833e90 对比 | 目录
14 小时以前 yangys
审批表打印
4ab2cb 对比 | 目录
已修改8个文件
已添加2个文件
358 ■■■■■ 文件已修改
blade-service/blade-mdm/pom.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java 248 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sql/mdm/mdm.mysql.all.create.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
blade-service/blade-mdm/pom.xml
@@ -89,7 +89,16 @@
            <artifactId>blade-core-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itextpdf</artifactId>
            <version>5.5.13.4</version>
        </dependency>
        <dependency>
            <groupId>com.itextpdf</groupId>
            <artifactId>itext-asian</artifactId>
            <version>5.2.0</version>
        </dependency>
        <!--<dependency>
            <groupId>org.springblade</groupId>
            <artifactId>blade-starter-transaction</artifactId>
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java
@@ -13,12 +13,15 @@
import org.flowable.engine.task.Comment;
import org.flowable.task.api.history.HistoricTaskInstance;
import org.springblade.core.excel.util.ExcelUtil;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.mp.support.Query;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.basesetting.machine.vo.MachineExcelVO;
import org.springblade.mdm.commons.vo.IdsVO;
import org.springblade.mdm.flow.service.ApproveRecordService;
import org.springblade.mdm.flow.service.ApproveTableService;
import org.springblade.mdm.flow.service.FlowBusinessService;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.mdm.flow.vo.OvertimeTaskExcelVO;
@@ -27,6 +30,9 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;
@@ -46,6 +52,8 @@
    private HistoryService historyService;
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private ApproveTableService approveTableService;
    @GetMapping("overtime-list")
    @ApiOperationSupport(order = 3)
@@ -108,7 +116,8 @@
    @Operation(summary = "流程删除", description = "删除id指定的流程实例")
    public R<Void> deleteInstance(@Parameter(description = "任务到达时间开始") String processInstancesId) {
        try {
            runtimeService.deleteProcessInstance(processInstancesId, "流程查询-删除");
            businessService.deleteProcessInstance(processInstancesId);
        } catch (Exception e) {
            log.error("删除流程失败",e);
            return R.fail(e.getMessage());
@@ -116,5 +125,21 @@
        return R.success();
    }
    @PostMapping("/export-approve-table")
    @Operation(summary = "导出审批表", description = "导出审批表excel")
    public void exportApproveTable(String processInstanceId, HttpServletResponse response) {
        try {
            String filename = URLEncoder.encode("数控程序编制审批单", StandardCharsets.UTF_8)+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".pdf";
            response.setHeader("Content-Disposition", "attachment; filename="+filename);
            response.setContentType("application/octet-stream");
            approveTableService.exportApproveTable(processInstanceId,response.getOutputStream());
        } catch (Exception e) {
            log.error("导出DNC异常", e);
            throw new RuntimeException(e);
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java
@@ -24,6 +24,10 @@
    private String processDefinitionKey;
    /**
     * ä»»åŠ¡çš„key
     */
    private String taskDefinitionId;
    /**
     * ä»»åŠ¡åç§°
     */
    private String taskName;
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java
@@ -63,6 +63,8 @@
            //如果还没有关联的程序数据,则插入一个programId为null的
            ApproveRecord rec = new ApproveRecord();
            rec.setTaskName(task.getName());
            rec.setTaskDefinitionId(task.getTaskDefinitionId());
            rec.setComment(comment==null? StringUtils.EMPTY:comment);
            rec.setProcessInstanceId(processInstanceId);
            rec.setProcessDefinitionKey(processDefinitionKey);
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,248 @@
package org.springblade.mdm.flow.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.flowable.task.api.Task;
import org.springblade.core.mp.base.BizServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.DateUtil;
import org.springblade.mdm.basesetting.machine.MachineService;
import org.springblade.mdm.basesetting.machine.entity.Machine;
import org.springblade.mdm.flow.entity.ApproveRecord;
import org.springblade.mdm.flow.mapper.ApproveRecordMapper;
import org.springblade.mdm.flow.vo.ApproveRecordVO;
import org.springblade.mdm.program.entity.NcProgram;
import org.springblade.mdm.program.entity.ProcessProgRef;
import org.springblade.mdm.program.service.NcProgramService;
import org.springblade.mdm.program.service.ProcessProgRefService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.List;
import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
/**
 * å®¡æ‰¹è®°å½•,用于查询执行轨迹
 *
 * @author yangys
 */
@Slf4j
@Service
@AllArgsConstructor
public class ApproveTableService{
    private final ProcessProgRefService processProgRefService;
    private final FlowCommonService flowCommonService;
    private final ApproveRecordService approveRecordService;
    private final NcProgramService ncProgramService;
    private final MachineService machineService;
    private static final String UNCHECK_BOX = "☐";
    private static final String CHECKED_BOX = "☑";
    static Chunk square = new Chunk("o", new Font(Font.FontFamily.ZAPFDINGBATS, 12)); // ç©ºæ–¹æ¡†
    static Chunk check = new Chunk("4", new Font(Font.FontFamily.ZAPFDINGBATS, 12)); // å¸¦å‹¾æ–¹æ¡†
    //static SimpleDateFormat
    BaseFont getBaseFont() throws DocumentException, IOException {
        return BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    }
    Font getChineseFont() throws DocumentException, IOException {
        BaseFont bfChinese = getBaseFont();
        return new Font(bfChinese, 12, Font.NORMAL);
    }
    /**
     * å¯¼å‡ºå®¡æ‰¹ç¡®è®¤è¡¨
     * @param processInstanceId
     */
    public void exportApproveTable(String processInstanceId, OutputStream os) throws DocumentException, IOException {
        BaseFont bfChinese =  getBaseFont();
        Document document = new Document(PageSize.B5.rotate());
        PdfWriter.getInstance(document,os);
        document.open();
        List<ApproveRecord> records = approveRecordService.lambdaQuery().eq(ApproveRecord::getProcessInstanceId, processInstanceId).orderByAsc(ApproveRecord::getCreateTime).list();
        for(int i=0;i<records.size();i++){
            ApproveRecord record = records.get(i);
            printStep(document,bfChinese,record);
            if(i<records.size()-1){
                document.newPage();
            }
        }
        document.close();
    }
    void printStep(Document document,BaseFont bfChinese,ApproveRecord record) throws DocumentException, IOException {
        NcProgram ncProgram;
        Machine machine;
        if(record.getNcProgramId() !=null ) {
            ncProgram = ncProgramService.getById(record.getNcProgramId());
            machine = machineService.getByCode(ncProgram.getMachineCode());
        }else{
            ncProgram = new NcProgram();
            machine = new Machine();
        }
        Font titleFont = new Font(bfChinese, 14, Font.NORMAL);
        Paragraph title = new Paragraph("数控程序编制审批单",titleFont);
        title.setAlignment(Element.ALIGN_CENTER);
        title.setLeading(40f, 0f);
        title.setSpacingAfter(10); // æ®µåŽé—´è·
        document.add(title);
        // åˆ›å»ºè¡¨æ ¼ï¼ˆ4列)
        PdfPTable table = new PdfPTable(5);
        table.setWidths(new float[]{2,1.2f, 1.2f, 1.2f,2});
        Font ft = this.getChineseFont();
        // æ·»åŠ è¡¨å¤´
        PdfPCell tempCell = new PdfPCell();//getCell("零组件号");
        tempCell.setHorizontalAlignment(Element.ALIGN_CENTER);
        tempCell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        Phrase pt1 = new Phrase("零组件号",ft);
        tempCell.setPhrase(pt1);
        //tempCell.addElement(pt1);
        //
        table.addCell(tempCell);
        table.addCell(getCell("工序号",ft));
        table.addCell(getCell("工艺版次",ft));
        table.addCell(getCell("机床型号",ft));
        table.addCell(getCell("工段负责人/单元负\n责人派出时间",ft));
        //PdfPCell cell12 = new PdfPCell();
        //cell12.setColspan(2);
        //cell12.addElement(new Phrase(ncProgram.getDrawingNo()));
        table.addCell(getCell(ncProgram.getDrawingNo(),ft));//零组件号
        table.addCell(getCell(ncProgram.getProcessNo(),ft));//工序号
        table.addCell(getCell(ncProgram.getCraftEdition(),ft));//工艺版次
        table.addCell(getCell(machine.getName(),ft));//机床型号
        table.addCell("");//负责人,工段负责人派出时间
        //中间大格
        PdfPCell cell = new PdfPCell();
        cell.setColspan(5);
        cell.setCalculatedHeight(400);
        Paragraph mainPara1 = new Paragraph();
        mainPara1.setLeading(30f, 0f);
        mainPara1.setFont(ft);
        mainPara1.setAlignment(Element.ALIGN_LEFT); // å¯¹é½æ–¹å¼
        mainPara1.setIndentationLeft(20); // å·¦ç¼©è¿›(像素)
        mainPara1.setIndentationRight(20); // å³ç¼©è¿›
        mainPara1.setSpacingBefore(10); // æ®µå‰é—´è·
        mainPara1.setSpacingAfter(10); // æ®µåŽé—´è·
        mainPara1.add("数控程序编制任务安排:\n");
        cell.addElement(mainPara1);
        Paragraph line2Para = new Paragraph();
        line2Para.setLeading(30f, 0f);
        line2Para.setFont(ft);
        line2Para.setAlignment(Element.ALIGN_LEFT); // å¯¹é½æ–¹å¼
        line2Para.setIndentationLeft(40); // å·¦ç¼©è¿›(像素)
        line2Para.add("请");
        Font underLineFt = new Font(bfChinese, 12, Font.UNDERLINE);
        String personName = record.getUserNickname();
        Chunk block1 = square;
        Chunk block2 = square;
        Date programDate = null;
        Date checkDate = null;
        if(StringUtils.equals(record.getTaskDefinitionId(),"programmingTask")){
            block1 = check;
            programDate = record.getCreateTime();
        }else if(StringUtils.equals(record.getTaskDefinitionId(),"check")){
            block2 = check;
            checkDate = record.getCreateTime();
        }
        Phrase p = new Phrase("       "+personName+"        ",underLineFt);
        line2Para.add(p);
        Phrase p2 = new Phrase("负责数控程序(编制");
        p2.add(block1);
        p2.add(new Chunk("   æ ¡å¯¹",ft));
        p2.add(block2);
        p2.add(new Chunk(")",ft));
        line2Para.add(p2);
        cell.addElement(line2Para);
        Paragraph fangzhen = new Paragraph();
        fangzhen.setAlignment(Element.ALIGN_LEFT); // å¯¹é½æ–¹å¼
        fangzhen.setIndentationLeft(20); // å·¦ç¼©è¿›(像素)
        fangzhen.setIndentationRight(20); // å³ç¼©è¿›
        fangzhen.setSpacingBefore(10); // æ®µå‰é—´è·
        fangzhen.setSpacingAfter(10); // æ®µåŽé—´è·
        fangzhen.setFont(ft);
        fangzhen.setLeading(30f, 0f);
        fangzhen.add("是否需要仿真(是");
        fangzhen.add(square);
        fangzhen.add(";否");
        fangzhen.add(square);
        fangzhen.add(")\n");
        cell.addElement(fangzhen);
        table.addCell(cell);
        //下一行
        PdfPCell cell21 = getCell("数控程序编号",ft);// PdfPCell();
        cell21.setColspan(2);
        //cell21.setPhrase(new Phrase("数控程序编号",ft));
        table.addCell(cell21);
        table.addCell(getCell("编制/日期",ft));
        table.addCell(getCell("校对/日期",ft));
        table.addCell(getCell("批准/日期",ft));
        PdfPCell cell2 = new PdfPCell();
        cell2.setColspan(2);
        cell2.addElement(new Phrase(ncProgram.getCode(),ft));//数控程序编号
        table.addCell(cell2);
        String pDateStr = " ";
        if(programDate!=null){
            pDateStr = DateUtil.format(programDate,"yyyy-MM-dd");
        }
        String checkDateStr = " ";
        if(checkDate!=null){
            checkDateStr = DateUtil.format(programDate,"yyyy-MM-dd");
        }
        table.addCell(getCell(pDateStr,ft));//编制日期
        table.addCell(getCell(checkDateStr,ft));
        table.addCell(getCell(" ",ft));
        // è®¾ç½®è¡¨æ ¼å®½åº¦å é¡µé¢å®½åº¦çš„100%
        table.setWidthPercentage(100);
        // æ·»åŠ è¡¨æ ¼åˆ°æ–‡æ¡£
        document.add(table);
        Phrase lastPhrase = new Phrase("注:工段派工应预先计划、合理安排数控程序编制。立加、数铣、数车等单道工序程序(两轴程序)需提前1个工作日,卧式加工中心单道工序(含多轴程序)需提前3个工作日。 ",ft);
        document.add(lastPhrase);
    }
    PdfPCell getCell(String text,Font font) throws DocumentException, IOException {
        PdfPCell cell = new PdfPCell();
        cell.setPadding(10);
        cell.setHorizontalAlignment(Element.ALIGN_CENTER);
        cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
        if(StringUtils.isNotBlank(text)){
            Phrase p = new Phrase(text,font);
            p.setLeading(25);
            cell.setPhrase(p);
        }
        return cell;
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java
@@ -4,6 +4,7 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import lombok.AllArgsConstructor;
import org.flowable.engine.HistoryService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.engine.history.HistoricProcessInstance;
import org.flowable.engine.task.Comment;
@@ -18,6 +19,8 @@
import org.springblade.mdm.flow.entity.MdmFlowProcess;
import org.springblade.mdm.flow.util.MdmFlowCache;
import org.springblade.mdm.flow.vo.FlowVO;
import org.springblade.mdm.program.entity.ProcessProgRef;
import org.springblade.mdm.program.service.ProcessProgRefService;
import org.springblade.system.feign.IUserClient;
import org.springblade.system.pojo.entity.User;
import org.springframework.stereotype.Service;
@@ -38,10 +41,12 @@
@Service
@AllArgsConstructor
public class FlowBusinessService {
    private final RuntimeService runtimeService;
    private final TaskService taskService;
    private final HistoryService historyService;
    private final IUserClient userClient;
    private final ProcessProgRefService processProgRefService;
    private final ApproveRecordService approveRecordService;
    /**
     * æŸ¥è¯¢æˆ‘的流程(个人待办列表)
@@ -425,7 +430,6 @@
     * @param page
     * @param createTimeBegin
     * @param createTimeEnd
     * @param assigneeName
     * @param keyword
     * @return
     */
@@ -459,4 +463,9 @@
        page.setRecords(flowList);
        return page;
    }
    public void deleteProcessInstance(String processInstancesId) {
        runtimeService.deleteProcessInstance(processInstancesId, "流程查询-删除");
        //TODO åˆ é™¤å‡ºå…³è”字段
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java
@@ -64,22 +64,6 @@
    }
    @PostMapping("/export-approve-table")
    @Operation(summary = "导出审批表", description = "导出审批表excel")
    public void exportApproveTaable(@RequestBody @Parameter(description = "审批表id数组") IdsVO vo, HttpServletResponse response) {
        if(vo.getIds() == null || vo.getIds().length == 0) {
            throw new ServiceException("未选择文件导出");
        }
        try {
            String filename = "todncexp-"+ DateUtil.format(DateUtil.now(), "yyyyMMddHHmm")+".zip";
            response.setHeader("Content-Disposition", "attachment; filename="+filename);
            response.setContentType("application/octet-stream");
            ncProgramExportDNCService.exportDnc(vo.getIds(),response.getOutputStream());
        } catch (IOException e) {
            log.error("导出DNC异常", e);
            throw new RuntimeException(e);
        }
    }
}
blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java
@@ -47,6 +47,11 @@
     * å·¥åºï¼Œå¦‚“精铣”
     */
    private String processName;
    /**
     * å·¥åºå·
     */
    private String processNo;
    /**
     * å¤‡æ³¨
     */
@@ -76,6 +81,11 @@
     * å·¥åºç‰ˆæ¬¡
     */
    private String processEdition;
    /**
     * å·¥è‰ºç‰ˆæ¬¡
     */
    private String craftEdition;
    /**
     * æ˜¯å¦æœ€æ–°ç‰ˆæ¬¡ï¼Œ1:最新版次;0:历史版次
     */
blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,21 @@
package org.springblade.mdm.flow.service;
import com.google.common.io.FileBackedOutputStream;
import com.itextpdf.text.DocumentException;
import org.junit.jupiter.api.Test;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class ApproveTableServiceTest {
    @Test
    public void test(){
        ApproveTableService s = new ApproveTableService(null,null,null,null,null);
        try {
            //s.exportApproveTable("1",new FileOutputStream("d:/t.pdf"));
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}
doc/sql/mdm/mdm.mysql.all.create.sql
@@ -100,13 +100,14 @@
  `oss_name` varchar(100) NULL COMMENT 'oss中的文件名',
  `category` varchar(20) NULL COMMENT '文件分类',
  `process_name` varchar(20) NULL COMMENT '工序名称',
  `process_no` varchar(20) NULL COMMENT '工序号',
  `remark` varchar(100) NULL COMMENT '备注',
  `is_text_file` int DEFAULT NULL COMMENT '是否文本文件',
  `url` varchar(400) NOT NULL COMMENT '文件地址',
  `machine_code` varchar(100) DEFAULT NULL COMMENT '设备编号/机床编号',
  `drawing_no` varchar(100) NULL COMMENT '零组件编号/图号',
  `drawing_no_edition` varchar(100) NULL COMMENT '图号版次',
  `craft_edition` varchar(20) NULL COMMENT '设计版次',
  `craft_edition` varchar(20) NULL COMMENT '工艺版次',
  `description` varchar(100) NULL COMMENT '描述',
  `is_cured` int DEFAULT NULL COMMENT '是否固化,1是;0否',
  `expire_date` date DEFAULT NULL COMMENT '到期时间,根据有效期时长计算而来',
@@ -155,7 +156,8 @@
   `nc_program_id` bigint NULL COMMENT '程序id。未选择程序之前是null',
   `process_instance_id` varchar(64) DEFAULT NULL COMMENT '流程实例id',
   `process_definition_key` varchar(100) DEFAULT NULL COMMENT '流程定义key',
   `task_name` varchar(100) DEFAULT NULL COMMENT '任务名称',
   `task_definition_key` varchar(100) DEFAULT NULL COMMENT '任务定义key',
    `task_name` varchar(100) DEFAULT NULL COMMENT '任务名称',
   `operate_time` datetime DEFAULT NULL COMMENT '审批时间',
   `operate_result` varchar(20) DEFAULT NULL COMMENT '审批结果',
   `user_id` bigint NOT NULL COMMENT '审批用户id',