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,234 @@ 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.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)); // 另徿¹æ¡ 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; if(StringUtils.equals(record.getTaskDefinitionId(),"programmingTask")){ block1 = check; }else if(StringUtils.equals(record.getTaskDefinitionId(),"check")){ block2 = check; } 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.addElement(new Phrase(" ",ft)); cell2.setColspan(2); table.addCell(cell2); table.addCell(getCell(" ",ft)); table.addCell(getCell(" ",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); } } }