From 4ab2cb495ccece311bbd8d0ecb992c7de0bc8500 Mon Sep 17 00:00:00 2001 From: yangys <y_ys79@sina.com> Date: 星期二, 22 七月 2025 11:43:10 +0800 Subject: [PATCH] 审批表打印 --- blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java | 2 blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java | 21 +++ blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java | 234 +++++++++++++++++++++++++++++++++++++++ blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java | 10 + blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java | 27 ++++ blade-service/blade-mdm/pom.xml | 11 + blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java | 4 blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java | 13 + blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java | 16 -- 9 files changed, 318 insertions(+), 20 deletions(-) diff --git a/blade-service/blade-mdm/pom.xml b/blade-service/blade-mdm/pom.xml index e627995..67c5676 100644 --- a/blade-service/blade-mdm/pom.xml +++ b/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> diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java index 1dee81f..bfd6ab9 100644 --- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/controller/FlowMgrController.java +++ b/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 = "瀵煎嚭瀹℃壒琛╡xcel") + 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); + } + + } } diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java index 5904520..bdd7869 100644 --- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java +++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/entity/ApproveRecord.java @@ -24,6 +24,10 @@ private String processDefinitionKey; /** + * 浠诲姟鐨刱ey + */ + private String taskDefinitionId; + /** * 浠诲姟鍚嶇О */ private String taskName; diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java index d644a61..52732ab 100644 --- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java +++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveRecordService.java @@ -63,6 +63,8 @@ //濡傛灉杩樻病鏈夊叧鑱旂殑绋嬪簭鏁版嵁锛屽垯鎻掑叆涓�涓猵rogramId涓簄ull鐨� 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); diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/ApproveTableService.java new file mode 100644 index 0000000..14566e6 --- /dev/null +++ b/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璐d汉娲惧嚭鏃堕棿",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("娉�:宸ユ娲惧伐搴旈鍏堣鍒掋�佸悎鐞嗗畨鎺掓暟鎺х▼搴忕紪鍒躲�傜珛鍔犮�佹暟閾c�佹暟杞︾瓑鍗曢亾宸ュ簭绋嬪簭(涓よ酱绋嬪簭)闇�鎻愬墠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; + } + + +} diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java index ba5d354..99126f6 100644 --- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/flow/service/FlowBusinessService.java +++ b/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 鍒犻櫎鍑哄叧鑱斿瓧娈� + } } diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java index 7c899dc..feb0f0d 100644 --- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/controller/NcProgramExportDNCController.java +++ b/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 = "瀵煎嚭瀹℃壒琛╡xcel") - public void exportApproveTaable(@RequestBody @Parameter(description = "瀹℃壒琛╥d鏁扮粍") 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); - } - } } diff --git a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java index 2b78637..6f2c0d5 100644 --- a/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java +++ b/blade-service/blade-mdm/src/main/java/org/springblade/mdm/program/entity/NcProgram.java @@ -47,6 +47,11 @@ * 宸ュ簭锛屽鈥滅簿閾b�� */ private String processName; + + /** + * 宸ュ簭鍙� + */ + private String processNo; /** * 澶囨敞 */ @@ -76,6 +81,11 @@ * 宸ュ簭鐗堟 */ private String processEdition; + + /** + * 宸ヨ壓鐗堟 + */ + private String craftEdition; /** * 鏄惁鏈�鏂扮増娆★紝1锛氭渶鏂扮増娆★紱0:鍘嗗彶鐗堟 */ diff --git a/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java b/blade-service/blade-mdm/src/test/java/org/springblade/mdm/flow/service/ApproveTableServiceTest.java new file mode 100644 index 0000000..beb3b56 --- /dev/null +++ b/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); + } + } +} -- Gitblit v1.9.3