diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java deleted file mode 100644 index fda19dd..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -/** - * 测试报告参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.TEST_REPORT_BEAN) -public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * 4、获取电子签名的文件列表 - * 5、获取电子签章的文件列表 - * 6、证书报告其他参数填充的列表(可重写) - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - customizedSignNamesParamCreator(); - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(),metaData.getSampleId())); - return filePrintRegister; - } - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "审核人", "批准人" ); - customizedSignNames = Arrays.asList("校准人", "发证单位", "批准人" ); - } - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java deleted file mode 100644 index fda19dd..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -/** - * 测试报告参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.TEST_REPORT_BEAN) -public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * 4、获取电子签名的文件列表 - * 5、获取电子签章的文件列表 - * 6、证书报告其他参数填充的列表(可重写) - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - customizedSignNamesParamCreator(); - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(),metaData.getSampleId())); - return filePrintRegister; - } - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "审核人", "批准人" ); - customizedSignNames = Arrays.asList("校准人", "发证单位", "批准人" ); - } - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java index 9c46357..93109ef 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String calibrationOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationOrderTemplateName)); //关联数据 diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java deleted file mode 100644 index fda19dd..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -/** - * 测试报告参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.TEST_REPORT_BEAN) -public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * 4、获取电子签名的文件列表 - * 5、获取电子签章的文件列表 - * 6、证书报告其他参数填充的列表(可重写) - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - customizedSignNamesParamCreator(); - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(),metaData.getSampleId())); - return filePrintRegister; - } - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "审核人", "批准人" ); - customizedSignNames = Arrays.asList("校准人", "发证单位", "批准人" ); - } - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java index 9c46357..93109ef 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String calibrationOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationOrderTemplateName)); //关联数据 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java index 1156f4f..00a2119 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String testOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(testOrderTemplateName)); //关联数据 @@ -34,7 +35,7 @@ private TestOrderPrintFileData sampleInfoPopulate(FilePrintRegister filePrintRegister, List customerSampleInfoList) { List> sampleList = new ArrayList<>(); - if(!CollectionUtils.isEmpty(customerSampleInfoList)){ + if (!CollectionUtils.isEmpty(customerSampleInfoList)) { for (int i = 0; i < customerSampleInfoList.size(); i++) { customerSampleInfoList.get(i).setSeq(i + 1); Map map = new HashMap<>(); @@ -72,10 +73,10 @@ map.put("receiveDate", metaData.getReceiveDate()); map.put("type1", "\u25CB"); map.put("type2", "\u25CB"); - if(Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()){ + if (Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()) { map.put("type1", "\u2299"); } - if(Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()){ + if (Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()) { map.put("type2", "\u2299"); } Map params = new HashMap<>(); diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java deleted file mode 100644 index fda19dd..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -/** - * 测试报告参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.TEST_REPORT_BEAN) -public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * 4、获取电子签名的文件列表 - * 5、获取电子签章的文件列表 - * 6、证书报告其他参数填充的列表(可重写) - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - customizedSignNamesParamCreator(); - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(),metaData.getSampleId())); - return filePrintRegister; - } - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "审核人", "批准人" ); - customizedSignNames = Arrays.asList("校准人", "发证单位", "批准人" ); - } - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java index 9c46357..93109ef 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String calibrationOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationOrderTemplateName)); //关联数据 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java index 1156f4f..00a2119 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String testOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(testOrderTemplateName)); //关联数据 @@ -34,7 +35,7 @@ private TestOrderPrintFileData sampleInfoPopulate(FilePrintRegister filePrintRegister, List customerSampleInfoList) { List> sampleList = new ArrayList<>(); - if(!CollectionUtils.isEmpty(customerSampleInfoList)){ + if (!CollectionUtils.isEmpty(customerSampleInfoList)) { for (int i = 0; i < customerSampleInfoList.size(); i++) { customerSampleInfoList.get(i).setSeq(i + 1); Map map = new HashMap<>(); @@ -72,10 +73,10 @@ map.put("receiveDate", metaData.getReceiveDate()); map.put("type1", "\u25CB"); map.put("type2", "\u25CB"); - if(Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()){ + if (Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()) { map.put("type1", "\u2299"); } - if(Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()){ + if (Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()) { map.put("type2", "\u2299"); } Map params = new HashMap<>(); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java index e140056..6e652e9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java @@ -1,20 +1,14 @@ package com.casic.missiles.service.listeners.register.data.original; -import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; -import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; import org.springframework.stereotype.Component; import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * 原始记录生成 @@ -24,8 +18,8 @@ public class OriginalRecord extends PrintFileDataSupport implements PrintFileDataGeneric { @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOriginalRecord metaData = (BusinessOriginalRecord) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOriginalRecord metaData = (BusinessOriginalRecord) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); //定制化签名开发预处理,定制化参数 diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java deleted file mode 100644 index fda19dd..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -/** - * 测试报告参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.TEST_REPORT_BEAN) -public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * 4、获取电子签名的文件列表 - * 5、获取电子签章的文件列表 - * 6、证书报告其他参数填充的列表(可重写) - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - customizedSignNamesParamCreator(); - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(),metaData.getSampleId())); - return filePrintRegister; - } - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "审核人", "批准人" ); - customizedSignNames = Arrays.asList("校准人", "发证单位", "批准人" ); - } - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java index 9c46357..93109ef 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String calibrationOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationOrderTemplateName)); //关联数据 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java index 1156f4f..00a2119 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String testOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(testOrderTemplateName)); //关联数据 @@ -34,7 +35,7 @@ private TestOrderPrintFileData sampleInfoPopulate(FilePrintRegister filePrintRegister, List customerSampleInfoList) { List> sampleList = new ArrayList<>(); - if(!CollectionUtils.isEmpty(customerSampleInfoList)){ + if (!CollectionUtils.isEmpty(customerSampleInfoList)) { for (int i = 0; i < customerSampleInfoList.size(); i++) { customerSampleInfoList.get(i).setSeq(i + 1); Map map = new HashMap<>(); @@ -72,10 +73,10 @@ map.put("receiveDate", metaData.getReceiveDate()); map.put("type1", "\u25CB"); map.put("type2", "\u25CB"); - if(Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()){ + if (Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()) { map.put("type1", "\u2299"); } - if(Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()){ + if (Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()) { map.put("type2", "\u2299"); } Map params = new HashMap<>(); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java index e140056..6e652e9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java @@ -1,20 +1,14 @@ package com.casic.missiles.service.listeners.register.data.original; -import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; -import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; import org.springframework.stereotype.Component; import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * 原始记录生成 @@ -24,8 +18,8 @@ public class OriginalRecord extends PrintFileDataSupport implements PrintFileDataGeneric { @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOriginalRecord metaData = (BusinessOriginalRecord) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOriginalRecord metaData = (BusinessOriginalRecord) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); //定制化签名开发预处理,定制化参数 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java index 261882a..1f475fc 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java @@ -1,85 +1,86 @@ -package com.casic.missiles.service.listeners.register.data.site; - - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.ObjectUtils; - -import java.util.*; -import java.util.stream.Collectors; - -@Component(PrintFileDataBeanNameAliasEnum.EXTERNAL_CALIBRATION_FILE_BEAN) -public class CalibrationFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - @Value("${casic.template.calibration}") - private String calibrationTemplateName; - - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessSiteExecutiveInfo metaData = (BusinessSiteExecutiveInfo) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationTemplateName)); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(siteFileParamCreator(metaData.getOrderId(), metaData.getId())); - filePrintRegister.getParams().putAll(populateCalibration(metaData)); - resolverApprovalTime(filePrintRegister, ApprovalLogMap); - return filePrintRegister; - } - - private Map populateCalibration(BusinessSiteExecutiveInfo metaData) { - Map calibrationDataParams = new HashMap<>(); - calibrationDataParams.put("siteExecutiveNo", metaData.getSiteExecutiveNo()); - calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); - calibrationDataParams.put("siteExecutiveName", metaData.getSiteExecutiveName()); -// environmentDataParams.put("zeroVoltage", metaData.getZeroGroundVoltage()); - calibrationDataParams.put("executiveEnvironment", metaData.getExecutiveEnvironment()); - return calibrationDataParams; - } - - /** - * 文件自定义名称参数构建器 - */ - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("审核人", "批准人"); - customizedSignNames = Arrays.asList("技术负责人审核", "计量测试站主任批准"); - } - - private void resolverApprovalTime(FilePrintRegister filePrintRegister, Map> ApprovalLogMap) { - for (int i = 0; i < keyParamList.size(); i++) { - if (ApprovalLogMap.containsKey(keyParamList.get(i))) { - List approvalLogResponseList = ApprovalLogMap.get(keyParamList.get(i)); - if (CollectionUtils.isNotEmpty(approvalLogResponseList)) { - Optional optionalApprovalLogResponse = approvalLogResponseList.stream().findFirst(); - if (optionalApprovalLogResponse.isPresent()) { - Date nodeFinishTime = optionalApprovalLogResponse.get().getFinishTime(); - if(!ObjectUtils.isEmpty(nodeFinishTime)){ - Calendar calendar = Calendar.getInstance(); - calendar.setTime(nodeFinishTime); - filePrintRegister.getParams().put("y" + i, calendar.get(Calendar.YEAR)); - filePrintRegister.getParams().put("m" + i, calendar.get(Calendar.MONTH) + 1); - filePrintRegister.getParams().put("d" + i, calendar.get(Calendar.DAY_OF_MONTH)); - } - } - } - } - } - } -} +//package com.casic.missiles.service.listeners.register.data.site; +// +// +//import com.casic.missiles.dto.business.certificate.ElectronicImage; +//import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +//import com.casic.missiles.dto.business.file.FilePrintRegister; +//import com.casic.missiles.dto.flowable.ApprovalLogResponse; +//import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +//import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; +//import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +//import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +//import org.apache.commons.collections.CollectionUtils; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +//import org.springframework.util.ObjectUtils; +// +//import java.util.*; +//import java.util.stream.Collectors; +// +//@Component(PrintFileDataBeanNameAliasEnum.EXTERNAL_CALIBRATION_FILE_BEAN) +//public class CalibrationFileData extends PrintFileDataSupport implements PrintFileDataGeneric { +// +// @Value("${casic.template.calibration}") +// private String calibrationTemplateName; +// +// @Override +// public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { +// BusinessSiteExecutiveInfo metaData = (BusinessSiteExecutiveInfo) registerParameters.getCustomObject(); +// //初始化,生成模板文件 +// FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationTemplateName)); +// //查询工作流审批记录 +// List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); +// Map> ApprovalLogMap = approvalLogList.stream() +// .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); +// //定制化签名开发预处理,定制化参数 +// customizedSignNamesParamCreator(); +// //定制化签名开发 +// List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); +// filePrintRegister.setElectronicImageList(electronicSignList); +// //填充定制化的参数 +// filePrintRegister.setParams(siteFileParamCreator(metaData.getOrderId(), metaData.getId())); +// filePrintRegister.getParams().putAll(populateCalibration(metaData)); +// resolverApprovalTime(filePrintRegister, ApprovalLogMap); +// return filePrintRegister; +// } +// +// private Map populateCalibration(BusinessSiteExecutiveInfo metaData) { +// Map calibrationDataParams = new HashMap<>(); +// calibrationDataParams.put("siteExecutiveNo", metaData.getSiteExecutiveNo()); +// calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); +// calibrationDataParams.put("siteExecutiveName", metaData.getSiteExecutiveName()); +//// environmentDataParams.put("zeroVoltage", metaData.getZeroGroundVoltage()); +// calibrationDataParams.put("executiveEnvironment", metaData.getExecutiveEnvironment()); +// return calibrationDataParams; +// } +// +// /** +// * 文件自定义名称参数构建器 +// */ +// @Override +// protected void customizedSignNamesParamCreator() { +// keyParamList = Arrays.asList("审核人", "批准人"); +// customizedSignNames = Arrays.asList("技术负责人审核", "计量测试站主任批准"); +// } +// +// private void resolverApprovalTime(FilePrintRegister filePrintRegister, Map> ApprovalLogMap) { +// for (int i = 0; i < keyParamList.size(); i++) { +// if (ApprovalLogMap.containsKey(keyParamList.get(i))) { +// List approvalLogResponseList = ApprovalLogMap.get(keyParamList.get(i)); +// if (CollectionUtils.isNotEmpty(approvalLogResponseList)) { +// Optional optionalApprovalLogResponse = approvalLogResponseList.stream().findFirst(); +// if (optionalApprovalLogResponse.isPresent()) { +// Date nodeFinishTime = optionalApprovalLogResponse.get().getFinishTime(); +// if(!ObjectUtils.isEmpty(nodeFinishTime)){ +// Calendar calendar = Calendar.getInstance(); +// calendar.setTime(nodeFinishTime); +// filePrintRegister.getParams().put("y" + i, calendar.get(Calendar.YEAR)); +// filePrintRegister.getParams().put("m" + i, calendar.get(Calendar.MONTH) + 1); +// filePrintRegister.getParams().put("d" + i, calendar.get(Calendar.DAY_OF_MONTH)); +// } +// } +// } +// } +// } +// } +//} diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java index 5923725..5f8cba0 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificatePrintController.java @@ -119,6 +119,14 @@ return certificatePrintService.refuseAgainPrint(request); } + /** + * 证书打印作废,原始记录和证书都需要变更为作废, + * + * 同时复制为两个作为新的基本信息生成新的消息,标志为作废 + * 原记录编号是多少, + * @param idDTO + * @return + */ @ApiOperation("证书打印-作废") @PostMapping("/invalid") public ReturnDTO invalidPrint(@RequestBody @Valid IdDTO idDTO) { diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java index f3d9334..eeab650 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/business/BusinessCertificateReportController.java @@ -174,8 +174,8 @@ @ApiOperation("导出word打印") @PostMapping("/exportFile") - public void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { - certificateReportService.exportOriginalFile(certificateReport, response); + public void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + certificateReportService.exportCertificateFile(certificateReport, response); } diff --git a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java index 76c8016..71a0eb5 100644 --- a/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java +++ b/casic-metering-api/src/main/java/com/casic/missiles/controller/system/PoiController.java @@ -63,7 +63,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "tttt1.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(), wordDir, params,null,fileName); System.out.println("****新模板"+word); } @@ -186,7 +186,7 @@ params.put("d", now.get(Calendar.DAY_OF_MONTH)); String fileName = "testParams.docx"; - String word = FilePrintRegisterUtils.exportWord(tf.getPath(), "C:\\upload\\word\\", fileName, params); + String word = FilePrintRegisterUtils.exportWord(tf.getPath(),"C:\\upload\\word\\", params,null,fileName); System.out.println("****新模板"+word); } diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java index 81def5d..b2682ac 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/business/FilePrintTypeEnum.java @@ -1,8 +1,8 @@ package com.casic.missiles.enums.business; public interface FilePrintTypeEnum { - String TEST_REPORT = "样品内部检校证书"; - String CALIBRATION_CERTIFICATE = "自有设备内部检校证书"; + String CALIBRATION_CERTIFICATE = "证书报告"; + String CALIBRATION_CERTIFICATE_APPROVAL = "证书报告审批"; String TEST_ORDER = "检测委托单"; String CALIBRATION_ORDER = "检定或校准委托单"; String ORIGINAL_RECORD = "原始记录"; diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java index 3f1a3b2..ddb2a8e 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/AwareFilePrintTypeEnum.java @@ -8,11 +8,11 @@ CERTIFICATE_TYPE_BEAN_MAP(new HashMap() { { - put(CALIBRATION_CERTIFICATE, CALIBRATION_CERTIFICATE_BEAN); //校准证书 - put(TEST_REPORT, TEST_REPORT_BEAN); //测试报告 + put(CALIBRATION_CERTIFICATE, CERTIFICATE_REPORT); //证书报告 + put(CALIBRATION_CERTIFICATE_APPROVAL, CERTIFICATE_REPORT); //证书报告审批 put(TEST_ORDER, TEST_ORDER_BEAN); //检测委托单 put(CALIBRATION_ORDER, CALIBRATION_ORDER_BEAN); //检定或校准委托单 - put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //检定或校准委托单 + put(ORIGINAL_RECORD, ORIGINAL_RECORD_BEAN); //原始记录 } }); diff --git a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java index 3f0b946..b3b12ad 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/enums/notifyevent/PrintFileDataBeanNameAliasEnum.java @@ -2,12 +2,10 @@ public interface PrintFileDataBeanNameAliasEnum { - //校准证书 - String CALIBRATION_CERTIFICATE_BEAN = "calibration"; - //检测报告 - String TEST_REPORT_BEAN = "testingReport"; - - String EXTERNAL_CALIBRATION_FILE_BEAN = "externalCalibrationFile"; + //证书报告 + String CERTIFICATE_REPORT = "certificateReport"; + //证书报告审批 + String CERTIFICATE_REPORT_APPROVAL = "certificateReportApproval";; String EXTERNAL_ENVIRONMENTAL_RECORD_BEAN = "environmentalRecordData"; //检测委托单 diff --git a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java index dfd2c3e..00032cf 100644 --- a/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java +++ b/casic-metering-dao/src/main/java/com/casic/missiles/mapper/business/BusinessOriginalRecordMapper.java @@ -26,4 +26,6 @@ List originExportList(@Param("request") OriginRecordRequest request); + Long getLabExecutiveId(@Param("sampleId")Long sampleId,@Param("orderId")Long orderId); + } diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml index bb1405e..fab6275 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessCertificateReportMapper.xml @@ -15,7 +15,7 @@ - + diff --git a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml index 09faa89..a58f39b 100644 --- a/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml +++ b/casic-metering-dao/src/main/resources/mapper/business/BusinessOriginalRecordMapper.xml @@ -113,4 +113,10 @@ ORDER BY bor.create_time DESC + + diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java index 96b427c..08a79ff 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ElectronicImage.java @@ -9,15 +9,26 @@ @Data @Builder public class ElectronicImage { - - - /** * 电子签章资源路径 */ private String electronicSealImageUrl; /** + * 电子签章资源路径(扩展) + */ + private String electronicSealImageUrls; + + /** + * 电子签章资源路径目录(扩展) + */ + private String SealImageUrlsDir; + /** + * 电子签名标记 + */ + private Boolean isSealImage= false; + + /** * 透明度 */ private Float diaphaneity; @@ -46,7 +57,6 @@ */ private Float stampHeight; - /** * 关键字 */ @@ -56,14 +66,18 @@ */ private Integer keyWordIndex; - // /** -// * 书签名,通过名称寻找书签文本所在位置 -// */ + /** + * 图片信息配置 + */ + private ImageConfig imageConfig; + /** + * 书签名,通过名称寻找书签文本所在位置 + */ private String bookmarkName; - // -// /** -// * 替换的文本新内容 -// */ + + /** + * 替换的文本新内容 + */ private String newBookmarkText; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java new file mode 100644 index 0000000..85cce7d --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/ImageConfig.java @@ -0,0 +1,59 @@ +package com.casic.missiles.dto.business.certificate; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author cz + */ +@Data +public class ImageConfig { + + /** + * 文件名称 + */ + @ApiModelProperty("文件名称") + private String filedName; + + /** + * 审批标志 + */ + @ApiModelProperty("审批标志") + private String approvalFlag; + + /** + * 文档参数名称 + */ + @ApiModelProperty("所在文件参数名称") + private String docName; + /** + * 表位置 + */ + @ApiModelProperty("表位置") + private Integer tableIndex; + + /** + * 行位置 + */ + @ApiModelProperty("行位置") + private Integer rowIndex; + + /** + * 列位置 + */ + @ApiModelProperty("列位置") + private Integer colIndex; + + /** + * 行合并数 + */ + @ApiModelProperty("行合并数") + private Integer rowSpan; + + /** + * 列合并列数 + */ + @ApiModelProperty("列合并列数") + private Integer colSpan; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java new file mode 100644 index 0000000..e9da220 --- /dev/null +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/certificate/RegisterCustomParameters.java @@ -0,0 +1,47 @@ +package com.casic.missiles.dto.business.certificate; + +import lombok.Builder; +import lombok.Data; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; +import java.util.Map; + +/** + * 定制化配置参数 + * + * @date 2024-02-28 + */ +@Data +@Builder +public class RegisterCustomParameters { + /** + * 定制化参数 + */ + private Map customParam; + + private Object customObject; + /** + * 定制化文件名称 + */ + private String customFileName; + /** + * 定制化配置参数 + */ + private List customTemplateUrls; + + /** + * 定制化是否是pdf + */ + private Boolean pdf; + /** + * 返回的请求流 + */ + private HttpServletResponse response; + + /** + * 前缀类型 + */ + private String prefixType; + +} diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java index 700e38a..71dd76b 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/file/FilePrintRegister.java @@ -25,20 +25,36 @@ * 生成文件名 */ private String fileName; + + /** + * 定制化文件名称 + */ + private String customFileName; /** * 生成文件名 */ private Long fileNameId; + /** * 模板参数 */ private Map params; + /** + * 合并列名称信息 + */ + private List mergeColNames; + private List beDownloadedFileNames; /** * electronicSealList 填充的电子图片信息 */ - List electronicImageList; + private List electronicImageList; + + /** + * word模板类型 + */ + private Boolean templateWordType; } diff --git a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java index 8a0468e..70813f5 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/dto/business/labExecutive/SampleLabExecutiveListResponse.java @@ -8,6 +8,7 @@ import com.alibaba.excel.annotation.write.style.HeadRowHeight; import com.alibaba.excel.enums.poi.BorderStyleEnum; import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.annotation.TableField; import com.casic.missiles.annotation.DictCodeField; import com.casic.missiles.constants.MeterDictCode; import io.swagger.annotations.ApiModel; @@ -121,6 +122,14 @@ @JSONField(serialize = false) private String orderCode; + //扫描匹配使用参数 + @TableField(exist = false) + @ApiModelProperty(value = "原始记录的Id", dataType = "Long") + private Long originalRecordId; + @TableField(exist = false) + @ApiModelProperty(value = "证书报告的Id", dataType = "Long") + private Long certificateReportId; + @ApiModelProperty(value = "样品文件状态(0、表示原始记录未填写 1表示原始记录填写,证书未生成 2、表示证书填写,未生成证书进行审批 3、表示证书生成同意 4、驳回只能查看", dataType = "Integer") private Integer sampleFileStatus; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java index 746a365..62b8b3e 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessCertificateReport.java @@ -191,9 +191,17 @@ @TableField("is_del") private Boolean isDel; + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("create_user") + @ApiModelProperty(value = "流程实例id(未通过编辑接口必传参数)", dataType = "String") private Long createUser; + @TableField(exist = false) + private String createUserName; + @TableField("create_time") private String createTime; diff --git a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java index e2e8349..d2ada0c 100644 --- a/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java +++ b/casic-metering-model/src/main/java/com/casic/missiles/model/business/BusinessOriginalRecord.java @@ -125,6 +125,11 @@ @ApiModelProperty(value = "备注", dataType = "String") private String remark; + + @ApiModelProperty(value = "实验室id", dataType = "Long") + @TableField("lab_executive_id") + private Long labExecutiveId; + @TableField("is_del") private Boolean isDel; diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index aa8aa4d..c837516 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -81,6 +81,17 @@ aspose-words 0.0.1-SNAPSHOT + + com.itextpdf + itextpdf + 5.0.6 + + + + + + + diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java index ed93fe8..605ad7b 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessCertificateReportServiceImpl.java @@ -1,6 +1,5 @@ package com.casic.missiles.service.Impl.business; -import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; @@ -19,6 +18,7 @@ import com.casic.missiles.dto.business.certificate.CertificateMonitorResponse; import com.casic.missiles.dto.business.certificate.CertificateReportApprovalRequest; import com.casic.missiles.dto.business.certificate.CertificateReportResponse; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.customer.CertificationResponse; import com.casic.missiles.dto.customer.sample.CustomerSampleIdRequest; import com.casic.missiles.dto.flowable.AllApproveDTO; @@ -60,13 +60,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; -import javax.validation.Valid; import java.util.*; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN; -import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; /** *

@@ -89,8 +86,6 @@ @Autowired private ApprovalOperateService approvalOperateService; @Resource - private TaskService taskService; - @Resource private RuntimeService runtimeService; @Resource private IBaseExportService iBaseExportService; @@ -113,8 +108,9 @@ public ReturnDTO saveCertificateReport(BusinessCertificateReport certificateReport) { initCertificateReport(certificateReport); - if (this.baseMapper.insert(certificateReport) > 0) + if (this.baseMapper.insert(certificateReport) > 0) { return ReturnUtil.success(certificateReport.getId()); + } throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); } @@ -168,6 +164,7 @@ getApprovalSignName(certificateReport); if (certificateReport.getOriginalRecordId() != null) { try { + certificateReport.setCreateUserName(permissionContext.getUserService().getById(certificateReport.getCreateUser()).getName()); certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); @@ -341,15 +338,29 @@ } @Override - public void exportOriginalFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception{ - if(!ObjectUtils.isEmpty(certificateReport.getTemplateId())){ - certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); - if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { - certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); - } - certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); - printFileRegister.registerPrintFile(certificateReport,CALIBRATION_CERTIFICATE,response); - } + public void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response) throws Exception { + if (!ObjectUtils.isEmpty(certificateReport.getTemplateId())) { + certificateReport.setBusinessOriginalRecord(originalRecordService.originalDetail(certificateReport.getOriginalRecordId())); + if (Objects.isNull(certificateReport.getBusinessOriginalRecord())) { + certificateReport.setBusinessOriginalRecord(new BusinessOriginalRecord()); + } + //登录用户 + AuthUser user = ShiroKit.getUser(); + Assert.isFalse(Objects.isNull(user), () -> { + throw new BusinessException(BusinessExceptionEnum.LOGIN_USER_ACQUIRE_FAILED); + }); + certificateReport.setCreateUser(user.getId()); + certificateReport.setCreateUserName(user.getName()); + certificateReport.setCertificateReportTypeName(dictService.getDictNameByCode(MeterDictEnum.CERTIFICATION_CLASS, certificateReport.getCertificateReportType())); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(certificateReport) + .prefixType(CALIBRATION_CERTIFICATE) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .build()); + } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } @@ -485,6 +496,7 @@ private void initCertificateReport(BusinessCertificateReport certificateReport) { String prefix = MonitorCodeEnum.getByCode(certificateReport.getCalibrationMajor()).getValue() + DateUtil.format(new Date(), "YYYYMM"); +// String prefix = DateUtil.format(new Date(), "YYYYMM"); Long maxNo = this.baseMapper.selectMaxCode(prefix); //生成证书编号 String certificateReportNo = NumberGeneratorUtil.getCode( diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java index a93f5cf..57aa8f9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessLabExecutiveInfoServiceImpl.java @@ -13,7 +13,6 @@ import com.casic.missiles.core.shiro.ShiroKit; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; -import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.labExecutive.*; import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.PrefixCodeEnum; @@ -343,13 +342,13 @@ //当前检定环节:具体实验室,已出具证书:查询证书报告表,证书总数:具体实验室 case MeasureStatusEnum.IN_MEASURE: List originalRecords = originalRecordMapper.selectList(null); - - Map originalRecordMap = originalRecords.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e.getMeasureCategory(), (e1, e2) -> e1)); + Map originalRecordMap = originalRecords.stream() + //过滤调作废的证书 + .collect(Collectors.toMap(BusinessOriginalRecord::getLabExecutiveId, BusinessOriginalRecord::getId, (e1, e2) -> e1)); //需要审批状态, List certificateReportList = certificateReportMapper.selectList(null); - Map certificateReportMap = certificateReportList.stream() - .collect(Collectors.toMap(e -> String.valueOf(e.getSampleId()) + e.getOrderId(), e -> e, (e1, e2) -> e1)); + Map certificateReportMap = certificateReportList.stream() + .collect(Collectors.toMap(e -> e.getLabExecutiveId(), e -> e, (e1, e2) -> e1)); resultPage = labExecutiveInfoMapper.selectListByUserIdAndStatus(page, labExecutiveListRequest, userId, MeasureStatusEnum.IN_MEASURE); //获取所有的原始记录和证书 @@ -382,8 +381,8 @@ /** * 判断文件的状态 */ - private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { - String key = String.valueOf(lab.getSampleId()) + lab.getOrderId(); + private void sampleFIleStatus(Map originalRecordMap, Map certificateReportMap, SampleLabExecutiveListResponse lab) { + Long key = lab.getId(); //判断不含原始记录的情况 if (!originalRecordMap.containsKey(key)) { lab.setSampleFileStatus(NOT_EXIST_FILE); @@ -391,25 +390,20 @@ } //判断不含有证书的情况 if (!certificateReportMap.containsKey(key)) { + lab.setOriginalRecordId(originalRecordMap.get(key)); lab.setSampleFileStatus(ORIGINAL_RECORD); return; } + lab.setCertificateReportId(certificateReportMap.get(key).getId()); //判断没有通过或者驳回的证书报告 BusinessCertificateReport certificateReport = certificateReportMap.get(key); - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED && certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { + if (!ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { lab.setSampleFileStatus(CERTIFICATE); return; - } - //判断通过的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.PASSED) { + } else { lab.setSampleFileStatus(CERTIFICATE_PASS); return; } - //判断驳回的状态 - if (certificateReport.getApprovalStatus() != ApprovalStatusEnum.FAILED_REJECT) { - lab.setSampleFileStatus(CERTIFICATE_REJECT); - } - return; } @Override diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java index e750416..0d9872f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/Impl/business/BusinessOriginalRecordServiceImpl.java @@ -12,6 +12,7 @@ import com.casic.missiles.dto.IdDTO; import com.casic.missiles.dto.ReturnDTO; import com.casic.missiles.dto.ReturnUtil; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.originRecord.OriginRecordRequest; import com.casic.missiles.dto.business.originRecord.OriginRecordResponse; import com.casic.missiles.enums.BusinessExceptionEnum; @@ -46,6 +47,7 @@ import java.util.stream.Collector; import java.util.stream.Collectors; +import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; import static com.casic.missiles.enums.business.FilePrintTypeEnum.ORIGINAL_RECORD; import static com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum.ORIGINAL_RECORD_BEAN; @@ -184,6 +186,8 @@ @Transactional public ReturnDTO addOriginal(BusinessOriginalRecord businessOriginalRecord) { initBusinessEnvironmentRecord(businessOriginalRecord); + //查询实验室id,赋值 + if (this.baseMapper.insert(businessOriginalRecord) > 0) { //加入技术文件绑定 if (ObjectUtil.isNotEmpty(businessOriginalRecord.getFileList()) && businessOriginalRecord.getFileList().size() > 0) { @@ -218,7 +222,14 @@ if (null != businessOriginalRecord.getTemplateId()) { SystemTemplate systemTemplate = templateService.getById(businessOriginalRecord.getTemplateId()); if (systemTemplate != null) { - printFileRegister.registerPrintFile(businessOriginalRecord, ORIGINAL_RECORD, response); + printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customObject(businessOriginalRecord) + .prefixType(ORIGINAL_RECORD) + .response(response) + //文件自定义命名 证书报告名称+证书报告编号 + .customFileName(businessOriginalRecord.getOriginalRecordName() + businessOriginalRecord.getOriginalRecordCode()) + .build()); } } throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java index 713dd83..f427bc9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/business/IBusinessCertificateReportService.java @@ -50,7 +50,7 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportOriginalFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java index 557d006..38db277 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/processor/CertificateReportEventPostProcessor.java @@ -88,9 +88,9 @@ PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); try { DictCodeUtils.convertDictCodeToName(certificateReport); - String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); - //生成证书打印信息 - CertificatePrintBuilder(certificateReport, printFileName); +// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); +// //生成证书打印信息 +// CertificatePrintBuilder(certificateReport, printFileName); } catch (Exception ex) { log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java new file mode 100644 index 0000000..d2f433c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/DocPictureProvider.java @@ -0,0 +1,270 @@ +package com.casic.missiles.service.listeners.register; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.ImageConfig; +import com.casic.missiles.dto.business.file.CropPicture; +import com.itextpdf.text.BadElementException; +import com.itextpdf.text.Image; +import com.itextpdf.text.Rectangle; +import com.itextpdf.text.pdf.PdfContentByte; +import com.itextpdf.text.pdf.PdfReader; +import com.itextpdf.text.pdf.PdfStamper; +import com.spire.doc.*; +import com.spire.doc.collections.RowCollection; +import com.spire.doc.documents.HorizontalAlignment; +import com.spire.doc.documents.Paragraph; +import com.spire.doc.documents.TextSelection; +import com.spire.doc.documents.TextWrappingStyle; +import com.spire.doc.fields.DocPicture; +import lombok.extern.slf4j.Slf4j; + +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.List; + +/** + * @author cz + */ +@Slf4j +public class DocPictureProvider { + + + /** + * 根据页数对图片的平等切割,返回切割后的图片 + * + * @param pageCount + * @param stampSealImgUrl + * @return + */ + public static List crosswiseCutting(int pageCount, String stampSealImgUrl) { + String[] imageCutOffContents = stampSealImgUrl.split("\\."); + CropPicture cropPicture = CropPicture.builder() + .targetImgUrl(stampSealImgUrl) + .cutCols(pageCount) + .cutRows(1) + .subfileUrl(imageCutOffContents[imageCutOffContents.length - 2]) + .subfileType(imageCutOffContents[imageCutOffContents.length - 1]) + .build(); + List subfileUrls = null; + try { + subfileUrls = ImageTool.doCrosswiseCutting(cropPicture); + } catch (IOException ex) { + ex.getStackTrace(); + } + return subfileUrls; + } + + /** + * 骑缝章只存在一个章在进行打印 + */ + public static void wordFullSeam(String pdfNewUrl, String stampSealImgUrl, String outFilePath) { + PdfReader reader = null; + PdfStamper stamp = null; + try { + reader = new PdfReader(pdfNewUrl);//选择需要印章的pdf + stamp = new PdfStamper(reader, new FileOutputStream(outFilePath));//加完印章后的pdf + Rectangle pageSize = reader.getPageSize(1);//获得第一页 + float height = pageSize.getHeight(); + float width = pageSize.getWidth(); + int nums = reader.getNumberOfPages(); + List subFileUrls = DocPictureProvider.crosswiseCutting(nums, stampSealImgUrl); + Image[] nImage = subImages(subFileUrls, nums);//生成骑缝章切割图片 + for (int n = 1; n <= nums; n++) { + PdfContentByte over = stamp.getOverContent(n);//设置在第几页打印印章 + Image img = nImage[n - 1];//选择图片 + img.scalePercent(40, 40); + img.setAbsolutePosition(width - img.getWidth() * 4 / 10, height / 2 - img.getHeight() * 4 / 20);//控制图片位置 + over.addImage(img); + } + } catch (Exception ex) { + log.error("骑缝章生成异常,异常信息为{}", ex); + } finally { + try { + if (stamp != null) { + System.gc(); + stamp.close(); + } + } catch (Exception ex) { + ex.getStackTrace(); + } + } + } + + /** + * 剪切图片 + * + * @param subFileUrls + * @param n + * @return + * @throws IOException + * @throws BadElementException + */ + private static Image[] subImages(List subFileUrls, int n) throws IOException, BadElementException { + Image[] nImage = new Image[n]; + ByteArrayOutputStream out = new ByteArrayOutputStream(); + for (int i = 0; i < n; i++) { + BufferedImage img = ImageIO.read(new File(subFileUrls.get(i))); + String[] framges = subFileUrls.get(i).split("\\."); + ImageIO.write(img, framges[framges.length - 1], out); + nImage[i] = Image.getInstance(out.toByteArray()); + out.flush(); + out.reset(); + } + return nImage; + } + + /** + * 填充图片信息 + * + * @param paragraph + * @param absolutePathImage + */ + public static void populateDocPicture(Paragraph paragraph, ElectronicImage absolutePathImage) { + DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); +// 指定电子章位置 +// 水平位置 + docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); +// 垂直位置 + docPicture.setVerticalPosition(absolutePathImage.getVertical()); +// 设置电子章大小 + docPicture.setWidth(absolutePathImage.getStampWidth()); + docPicture.setHeight(absolutePathImage.getStampHeight()); +// 设置图片位于文字顶层 + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + + /** + * 添加页眉页脚 + * + * @param document + */ + public static void headerFooter(Document document, String recordNo) { + int sectionCounts = document.getSections().getCount(); + for (int i = 0; i < sectionCounts; i++) { + HeaderFooter footer = document.getSections().get(i).getHeadersFooters().getHeader(); + Paragraph footerParagraph = footer.addParagraph(); + recordNo = StringUtils.isEmpty(recordNo) ? "" : recordNo; + footerParagraph.appendText(" 证书号:" + recordNo); + footerParagraph.appendText(" "); + footerParagraph.appendText(" 第 "); + footerParagraph.appendField("第 " + "page number" + "页", FieldType.Field_Page); + footerParagraph.appendText(" 页 共"); + footerParagraph.appendField("number of pages", FieldType.Field_Num_Pages); + footerParagraph.appendText(" 页 "); + footerParagraph.getFormat().setHorizontalAlignment(HorizontalAlignment.Right); + } + } + + /** + * 暂时只处理多图片的场景 + * 根据表、行、列位置填充图片 + * + * @param electronicSeal + * @param document + */ + public static void populateMultiImage(ElectronicImage electronicSeal, Document document) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrls())) { + return; + } + Section section = document.getSections().get(0); + Table table = section.getTables().get(imageConfig.getTableIndex() - 1); + RowCollection rows = table.getRows(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + String[] imageUrls = electronicSeal.getElectronicSealImageUrls().split(","); + if (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) { + TableCell cell = rows.get(imageConfig.getRowIndex() - 1).getCells().get(imageConfig.getColIndex() - 1); + if (ObjectUtils.isEmpty(imageUrls)) { + return; + } + for (String imageUrl : imageUrls) { + doPopulateMultiImage(cell, imageUrl, imageConfig, electronicSeal, rows, imageConfig.getRowIndex() - 1); + } + } else { + for (int i = 1; i < rows.getCount(); i++) { + TableCell cell = rows.get(i).getCells().get(imageConfig.getColIndex() - 1); + doPopulateMultiImage(cell, imageUrls[i - 1], imageConfig, electronicSeal, rows, i); + } + } + } + } + + private static void doPopulateMultiImage(TableCell cell, String imageUrl, ImageConfig imageConfig, ElectronicImage electronicSeal, + RowCollection rows, int index) { + DocPicture docPicture = cell.getFirstParagraph().appendPicture(electronicSeal.getSealImageUrlsDir() + imageUrl); + if ("1".equals(imageConfig.getApprovalFlag())) { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Left); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Top); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth()); + docPicture.setHeight(rows.get(index).getHeight()); + } else { + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(cell.getWidth() * 2); + docPicture.setHeight(rows.get(index).getHeight()); + } + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } + + /** + * 图片填充,分为单个图片或者行列的图片 + * 1、单个图片具体表、行、列位置不可为-1 + * + * @param electronicSeal + * @param keyWordIndex + * @param textSelections + * @param docPicture + */ + public static void populateSingleImage(ElectronicImage electronicSeal, + Integer keyWordIndex, TextSelection[] textSelections, DocPicture docPicture) { + ImageConfig imageConfig = electronicSeal.getImageConfig(); + if (ObjectUtils.isNotEmpty(imageConfig) && + (ObjectUtils.isNotEmpty(imageConfig.getTableIndex()) && imageConfig.getTableIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getRowIndex()) && imageConfig.getRowIndex() != -1) && + (ObjectUtils.isNotEmpty(imageConfig.getColIndex()) && imageConfig.getColIndex() != -1)) { + //指定电子章位置 + Section section = textSelections[keyWordIndex].getAsOneRange().getDocument().getLastSection(); + //水平位置 + docPicture.setHorizontalAlignment(ShapeHorizontalAlignment.Center); + //垂直位置 + docPicture.setVerticalAlignment(ShapeVerticalAlignment.Center); + //设置电子章大小 //宽度可以计算 + docPicture.setWidth(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getCells().get(imageConfig.getColIndex()).getWidth()); + docPicture.setHeight(section.getTables().get(imageConfig.getTableIndex()) + .getRows().get(imageConfig.getRowIndex()).getHeight()); + //合并行列是选填,需要进一步判断 + if (ObjectUtils.isNotEmpty(imageConfig.getRowSpan())) { + docPicture.setHeight(docPicture.getHeight() * imageConfig.getRowSpan()); + } + if (ObjectUtils.isNotEmpty(imageConfig.getColSpan())) { + docPicture.setWidth(docPicture.getWidth() * imageConfig.getColSpan()); + } + } else { + docPicture.setVerticalPosition(0f); + docPicture.setWidth(electronicSeal.getStampWidth()); + docPicture.setHeight(electronicSeal.getStampHeight()); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java index 63d9aaf..7fc7114 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/Example.java @@ -1,17 +1,20 @@ package com.casic.missiles.service.listeners.register; -import com.casic.missiles.service.listeners.register.FilePrintRegisterUtils; +import cn.afterturn.easypoi.entity.ImageEntity; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.TemplateExportParams; import com.casic.missiles.utils.QRCodeUtil; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.Document; import com.spire.doc.FileFormat; -import org.apache.coyote.OutputBuffer; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xwpf.usermodel.XWPFPicture; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStream; +import javax.imageio.ImageIO; +import java.awt.image.BufferedImage; +import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; @@ -83,17 +86,114 @@ compile.writeToFile("D:\\casic\\cut\\out_test3.docx"); } + private void sheetPage() { + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xls"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + + for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); + dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } + // **** 准备数据结束**** + dateMap.put("mapList", MapList); + list.add(dateMap); + sheetsMap.put(i, list); + } + try { + Workbook workbook = ExcelExportUtil.exportExcelClone(sheetsMap, params); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xls"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + } /** - * 1、生成二维码图片 - * 2、二维码图片进行图片的合成 - * 3、 + * 1、生成二维码图片 + * 2、二维码图片进行图片的合成 + * 3、 + * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { - OutputStream output =new FileOutputStream("D:\\casic\\cut\\test.png"); + // 加载模板 + OutputStream output = new FileOutputStream("D:\\casic\\cut\\test.png"); QRCodeUtil.getQRCode("D:\\casic\\cut\\1航天检定模版v1.xls", output); + + // 加载模板 + TemplateExportParams params = new TemplateExportParams( + "D:\\casic\\cut\\航天检定证书模板.xlsx"); + Map>> sheetsMap = new HashMap<>(); + // ****** 准备数据 ******* + // 日期 + +// for (int i = 0; i < 2; i++) { + List> list = new ArrayList(); + Map dateMap = new HashMap(); + dateMap.put("customerName", "2020-03-16"); + dateMap.put("sampleName", "1000"); + dateMap.put("sampleModelName", "100"); + dateMap.put("manufacturingNo", "50"); + dateMap.put("manufacturer", "100"); +// dateMap.put("sheetName", "sheet名称" + (i + 1)); + List MapList = new ArrayList<>(); + for (int j = 0; j < 2; j++) { + Map map = new HashMap(); + map.put("model", "123" + j); + map.put("manufacturingNo", "12345"); + map.put("range", "12345"); + map.put("grade", "12345"); + map.put("certificateNo", "12345"); + map.put("validDate", "2024/3/12"); + MapList.add(map); + } +// ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream(); +// BufferedImage bufferImg = ImageIO.read(BarcodeUtil.generateToStream("001")); +// ImageIO.write(bufferImg, "jpg", byteArrayOut); +// ImageEntity imageEntity = new ImageEntity(byteArrayOut.toByteArray(), 200, 1000); +// XWPFPicture image = new XWPFPicture(); +// //#2、这里是设置合并单元格,但是千万不要再模板你提前合并单元格。合并了这里会报错。行合并多少个格子在这里设置。 +// image.setRowspan(1);//向下合并三行 +// image.setColspan(1);//向右合并两列 +// //添加图片 +// image.setUrl("D:\\casic\\cut\\test.png"); +// dateMap.put("qr", image); +// // **** 准备数据结束**** +// dateMap.put("mapList", MapList); + list.add(dateMap); +// sheetsMap.put(i, list); +// } + try { + Workbook workbook = ExcelExportUtil.exportExcel(params,dateMap); + FileOutputStream fos = new FileOutputStream("D:\\casic\\cut\\test2.xlsx"); + workbook.write(fos); + fos.close(); + } catch (IOException ioe) { + System.out.println(""); + } + ; } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java index da44ae2..601612f 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/FilePrintRegisterUtils.java @@ -1,134 +1,160 @@ package com.casic.missiles.service.listeners.register; - import cn.hutool.core.lang.Assert; -import com.alibaba.excel.EasyExcel; -import com.alibaba.excel.util.ListUtils; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.casic.missiles.dto.business.certificate.ElectronicImage; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.service.listeners.util.ParseWord07; import com.casic.missiles.service.listeners.util.PdfUtils; -import com.casic.missiles.utils.QRCodeUtil; +import com.deepoove.poi.XWPFTemplate; +import com.deepoove.poi.config.Configure; +import com.deepoove.poi.config.ConfigureBuilder; import com.spire.doc.*; import com.spire.doc.documents.*; import com.spire.doc.fields.DocPicture; import com.spire.doc.fields.TextRange; +import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.XWPFDocument; -import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.*; -import java.util.ArrayList; import java.util.HashMap; -import java.util.Map; import java.util.List; +import java.util.Map; import java.util.stream.Collectors; /** * @Author:zt * @Create:2023/3/7/9:30 - * @Description:TODO Word文件操作工具类 + * @Description:Word文件操作工具类 * @Version:1.0 */ +@Slf4j public class FilePrintRegisterUtils { - //关键字索引 (-1) - private final static Integer keyWordIndex = -1; - //照片透明度设置 - private final static int alpha = 150; + /** + * ○ \u25CB ⊙\u2299 □\u25A1 √\u221A + * 方框对钩\uF052 方框 \uF0A3 Wingdings 2字体 + * 关键字索引 (-1) + */ + private final static Integer KEY_WORD_INDEX = -1; + /** + * 默认认定章的下标 + */ + private final static Integer DEFAULT_SEAL_INDEX = 0; + + private final static String INSIGNIA_KEYWORD = "公章"; /** * @param filePrintRegister 证书文件注册 */ public static String filePrintGenerate(FilePrintRegister filePrintRegister) throws RuntimeException { + ElectronicImage selectSeal = null; //1、按照模板填充数据,并导出word,执行填充行数之后,再进行页数的填充 -// String wordOldUrl = exportWord(filePrintRegister.getTemplatePath(), filePrintRegister.getTemDir(), filePrintRegister.getFileName(), filePrintRegister.getParams()); - // 初始化world,pdf名称参数 - String wordNewUrl = filePrintRegister.getTemplatePath(); - //默认转为docx,只需要进行docx的替换即可 - String pdfNewUrl = filePrintRegister.getTemplatePath().replaceAll("docx", "pdf"); - + String wordOldUrl = exportWord(filePrintRegister.getTemDir(), filePrintRegister.getFileName(), + filePrintRegister.getParams(), null, filePrintRegister.getCustomFileName()); + log.debug("执行完填充参数操作......"); if (CollectionUtils.isNotEmpty(filePrintRegister.getElectronicImageList())) { - //按关键字进行分组 - Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() - .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) - .collect( - Collectors.groupingBy(ElectronicImage::getKeyWord) - ); -// //3、根据关键字进行添加签章和签字 -// for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { -// List electronicSeals = entry.getValue(); -// addSameKeyWordStamp(wordOldUrl, wordNewUrl, electronicSeals); -// } -//// //获取没有关键字的图片,即绝对路径的图片 -// List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() -// .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) -// .collect(Collectors.toList()); -// //根据设置的绝对路径进行图片的填充 -// for (ElectronicImage absolutePathImage : absolutePathImageList) { -// addAbsolutePathStamp(wordOldUrl, wordNewUrl, absolutePathImage); -// } -// 由于合成word总页数存在不准确,先转换为pdf进行获取合成证书总页数, 处理齐缝章 + try { + //按关键字进行分组 + Map> sameKeyWordSealMaps = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isNotEmpty(electronicImage.getKeyWord())) + .collect( + Collectors.groupingBy(ElectronicImage::getKeyWord) + ); + log.debug("执行关键字打合成操作,打印配置为{}.......", JSON.toJSON(sameKeyWordSealMaps)); + //3、根据关键字进行添加签章和签字 + selectSeal = addSameKeyWordStamp(wordOldUrl, wordOldUrl, sameKeyWordSealMaps); + //获取没有关键字的图片,即绝对路径的图片 + List absolutePathImageList = filePrintRegister.getElectronicImageList().stream() + .filter(electronicImage -> StringUtils.isEmpty(electronicImage.getKeyWord())) + .collect(Collectors.toList()); + log.debug("执行绝对打合成操作,打印配置为{}.......", JSON.toJSON(absolutePathImageList)); + //根据设置的绝对路径进行图片的填充 + addAbsolutePathStamp(wordOldUrl, wordOldUrl, absolutePathImageList); + } catch (Exception ex) { + log.error("关键字异常,异常信息{}", ex); + } } - // 4、将新word转化为pdf文件 -// wordToPdf(wordNewUrl, pdfNewUrl); - return filePrintRegister.getTemplatePath(); + log.debug("执行完路径设置操作"); + //如果有骑缝章新增骑缝章 + return checkExtendSeal(wordOldUrl, selectSeal, filePrintRegister); } + /** + * 检查是否需要骑缝章 + * + * @return + */ + private static String checkExtendSeal(String wordOldUrl, ElectronicImage selectSeal, FilePrintRegister filePrintRegister) { + if (ObjectUtils.isNotEmpty(selectSeal)) { + //默认转为docx,只需要进行docx的替换即可 + String[] pdfUrl = filePrintRegister.getFileName().split("/."); + String pdfNewUrl = pdfUrl[0] + ".pdf"; + String tempPdfUrl = filePrintRegister.getTemDir() + "XH" + pdfNewUrl; + FilePrintRegisterUtils.wordToPdf(wordOldUrl, tempPdfUrl); + DocPictureProvider.wordFullSeam(tempPdfUrl, selectSeal.getElectronicSealImageUrl(), filePrintRegister.getTemDir() + pdfNewUrl); + return filePrintRegister.getTemDir() + pdfNewUrl; + } + return wordOldUrl; + } /** * 将相同关键字的印章添加到同一个位置进行打印 * 1、根据关键词位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 * - * @param wordOldUrl word文件路径 - * @param wordNewUrl 新word文件路径 - * @param electronicSealList 电子印章信息 + * @param wordOldUrl word文件路径 + * @param wordNewUrl 新word文件路径 + * @param sameKeyWordSealMaps 电子印章信息 */ - private static void addSameKeyWordStamp(String wordOldUrl, String - wordNewUrl, List electronicSealList) throws RuntimeException { - if (CollectionUtils.isEmpty(electronicSealList)) { - return; - } + public static ElectronicImage addSameKeyWordStamp(String wordOldUrl, String + wordNewUrl, Map> sameKeyWordSealMaps) throws RuntimeException { + ElectronicImage selectSeal = null; // 加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取关键字位置 - TextSelection[] textSelections = document.findAllString(electronicSealList.get(0).getKeyWord(), false, false); - for (ElectronicImage electronicSeal : electronicSealList) { - //加签章照片 - if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { - throw new RuntimeException("image url is empty or key word not exist in the word template ..."); + for (Map.Entry> entry : sameKeyWordSealMaps.entrySet()) { + List electronicSealList = entry.getValue(); + if (CollectionUtils.isEmpty(electronicSealList)) { + continue; } - //多处关键字添加同一个签章 - for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { - Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); - textSelections[keyWordIndex].getCount(); - - //添加公司印章 - DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); - //设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - //指定电子章位置 - //水平位置 - docPicture.setHorizontalPosition(electronicSeal.getHorizontal()); - //垂直位置 - docPicture.setVerticalPosition(electronicSeal.getVertical()); - //设置电子章大小 - docPicture.setWidth(electronicSeal.getStampWidth()); - docPicture.setHeight(electronicSeal.getStampHeight()); + //相同关键字的索引 + for (ElectronicImage electronicSeal : electronicSealList) { + //获取关键字位置 + TextSelection[] textSelections = document.findAllString(electronicSeal.getKeyWord(), false, false); + //加签章照片 + if (ObjectUtils.isEmpty(textSelections) || StringUtils.isEmpty(electronicSeal.getElectronicSealImageUrl())) { + log.warn("image url is empty or key word not exist in the word template ..."); + continue; + } + //多处关键字添加同一个签章 + for (int keyWordIndex = 0; keyWordIndex < textSelections.length; keyWordIndex++) { + Paragraph paragraph = textSelections[keyWordIndex].getAsOneRange().getOwnerParagraph(); + //添加公司印章 + DocPicture docPicture = paragraph.appendPicture(electronicSeal.getElectronicSealImageUrl()); + //设置图片位于文字顶层 + if (ObjectUtils.isNotEmpty(electronicSeal.getIsSealImage()) && electronicSeal.getIsSealImage()) { + docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); + } + DocPictureProvider.populateSingleImage(electronicSeal, keyWordIndex, textSelections, docPicture); + //带有公章的关键字且页数大于2,需要设置骑缝章 + if (INSIGNIA_KEYWORD.equals(electronicSeal.getKeyWord()) && document.getPageCount() >= 2) { + selectSeal = electronicSeal; + } + } } } - //保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); + return selectSeal; } /** @@ -154,7 +180,7 @@ */ public static void wordToPdf(String wordNewUrl, String pdfNewUrl) { PdfUtils.doc2pdf(wordNewUrl, pdfNewUrl); -//// 将新Word文档转换为PDF文件 +// 将新Word文档转换为PDF文件 // Document document = new Document(); // document.loadFromFile(wordNewUrl); // document.saveToFile(pdfNewUrl, FileFormat.PDF); @@ -168,6 +194,7 @@ * @param alpha * @return */ + @Deprecated public static BufferedImage convertLayout(BufferedImage imgsrc, float alpha) { try { //创建一个包含透明度的图片,半透明效果必须要存储为png合适才行,存储为jpg,底色为黑色 @@ -189,68 +216,39 @@ } } - //读取图片 - private static BufferedImage readImage(String imgpath) { - try { - BufferedImage bufferedImage = ImageIO.read(new File(imgpath)); - return bufferedImage; - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } - - //保存图片,extent为格式,"jpg"、"png"等 - private static void saveFile(BufferedImage img, String extent, String newfile) { - try { - ImageIO.write(img, extent, new File(newfile)); - } catch (Exception e) { - e.printStackTrace(); - } - } - - /** * 1、自定义位置添加电子印章 * 2、替换书签名位置文本内容 bookmarkName传参为null,则不进行书签替换操作 + * 3、 * * @param wordOldUrl word文件路径 * @param wordNewUrl 新word文件路径 */ - private static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, ElectronicImage absolutePathImage) { - // 加载文档 + public static void addAbsolutePathStamp(String wordOldUrl, String wordNewUrl, List absolutePathImageList) { + //加载文档 Document document = new Document(); document.loadFromFile(wordOldUrl); - //获取指定段落 - Section section = document.getSections().get(0); - //log.info("获取文档内容段落总数{}",count); - Paragraph paragraph = section.getParagraphs().get(0); - // 判断是否需要替换书签位置文本内容 - if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { - replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + for (ElectronicImage absolutePathImage : absolutePathImageList) { + if (ObjectUtils.isNotEmpty(absolutePathImage.getImageConfig())) { + //列表章处理的方法 + DocPictureProvider.populateMultiImage(absolutePathImage, document); + } else { + //不是骑缝章,就是认定章,获取默认段落信息,进行添加电子印章的信息位置 + Section section = document.getSections().get(DEFAULT_SEAL_INDEX); + Paragraph paragraph = section.getParagraphs().get(DEFAULT_SEAL_INDEX); + //判断是否需要替换书签位置文本内容 + if (StringUtils.isNotEmpty(absolutePathImage.getBookmarkName())) { + replaceBookmarkContent(document, absolutePathImage.getBookmarkName(), absolutePathImage.getNewBookmarkText()); + } + //添加电子印章 + DocPictureProvider.populateDocPicture(paragraph, absolutePathImage); + } } -// 添加电子印章 - DocPicture docPicture = paragraph.appendPicture(absolutePathImage.getElectronicSealImageUrl()); - -// 指定电子章位置 -// 水平位置 - docPicture.setHorizontalPosition(absolutePathImage.getHorizontal()); -// 垂直位置 - docPicture.setVerticalPosition(absolutePathImage.getVertical()); - -// 设置电子章大小 - docPicture.setWidth(absolutePathImage.getStampWidth()); - docPicture.setHeight(absolutePathImage.getStampHeight()); - -// 设置图片位于文字顶层 - docPicture.setTextWrappingStyle(TextWrappingStyle.In_Front_Of_Text); - // 保存添加电子章的Word文档 + // 保存添加电子章的Word文档 document.saveToFile(wordNewUrl); document.dispose(); -// log.info("文档添加电子印章结束,新WORD文档地址:{}",wordNewUrl); } - /** * 替换书签名位置文本内容为图片 * @@ -278,14 +276,12 @@ */ public void replaceBookmarkContentToTable(Document document, String bookmarkName) { //声明数组内容 - String[][] data = - { - new String[]{"分类", "等级", "编号"}, - new String[]{"A", "一级", "01A"}, - new String[]{"B", "二级", "02B"}, - new String[]{"C", "三级", "03C"}, - }; - + String[][] data = { + new String[]{"分类", "等级", "编号"}, + new String[]{"A", "一级", "01A"}, + new String[]{"B", "二级", "02B"}, + new String[]{"C", "三级", "03C"}, + }; //创建表格 Table table = new Table(document, true); table.resetCells(4, 3); @@ -299,47 +295,16 @@ dataRow.getCells().get(j).getCellFormat().setVerticalAlignment(VerticalAlignment.Middle); } } - //创建TextBodyPart对象 TextBodyPart bodyPart = new TextBodyPart(document); bodyPart.getBodyItems().add(table); - //定位到指定书签位置 BookmarksNavigator bookmarkNavigator = new BookmarksNavigator(document); bookmarkNavigator.moveToBookmark(bookmarkName); - //使用表格替换原书签的内容 bookmarkNavigator.replaceBookmarkContent(bodyPart); } - /** - * 文件转流 - * - * @param wordNewUrl - * @return - */ - public byte[] getBytesByFile(String wordNewUrl) { - try { -// byte[] bytes = Files.readAllBytes(Paths.get(wordNewUrl)); - File file = new File(wordNewUrl); - FileInputStream fis = new FileInputStream(file); - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - byte[] b = new byte[1024]; - int len = -1; - while ((len = fis.read(b)) != -1) { - bos.write(b, 0, len); - } - fis.close(); - bos.close(); - byte[] bytes = bos.toByteArray(); - System.out.println("successful..."); - return bytes; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - /** * doc 转 docx @@ -396,89 +361,75 @@ /** * 按照模板 填充数据生成word 只支持docx * - * @param templatePath 模板文件路径 - * @param temDir 生成文件的目录 - * @param fileName 生成文件名 - * @param params 参数 + * @param temDir 生成文件的目录 +// * @param fileNames 待处理的文件列表 + * @param params 参数 */ - public static String exportWord(String templatePath, String temDir, String fileName, Map params) { - Assert.notNull(templatePath, "模板路径不能为空"); + public static String exportWord(String temDir, String fileName, Map params, List mergeColNames, String customFileName) { + //两个文档合并为fileNames[0]文档 +// String fileName = mergeDoc(temDir, fileNames, (String) params.get("certificateNo")); Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(fileName, "导出文件名不能为空"); - if (fileName.endsWith(".doc")) { - docToDocx(templatePath, templatePath + "x"); - templatePath += "x"; - } Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式"); File dir = new File(temDir); if (!dir.getParentFile().exists()) { // 新建文件夹 dir.getParentFile().mkdirs(); } - String tmpPath = ""; + String filePath = ""; + FileOutputStream fos = null; try { + //执行文件填充 ParseWord07 parseWord07 = new ParseWord07(); - XWPFDocument doc = parseWord07.parseWord(templatePath, params, null); - tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); + XWPFDocument doc = parseWord07.parseWord(temDir + fileName, params, mergeColNames); + //新增定制化参数 + customFileName = StringUtils.isNotEmpty(customFileName) ? customFileName + ".docx" : fileName; + filePath = temDir + customFileName; + fos = new FileOutputStream(filePath); doc.write(fos); fos.flush(); - fos.close(); + //增加对固定文本框的文字填充的处理一般的poi不支持,需要调用poi-tl执行文件打印操作 + ConfigureBuilder builder = Configure.builder(); + XWPFTemplate compile = XWPFTemplate.compile(filePath, builder.build()); + compile.render(params); + compile.writeToFile(filePath); } catch (Exception e) { e.printStackTrace(); + } finally { + try { + if (fos != null) { + fos.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } } - return tmpPath; + return filePath; } - - public static void main(String[] args) throws RuntimeException { - - } - - public static void QRCodeExcel() throws Exception { -// String path = "D:\\casic\\cut\\"; -// String fileName = path + "1航天检定模版v1.xls"; -// List list = ListUtils.newArrayList(); -// ImageDemoData imageDemoData = new ImageDemoData(); -// list.add(imageDemoData); -// // 创建字节数组输出流 -// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); -// // 调用 QrCodeUtil.generate() 生成二维码,并将结果写入输出流 -// QRCodeUtil.getQRCode("helloworld", outputStream); -// // 从输出流中获取生成的二维码图像数据 -// byte[] qrCodeData = outputStream.toByteArray(); -// imageDemoData.setByteArray(qrCodeData); -// imageDemoData.setShortDesc("helloworld"); -// // 关闭输出流 -// outputStream.close(); -// // 写入数据 -// EasyExcel.write(fileName, ImageDemoData.class).sheet().doWrite(list); - } - - protected static ElectronicImage defaultElectronicSignSeal(String keyWord, float horizontal) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-50f) - .horizontal(450f) - .stampHeight(100f) - .stampWidth(100f) - .diaphaneity(150f) - .build(); - return electronicImage; - } - - protected static ElectronicImage defaultElectronicSignName(String keyWord) { - ElectronicImage electronicImage = ElectronicImage.builder() - .keyWordIndex(-1) - .keyWord(keyWord) - .vertical(-10f) - .horizontal(60f) - .stampHeight(40f) - .stampWidth(60f) - .diaphaneity(150f) - .build(); - return electronicImage; + /** + * 多个docx文档合并功能,合并为第一个文档 + * + * @param localPathUrl + * @param fileNames + * @return + */ + public static String mergeDoc(String localPathUrl, List fileNames, String recordNo) { + //doc合并 + if (CollectionUtils.isEmpty(fileNames)) { + return null; + } + if (fileNames.size() > 1) { + String word1Url = localPathUrl + fileNames.get(0); + Document mainDoc = new Document(word1Url); + for (int i = 1; i < fileNames.size(); ) { + String word2Url = localPathUrl + fileNames.get(i++); + mainDoc.insertTextFromFile(word2Url, FileFormat.Docx_2010); + } + DocPictureProvider.headerFooter(mainDoc, recordNo); + //保存合并后的文档 + mainDoc.saveToFile(word1Url, FileFormat.Docx_2010); + } + return fileNames.get(0); } } \ No newline at end of file diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java index ec6f2d8..43cdd09 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/ImageTool.java @@ -1,10 +1,8 @@ package com.casic.missiles.service.listeners.register; import com.casic.missiles.dto.business.file.CropPicture; -import com.spire.doc.fields.DocPicture; import javax.imageio.ImageIO; -import javax.imageio.ImageReader; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; @@ -16,18 +14,17 @@ public class ImageTool { - public static List crosswiseCutting(CropPicture cropPicture) throws IOException { + public static List doCrosswiseCutting(CropPicture cropPicture) throws IOException { // 读入大图 File file = new File(cropPicture.getTargetImgUrl()); FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); +// System.out.println(file.exists()); BufferedImage image = ImageIO.read(fis); int chunks = cropPicture.getCutRows() * cropPicture.getCutCols(); - ImageReader imageReader=ImageIO.getImageReadersBySuffix(cropPicture.getTargetImgUrl()).next(); // 计算每个小图的宽度和高度 int chunkWidth = image.getWidth() / cropPicture.getCutCols(); int chunkHeight = image.getHeight() / cropPicture.getCutRows(); - System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 +// System.out.println("图片的宽度为:" + chunkWidth * cropPicture.getCutRows() + "图片的高度为:" + chunkHeight * cropPicture.getCutCols());//230,278 BufferedImage imgs[] = new BufferedImage[chunks]; for (int x = 0,count = 0; x < cropPicture.getCutRows(); x++) { for (int y = 0; y < cropPicture.getCutCols(); y++) { @@ -36,44 +33,21 @@ //写入图像内容 Graphics2D gr = imgs[count++].createGraphics(); gr.drawImage(image, 0, 0, chunkWidth, chunkHeight, chunkWidth * y, chunkHeight * x, chunkWidth * y + chunkWidth, chunkHeight * x + chunkHeight, null); - System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); +// System.out.println("源矩阵第一个角的坐标" + chunkWidth * y + "+" + chunkHeight * x + "源矩阵第二个角的坐标" + chunkWidth * (y + 1) + "+" + chunkHeight * (x + 1)); gr.dispose(); } } List subfileUrls = new ArrayList<>(); // 输出小图 for (int i = 0; i < imgs.length; i++) { - subfileUrls.add(cropPicture.getSubfileUrl() + i + cropPicture.getSubfileType()); + subfileUrls.add(cropPicture.getSubfileUrl() + i +"."+cropPicture.getSubfileType()); ImageIO.write(imgs[i], cropPicture.getSubfileType(), new File(subfileUrls.get(subfileUrls.size() - 1))); System.out.println(i); } + fis.close(); System.out.println("完成分割!"); return subfileUrls; } - public static void main(String[] agrs) throws IOException { - String originalImg = "D:\\casic\\tmp\\1645701777117741057\\ceshi.jpg"; - // 读入大图 - File file = new File(originalImg); - FileInputStream fis = new FileInputStream(file); - System.out.println(file.exists()); - BufferedImage image = ImageIO.read(fis); - /* - * 假设我需要切割的四点坐标为a(20,30)b(200,40)c(30,200)d(200,210) - * 起始坐标为(最小的x,最小的y) - * 此时的实际切割坐标应为由a为起始坐标,width为(x坐标最大的点的x - a的x坐标),height为(y坐标最大的点的y - a的y坐标) - * 此时的width为180,height为180 - */ - //切割图片 - BufferedImage bf = new BufferedImage(image.getWidth(), image.getHeight(), image.getType()); - Graphics2D graphics2D = bf.createGraphics(); - graphics2D.drawImage(image, 20, 30, 180, 180, 0, 0, 180, 180, null); - graphics2D.dispose(); - //输出图片 - Random random = new Random(); - int j = random.nextInt(1000); - ImageIO.write(bf, "jpg", new File("D:\\casic\\tmp\\1645701777117741057" + j + ".jpg")); - System.out.println("完成切割"); - } } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java index aeaa778..290f3f2 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/PrintFileRegister.java @@ -1,26 +1,22 @@ package com.casic.missiles.service.listeners.register; import cn.hutool.core.lang.Assert; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.AwareFilePrintTypeEnum; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.utils.MinioUtil; import com.casic.missiles.utils.SpringContextUtil; -import io.minio.GetObjectArgs; import io.minio.MinioClient; import lombok.extern.slf4j.Slf4j; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.mock.web.MockMultipartFile; import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; -import javax.servlet.http.HttpServletResponse; import java.io.*; -import java.util.List; import java.util.Objects; /** @@ -42,12 +38,17 @@ /** * 新增,增加文件流回传下载 - * @param printFileRegister + * + * @param customObject * @param prefixType * @return */ - public String registerPrintFile(Object printFileRegister, String prefixType) { - return this.registerPrintFile(printFileRegister, prefixType, null); + public String registerPrintFile(Object customObject, String prefixType) { + return this.registerPrintFile(RegisterCustomParameters. + builder() + .customObject(customObject) + .prefixType(prefixType). + build()); } /** @@ -59,43 +60,48 @@ * 5、递归删除因为打印产生的文件信息 * 6、返还打印产生的证书文件 */ - public String registerPrintFile(Object printFileRegister, String prefixType, HttpServletResponse response) { + public String registerPrintFile(RegisterCustomParameters registerParameters) { String tempLocalFileDir = localFileDir; - Assert.isFalse(Objects.isNull(printFileRegister), () -> { + Assert.isFalse(Objects.isNull(registerParameters.getCustomObject()), () -> { throw new RuntimeException("the certificateReport is null,please check your params..."); }); //获取对应证书的beanName String fileDataRegisterBeanName = AwareFilePrintTypeEnum.CERTIFICATE_TYPE_BEAN_MAP - .getCertificateTypeBeanMap().get(prefixType); + .getCertificateTypeBeanMap().get(registerParameters.getPrefixType()); Assert.isFalse(StringUtils.isEmpty(fileDataRegisterBeanName), () -> { throw new RuntimeException("the bean mapped by this certificate type has no mapping relationship..."); }); + String printDocUrl = null, miniName = ""; PrintFileDataGeneric fileDataGeneric = SpringContextUtil.getBean(fileDataRegisterBeanName); + FilePrintRegister filePrintRegister = fileDataGeneric.CustomizedPrintFileRegister(registerParameters, tempLocalFileDir); if (fileDataGeneric != null) { - FilePrintRegister metaData = fileDataGeneric.CustomizedPrintFileRegister(printFileRegister, tempLocalFileDir); - //获取文件夹目录,没有则创建 - tempLocalFileDir = tempLocalFileDir + metaData.getFileNameId() + File.separator; - getLocalFileDir(tempLocalFileDir); - //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 - for (String fileName : metaData.getBeDownloadedFileNames()) { - downTemplateFile(fileName, tempLocalFileDir); + try { + //获取文件夹目录,没有则创建 + tempLocalFileDir = tempLocalFileDir + filePrintRegister.getFileNameId() + File.separator; + getLocalFileDir(tempLocalFileDir); + //证书产生准备工作,将相应的文件下载到本地的工作空间,获取相应的模板的读取权限 + for (String fileName : filePrintRegister.getBeDownloadedFileNames()) { + downTemplateFile(fileName, tempLocalFileDir); + } + //合并注册 + filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); + printDocUrl = FilePrintRegisterUtils.filePrintGenerate(filePrintRegister); + + } catch (RuntimeException rex) { + log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters), rex); + } finally { + if (printDocUrl != null) { + //如果文件路径不为空,回传文件流 + miniName = createResponseFileInput(printDocUrl, registerParameters.getResponse()); + } + //删除无效的文件 + File invalidFile = new File(tempLocalFileDir); + // 删除运行空间下的文件 + deleteFile(invalidFile); + log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); } - //合并注册 - String certificatePdfUrl = FilePrintRegisterUtils.filePrintGenerate(metaData); - //上传到服务器 -// String certificatePdfName = uploadCertificate(certificatePdfUrl); - //如果文件路径不为空,回传文件流 - if(StringUtils.isNotEmpty(certificatePdfUrl)){ - createResponseFileInput(certificatePdfUrl,response); - } - //删除无效的文件 - File invalidFile = new File(tempLocalFileDir); - log.debug("invalid print file start delete, the file directory is {}", tempLocalFileDir); - //删除运行空间下的文件 - deleteFile(invalidFile); - return certificatePdfUrl; } - throw new RuntimeException("the bean mapped to this certificate type is empty..."); + return miniName; } /** @@ -109,5 +115,4 @@ boolean dr = file.mkdirs(); //创建目录 } - } diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java index 3f825b1..c259241 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/FileParamDataProvider.java @@ -68,6 +68,7 @@ fileParamData.put("customerSampleName", customerSampleInfo.getSampleName()); fileParamData.put("sampleModel", customerSampleInfo.getSampleModel()); fileParamData.put("manufacturingNo", customerSampleInfo.getManufacturingNo()); + fileParamData.put("manufacturer", customerSampleInfo.getManufacturer()); fileParamData.put("sampleNo", customerSampleInfo.getSampleNo()); fileParamData.put("sampleName", customerSampleInfo.getSampleName()); fileParamData.put("customerSampleNo", customerSampleInfo.getSampleNo()); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java index de89e27..4980a69 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataGeneric.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; public interface PrintFileDataGeneric { @@ -9,7 +10,7 @@ * * 2、组装参数param外的参数 * * 3、填充注册表信息参数 */ - FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir); + FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java index 3f7b303..8a16e91 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/PrintFileDataSupport.java @@ -39,6 +39,7 @@ protected final FilePrintRegister initialization(String templateFileDir, Long id, String fileName) { FilePrintRegister filePrintRegister = new FilePrintRegister(); + filePrintRegister.setTemplateWordType(fileName.endsWith(".docx") ? true : false); templateFileDir = templateFileDir + id + File.separator; filePrintRegister.setFileName(fileName); filePrintRegister.setTemDir(templateFileDir); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java deleted file mode 100644 index c9272ca..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CalibrationPrintFileData.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.*; -import java.util.stream.Collectors; - -/** - * 校准证书参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.CALIBRATION_CERTIFICATE_BEAN) -public class CalibrationPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); - return filePrintRegister; - } - - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "核验人", "审核人" ); - customizedSignNames = Arrays.asList("校准人", "核验人", "批准人" ); - } - - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java new file mode 100644 index 0000000..0059289 --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificatePrintFileData.java @@ -0,0 +1,77 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import liquibase.pro.packaged.A; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + + +/** + * 校准证书参数生成 + */ +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificatePrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java new file mode 100644 index 0000000..86d089c --- /dev/null +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/CertificateReportApprovalData.java @@ -0,0 +1,71 @@ +package com.casic.missiles.service.listeners.register.data.certificate; + +import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +import com.casic.missiles.dto.business.file.FilePrintRegister; +import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +import com.casic.missiles.model.business.BusinessCertificateReport; +import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +import com.casic.missiles.utils.SnowflakeUtil; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.text.SimpleDateFormat; +import java.util.Map; + +@Slf4j +@Component(PrintFileDataBeanNameAliasEnum.CERTIFICATE_REPORT) +public class CertificateReportApprovalData extends PrintFileDataSupport implements PrintFileDataGeneric { + + @Autowired + private SnowflakeUtil snowflakeUtil; + + /** + * \ + * 1、识别是word excel填充 + * 2、进行打印证书对象的初始化 + * 3、获取定制化的签名 + * 4、获取定制化的参数 + * + * @param registerParameters 证书报告信息 + * @param templateFileDir 本地进行打印报告组合的路径 + * @return + */ + @Override + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessCertificateReport metaData = (BusinessCertificateReport) registerParameters.getCustomObject(); + if (ObjectUtils.isEmpty(metaData.getId())) { + metaData.setId(snowflakeUtil.nextId()); + } + //初始化,生成模板文件 + FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); + //填充定制化的参数 + filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(), metaData.getSampleId())); + //定制化参数开发 + customParam(metaData, filePrintRegister.getParams()); + return filePrintRegister; + } + + /** + * 处理定制化的日期 + * + * @param metaData + */ + private void customParam(BusinessCertificateReport metaData, Map params) { + try { + if (StringUtils.isNotEmpty(metaData.getIssuanceDate())) { + params.put("issuanceDate", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getIssuanceDate()))); + } + if (StringUtils.isNotEmpty(metaData.getCalibrationTime())) { + params.put("calibrationTime", new SimpleDateFormat("yyyy年MM月dd日").format(new SimpleDateFormat("yyyy-MM-dd").parse(metaData.getCalibrationTime()))); + } + params.put("createUserName", metaData.getCreateUserName()); + } catch (Exception ex) { + log.error("日期格式转换异常,异常信息{}", ex); + } + } + +} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java deleted file mode 100644 index fda19dd..0000000 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/certificate/TestReportPrintFileData.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.casic.missiles.service.listeners.register.data.certificate; - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.model.business.BusinessCertificateReport; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.lang3.StringUtils; -import org.springframework.stereotype.Component; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - - -/** - * 测试报告参数生成 - */ -@Component(PrintFileDataBeanNameAliasEnum.TEST_REPORT_BEAN) -public class TestReportPrintFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - /** - * 1、进行打印证书对象的初始化 - * 2、获取定制化的签名 - * 3、获取定制化的参数 - * 4、获取电子签名的文件列表 - * 5、获取电子签章的文件列表 - * 6、证书报告其他参数填充的列表(可重写) - * - * @param object 证书报告信息 - * @param templateFileDir 本地进行打印报告组合的路径 - * @return - */ - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessCertificateReport metaData = (BusinessCertificateReport) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - customizedSignNamesParamCreator(); - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - electronicSignList.addAll(customizedElectronicSignSeals(metaData, filePrintRegister)); - filePrintRegister.setElectronicImageList(electronicSignList); - filePrintRegister.setParams(certificateFileParamCreator(metaData.getOrderId(),metaData.getSampleId())); - return filePrintRegister; - } - - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("发起人", "审核人", "批准人" ); - customizedSignNames = Arrays.asList("校准人", "发证单位", "批准人" ); - } - /** - * 定制化电子签章文件 - * - * @param metaData - * @return - */ - private List customizedElectronicSignSeals(BusinessCertificateReport metaData, FilePrintRegister filePrintRegister) { - List electronicImageSeals = new ArrayList<>(); - ElectronicImage electronicImage = defaultElectronicSignSeal("发证单位"); - electronicImageSeals.add(doPopulateElectronicSignSeal(metaData.getSignId(), electronicImage, filePrintRegister)); - if (StringUtils.isNotEmpty(metaData.getApprovalSignIds())) { - String[] approvalSignIds = metaData.getApprovalSignIds().split(","); - List electronicImages = autoCreteAbsoluteSignSealByNumber(approvalSignIds.length); - for (int i = 0; i < approvalSignIds.length; i++) { - electronicImageSeals.add(doPopulateElectronicSignSeal(Long.valueOf(approvalSignIds[i]), electronicImages.get(i), filePrintRegister)); - } - } - return electronicImageSeals; - } - -} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java index 9c46357..93109ef 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/CalibrationOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String calibrationOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationOrderTemplateName)); //关联数据 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java index 1156f4f..00a2119 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/order/TestOrderPrintFileData.java @@ -1,5 +1,6 @@ package com.casic.missiles.service.listeners.register.data.order; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.model.business.BusinessOrder; @@ -21,8 +22,8 @@ private String testOrderTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOrder metaData = (BusinessOrder) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOrder metaData = (BusinessOrder) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(testOrderTemplateName)); //关联数据 @@ -34,7 +35,7 @@ private TestOrderPrintFileData sampleInfoPopulate(FilePrintRegister filePrintRegister, List customerSampleInfoList) { List> sampleList = new ArrayList<>(); - if(!CollectionUtils.isEmpty(customerSampleInfoList)){ + if (!CollectionUtils.isEmpty(customerSampleInfoList)) { for (int i = 0; i < customerSampleInfoList.size(); i++) { customerSampleInfoList.get(i).setSeq(i + 1); Map map = new HashMap<>(); @@ -72,10 +73,10 @@ map.put("receiveDate", metaData.getReceiveDate()); map.put("type1", "\u25CB"); map.put("type2", "\u25CB"); - if(Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()){ + if (Objects.nonNull(metaData.getContactReturn()) && 1 == metaData.getContactReturn()) { map.put("type1", "\u2299"); } - if(Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()){ + if (Objects.nonNull(metaData.getDirectReturn()) && 1 == metaData.getDirectReturn()) { map.put("type2", "\u2299"); } Map params = new HashMap<>(); diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java index e140056..6e652e9 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/original/OriginalRecord.java @@ -1,20 +1,14 @@ package com.casic.missiles.service.listeners.register.data.original; -import com.casic.missiles.dto.business.certificate.ElectronicImage; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; -import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; import org.springframework.stereotype.Component; import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; /** * 原始记录生成 @@ -24,8 +18,8 @@ public class OriginalRecord extends PrintFileDataSupport implements PrintFileDataGeneric { @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessOriginalRecord metaData = (BusinessOriginalRecord) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessOriginalRecord metaData = (BusinessOriginalRecord) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(metaData.getTemplateId())); //定制化签名开发预处理,定制化参数 diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java index 261882a..1f475fc 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/CalibrationFileData.java @@ -1,85 +1,86 @@ -package com.casic.missiles.service.listeners.register.data.site; - - -import com.casic.missiles.dto.business.certificate.ElectronicImage; -import com.casic.missiles.dto.business.file.FilePrintRegister; -import com.casic.missiles.dto.flowable.ApprovalLogResponse; -import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; -import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; -import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; -import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; -import org.apache.commons.collections.CollectionUtils; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; -import org.springframework.util.ObjectUtils; - -import java.util.*; -import java.util.stream.Collectors; - -@Component(PrintFileDataBeanNameAliasEnum.EXTERNAL_CALIBRATION_FILE_BEAN) -public class CalibrationFileData extends PrintFileDataSupport implements PrintFileDataGeneric { - - @Value("${casic.template.calibration}") - private String calibrationTemplateName; - - @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessSiteExecutiveInfo metaData = (BusinessSiteExecutiveInfo) object; - //初始化,生成模板文件 - FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationTemplateName)); - //查询工作流审批记录 - List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); - Map> ApprovalLogMap = approvalLogList.stream() - .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); - //定制化签名开发预处理,定制化参数 - customizedSignNamesParamCreator(); - //定制化签名开发 - List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); - filePrintRegister.setElectronicImageList(electronicSignList); - //填充定制化的参数 - filePrintRegister.setParams(siteFileParamCreator(metaData.getOrderId(), metaData.getId())); - filePrintRegister.getParams().putAll(populateCalibration(metaData)); - resolverApprovalTime(filePrintRegister, ApprovalLogMap); - return filePrintRegister; - } - - private Map populateCalibration(BusinessSiteExecutiveInfo metaData) { - Map calibrationDataParams = new HashMap<>(); - calibrationDataParams.put("siteExecutiveNo", metaData.getSiteExecutiveNo()); - calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); - calibrationDataParams.put("siteExecutiveName", metaData.getSiteExecutiveName()); -// environmentDataParams.put("zeroVoltage", metaData.getZeroGroundVoltage()); - calibrationDataParams.put("executiveEnvironment", metaData.getExecutiveEnvironment()); - return calibrationDataParams; - } - - /** - * 文件自定义名称参数构建器 - */ - @Override - protected void customizedSignNamesParamCreator() { - keyParamList = Arrays.asList("审核人", "批准人"); - customizedSignNames = Arrays.asList("技术负责人审核", "计量测试站主任批准"); - } - - private void resolverApprovalTime(FilePrintRegister filePrintRegister, Map> ApprovalLogMap) { - for (int i = 0; i < keyParamList.size(); i++) { - if (ApprovalLogMap.containsKey(keyParamList.get(i))) { - List approvalLogResponseList = ApprovalLogMap.get(keyParamList.get(i)); - if (CollectionUtils.isNotEmpty(approvalLogResponseList)) { - Optional optionalApprovalLogResponse = approvalLogResponseList.stream().findFirst(); - if (optionalApprovalLogResponse.isPresent()) { - Date nodeFinishTime = optionalApprovalLogResponse.get().getFinishTime(); - if(!ObjectUtils.isEmpty(nodeFinishTime)){ - Calendar calendar = Calendar.getInstance(); - calendar.setTime(nodeFinishTime); - filePrintRegister.getParams().put("y" + i, calendar.get(Calendar.YEAR)); - filePrintRegister.getParams().put("m" + i, calendar.get(Calendar.MONTH) + 1); - filePrintRegister.getParams().put("d" + i, calendar.get(Calendar.DAY_OF_MONTH)); - } - } - } - } - } - } -} +//package com.casic.missiles.service.listeners.register.data.site; +// +// +//import com.casic.missiles.dto.business.certificate.ElectronicImage; +//import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; +//import com.casic.missiles.dto.business.file.FilePrintRegister; +//import com.casic.missiles.dto.flowable.ApprovalLogResponse; +//import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; +//import com.casic.missiles.model.business.BusinessSiteExecutiveInfo; +//import com.casic.missiles.service.listeners.register.data.PrintFileDataGeneric; +//import com.casic.missiles.service.listeners.register.data.PrintFileDataSupport; +//import org.apache.commons.collections.CollectionUtils; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.stereotype.Component; +//import org.springframework.util.ObjectUtils; +// +//import java.util.*; +//import java.util.stream.Collectors; +// +//@Component(PrintFileDataBeanNameAliasEnum.EXTERNAL_CALIBRATION_FILE_BEAN) +//public class CalibrationFileData extends PrintFileDataSupport implements PrintFileDataGeneric { +// +// @Value("${casic.template.calibration}") +// private String calibrationTemplateName; +// +// @Override +// public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { +// BusinessSiteExecutiveInfo metaData = (BusinessSiteExecutiveInfo) registerParameters.getCustomObject(); +// //初始化,生成模板文件 +// FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(calibrationTemplateName)); +// //查询工作流审批记录 +// List> approvalLogList = approvalOperateService.approvalLog(metaData.getProcessId()); +// Map> ApprovalLogMap = approvalLogList.stream() +// .collect(Collectors.toMap(e -> e.get(0).getTaskName(), e -> e)); +// //定制化签名开发预处理,定制化参数 +// customizedSignNamesParamCreator(); +// //定制化签名开发 +// List electronicSignList = this.signNamesCreator(ApprovalLogMap, filePrintRegister); +// filePrintRegister.setElectronicImageList(electronicSignList); +// //填充定制化的参数 +// filePrintRegister.setParams(siteFileParamCreator(metaData.getOrderId(), metaData.getId())); +// filePrintRegister.getParams().putAll(populateCalibration(metaData)); +// resolverApprovalTime(filePrintRegister, ApprovalLogMap); +// return filePrintRegister; +// } +// +// private Map populateCalibration(BusinessSiteExecutiveInfo metaData) { +// Map calibrationDataParams = new HashMap<>(); +// calibrationDataParams.put("siteExecutiveNo", metaData.getSiteExecutiveNo()); +// calibrationDataParams.put("executiveAddress", metaData.getExecutiveAddress()); +// calibrationDataParams.put("siteExecutiveName", metaData.getSiteExecutiveName()); +//// environmentDataParams.put("zeroVoltage", metaData.getZeroGroundVoltage()); +// calibrationDataParams.put("executiveEnvironment", metaData.getExecutiveEnvironment()); +// return calibrationDataParams; +// } +// +// /** +// * 文件自定义名称参数构建器 +// */ +// @Override +// protected void customizedSignNamesParamCreator() { +// keyParamList = Arrays.asList("审核人", "批准人"); +// customizedSignNames = Arrays.asList("技术负责人审核", "计量测试站主任批准"); +// } +// +// private void resolverApprovalTime(FilePrintRegister filePrintRegister, Map> ApprovalLogMap) { +// for (int i = 0; i < keyParamList.size(); i++) { +// if (ApprovalLogMap.containsKey(keyParamList.get(i))) { +// List approvalLogResponseList = ApprovalLogMap.get(keyParamList.get(i)); +// if (CollectionUtils.isNotEmpty(approvalLogResponseList)) { +// Optional optionalApprovalLogResponse = approvalLogResponseList.stream().findFirst(); +// if (optionalApprovalLogResponse.isPresent()) { +// Date nodeFinishTime = optionalApprovalLogResponse.get().getFinishTime(); +// if(!ObjectUtils.isEmpty(nodeFinishTime)){ +// Calendar calendar = Calendar.getInstance(); +// calendar.setTime(nodeFinishTime); +// filePrintRegister.getParams().put("y" + i, calendar.get(Calendar.YEAR)); +// filePrintRegister.getParams().put("m" + i, calendar.get(Calendar.MONTH) + 1); +// filePrintRegister.getParams().put("d" + i, calendar.get(Calendar.DAY_OF_MONTH)); +// } +// } +// } +// } +// } +// } +//} diff --git a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java index 134190c..5a75962 100644 --- a/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java +++ b/casic-metering-service/src/main/java/com/casic/missiles/service/listeners/register/data/site/EnvironmentalRecordData.java @@ -2,6 +2,7 @@ import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.business.file.FilePrintRegister; import com.casic.missiles.enums.notifyevent.PrintFileDataBeanNameAliasEnum; import com.casic.missiles.mapper.meter.MeterStaffMapper; @@ -36,8 +37,8 @@ private String environmentalTemplateName; @Override - public FilePrintRegister CustomizedPrintFileRegister(Object object, String templateFileDir) { - BusinessSiteExecutiveLog metaData = (BusinessSiteExecutiveLog) object; + public FilePrintRegister CustomizedPrintFileRegister(RegisterCustomParameters registerParameters, String templateFileDir) { + BusinessSiteExecutiveLog metaData = (BusinessSiteExecutiveLog) registerParameters.getCustomObject(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), getTemplateName(environmentalTemplateName)); // preparePopulateParams(metaData); @@ -73,7 +74,7 @@ */ private Map resolveRecordTime(String recorderDateStr, int index) { Map filePrintDataParams = new HashMap<>(); - if(StringUtils.isNotEmpty(recorderDateStr)){ + if (StringUtils.isNotEmpty(recorderDateStr)) { Date recordDate = DateUtil.parse(recorderDateStr, "yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); calendar.setTime(recordDate);