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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.6 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 f427bc9..a06164b 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,9 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + + ReturnDTO exportApprovalCertificateFile(Long id); Page certificateRecordsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; } 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 f427bc9..a06164b 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,9 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + + ReturnDTO exportApprovalCertificateFile(Long id); 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 38db277..c7fd881 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 @@ -3,8 +3,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MeasureTypeEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.enums.sample.SampleStatusEnum; @@ -64,7 +66,7 @@ if (sampleInfo != null) { //比较哪个时间更早 String endTime = sampleInfo.getValidDeadline(); - if (StringUtils.isNotEmpty(endTime)) { + if (StringUtils.isNotEmpty(endTime)&&StringUtils.isNotEmpty(certificateReport1.getExpirationDate())) { endTime = DateUtil.compare(DateUtil.parseDateTime(endTime), DateUtil.parseDateTime(certificateReport1.getExpirationDate())) < 0 ? endTime : certificateReport1.getExpirationDate(); } @@ -81,62 +83,9 @@ } } } - - //获取证书报告信息 - certificateReport = certificateReportMapper.selectById(id); - //进行证书报告生成,并在远程注册服务器注册 - PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); - try { - DictCodeUtils.convertDictCodeToName(certificateReport); -// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); -// //生成证书打印信息 -// CertificatePrintBuilder(certificateReport, printFileName); - } catch (Exception ex) { - log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); - } - - } - - /** - * 通过审批的证书报告,产生证书打印 - */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); - int row = certificatePrintMapper.insert(certificatePrint); - if (row <= 0) { - throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); - } } - /** - * 审批通过的证书报告,生成相应的证书打印信息 - * - * @param certificateReport - * @return - */ - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() - .certificateReportCode(certificateReport.getCertificateReportCode()) - .certificateReportFile(certificateReport.getCertificateReportFile()) - .certificateReportType(certificateReport.getCertificateReportType()) - .certificateReportCategory(certificateReport.getCertificateReportCategory()) - .certificateReportName(certificateReport.getCertificateReportName()) - .measureDeptId(certificateReport.getMeasureDeptId()) - .measurePersonId(certificateReport.getMeasurePersonId()) - .originalRecordId(certificateReport.getOriginalRecordId()) - .remark(certificateReport.getRemark()) - .sampleId(certificateReport.getSampleId()) - .orderId(certificateReport.getOrderId()) - .templateId(certificateReport.getTemplateId()) - .signId(certificateReport.getSignId()) - .printFileName(printFileName) - .printNum(0) - .printStatus("1") - .createUser(certificateReport.getCreateUser()) - .build(); - return certificatePrint; - } + } 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 f427bc9..a06164b 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,9 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + + ReturnDTO exportApprovalCertificateFile(Long id); 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 38db277..c7fd881 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 @@ -3,8 +3,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MeasureTypeEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.enums.sample.SampleStatusEnum; @@ -64,7 +66,7 @@ if (sampleInfo != null) { //比较哪个时间更早 String endTime = sampleInfo.getValidDeadline(); - if (StringUtils.isNotEmpty(endTime)) { + if (StringUtils.isNotEmpty(endTime)&&StringUtils.isNotEmpty(certificateReport1.getExpirationDate())) { endTime = DateUtil.compare(DateUtil.parseDateTime(endTime), DateUtil.parseDateTime(certificateReport1.getExpirationDate())) < 0 ? endTime : certificateReport1.getExpirationDate(); } @@ -81,62 +83,9 @@ } } } - - //获取证书报告信息 - certificateReport = certificateReportMapper.selectById(id); - //进行证书报告生成,并在远程注册服务器注册 - PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); - try { - DictCodeUtils.convertDictCodeToName(certificateReport); -// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); -// //生成证书打印信息 -// CertificatePrintBuilder(certificateReport, printFileName); - } catch (Exception ex) { - log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); - } - - } - - /** - * 通过审批的证书报告,产生证书打印 - */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); - int row = certificatePrintMapper.insert(certificatePrint); - if (row <= 0) { - throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); - } } - /** - * 审批通过的证书报告,生成相应的证书打印信息 - * - * @param certificateReport - * @return - */ - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() - .certificateReportCode(certificateReport.getCertificateReportCode()) - .certificateReportFile(certificateReport.getCertificateReportFile()) - .certificateReportType(certificateReport.getCertificateReportType()) - .certificateReportCategory(certificateReport.getCertificateReportCategory()) - .certificateReportName(certificateReport.getCertificateReportName()) - .measureDeptId(certificateReport.getMeasureDeptId()) - .measurePersonId(certificateReport.getMeasurePersonId()) - .originalRecordId(certificateReport.getOriginalRecordId()) - .remark(certificateReport.getRemark()) - .sampleId(certificateReport.getSampleId()) - .orderId(certificateReport.getOrderId()) - .templateId(certificateReport.getTemplateId()) - .signId(certificateReport.getSignId()) - .printFileName(printFileName) - .printNum(0) - .printStatus("1") - .createUser(certificateReport.getCreateUser()) - .build(); - return certificatePrint; - } + } 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 4ff0b77..61db6ed 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 @@ -7,6 +7,7 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.service.listeners.util.PdfUtils; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; @@ -19,6 +20,10 @@ import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; +import com.itextpdf.text.pdf.parser.ImageRenderInfo; +import com.itextpdf.text.pdf.parser.PdfReaderContentParser; +import com.itextpdf.text.pdf.parser.RenderListener; +import com.itextpdf.text.pdf.parser.TextRenderInfo; import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.HeaderFooter; @@ -29,6 +34,7 @@ import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; import javax.imageio.ImageIO; import javax.swing.*; @@ -151,13 +157,135 @@ } public static void main(String[] args) throws Exception { - String path = "D:\\casic\\cut\\"; - String filePath = path + "1.xlsx"; - String image = path + "test.png"; - write("{qr}", image, filePath,path+"2.xls"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); +// PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); +// PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); +// for (float[] f : list) { +// // 读图片 +// com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(imagePath); +// // 获取操作的页面 +// PdfContentByte under = pdfStamper.getOverContent((int) f[2]); +//// image.scaleAbsolute(100, 100); +//// // 添加图片 +// image.setAbsolutePosition((int) f[0], (int) f[1],BaseFont.NOT_EMBEDDED)) +// under.addImage(image); +// +// } +// pdfStamper.close(); +// pdfReader.close(); } + // 指定关键字 + public static String KEY_WORD = "j检定专业"; + // PDF当前页数 + public static int curPage = 0; + + /** + * 获取指定PDF文件中指定关键字的坐标 + * + * @param fileByte + * @return + * @throws Exception + */ + public static List getKeyWordCoordinate(byte[] fileByte, String keyWord) throws ServiceException { + // 坐标信息集合 + List arrays = new ArrayList<>(); + final int[] count = {0}; + if (keyWord.toCharArray().length < 2) { + return null; + } + PdfReader pdfReader = null; + try { + pdfReader = new PdfReader(fileByte); + int pageNum = pdfReader.getNumberOfPages(); + PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader); + for (curPage = 1; curPage <= pageNum; curPage++) { + pdfReaderContentParser.processContent(curPage, new RenderListener() { + // 关键字标志 + boolean isKeyWord = false; + // PDF读出来的文字与截取关键字的第index位对比,如果在关键字的长度里 + /** + * 这里从PDF中是一个一个读取文字的,把读取出来的PDF文字先和关键字的第一个字比较看是否相同: + * 如果相同,则假设已经找到关键字(将isKeyWord设为true),把这个关键字的坐标存到集合里面,并计算集合里存放了多少个数据(count++)、设置进入到一个循环(loop + * = true一个循环即为关键字从第一个字到最后一个字依次和读取的PDF文字比较的过程); + * 如果在这个比较过程中发现有的字符和关键字不匹配,则移除与之对应的集合里的数据。 + */ + // 关键字的第几位 + int index = 0; + // 对比关键字是否进入到一个循环 + boolean loop = false; + + // 处理数据 + @Override + public void renderText(TextRenderInfo textRenderInfo) { + String text = textRenderInfo.getText(); + if (text.contains(new String(keyWord.toCharArray())) && text != null) { + // 把当前从PDF文件中读取的文字横坐标、纵坐标和当前页存到集合里面 + com.itextpdf.awt.geom.Rectangle2D.Float.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange(); + float[] resu = new float[3]; + resu[0] = boundingRectange.x; + resu[1] = boundingRectange.y; + resu[2] = curPage; + arrays.add(resu); + count[0] = count[0] + 1; + + isKeyWord = true; + loop = true; + return; + } + + if (isKeyWord) { + // 获取关键字中下一个字符和读取文字比较 + index++; + + if (index < keyWord.toCharArray().length) { + if (text.equalsIgnoreCase(new String(keyWord.toCharArray(), index, 1)) && text != null) { + isKeyWord = true; + return; + } else { + isKeyWord = false; + + } + } else { + // 如果index大于关键字字符数组的长度,则该循环结束 + loop = false; + } + } + + index = 0; + } + + @Override + public void renderImage(ImageRenderInfo arg0) { + + } + + @Override + public void endTextBlock() { + + } + + @Override + public void beginTextBlock() { + + } + }); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (pdfReader != null) { + pdfReader.close(); + } + } + return arrays; + } + public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { System.out.println("进来了 不匹配 跳出"); @@ -208,6 +336,7 @@ return; } } + /** * @param imgSrc 原图片地址 * @param imgTarget 新图片地址 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 f427bc9..a06164b 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,9 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + + ReturnDTO exportApprovalCertificateFile(Long id); 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 38db277..c7fd881 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 @@ -3,8 +3,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MeasureTypeEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.enums.sample.SampleStatusEnum; @@ -64,7 +66,7 @@ if (sampleInfo != null) { //比较哪个时间更早 String endTime = sampleInfo.getValidDeadline(); - if (StringUtils.isNotEmpty(endTime)) { + if (StringUtils.isNotEmpty(endTime)&&StringUtils.isNotEmpty(certificateReport1.getExpirationDate())) { endTime = DateUtil.compare(DateUtil.parseDateTime(endTime), DateUtil.parseDateTime(certificateReport1.getExpirationDate())) < 0 ? endTime : certificateReport1.getExpirationDate(); } @@ -81,62 +83,9 @@ } } } - - //获取证书报告信息 - certificateReport = certificateReportMapper.selectById(id); - //进行证书报告生成,并在远程注册服务器注册 - PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); - try { - DictCodeUtils.convertDictCodeToName(certificateReport); -// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); -// //生成证书打印信息 -// CertificatePrintBuilder(certificateReport, printFileName); - } catch (Exception ex) { - log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); - } - - } - - /** - * 通过审批的证书报告,产生证书打印 - */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); - int row = certificatePrintMapper.insert(certificatePrint); - if (row <= 0) { - throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); - } } - /** - * 审批通过的证书报告,生成相应的证书打印信息 - * - * @param certificateReport - * @return - */ - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() - .certificateReportCode(certificateReport.getCertificateReportCode()) - .certificateReportFile(certificateReport.getCertificateReportFile()) - .certificateReportType(certificateReport.getCertificateReportType()) - .certificateReportCategory(certificateReport.getCertificateReportCategory()) - .certificateReportName(certificateReport.getCertificateReportName()) - .measureDeptId(certificateReport.getMeasureDeptId()) - .measurePersonId(certificateReport.getMeasurePersonId()) - .originalRecordId(certificateReport.getOriginalRecordId()) - .remark(certificateReport.getRemark()) - .sampleId(certificateReport.getSampleId()) - .orderId(certificateReport.getOrderId()) - .templateId(certificateReport.getTemplateId()) - .signId(certificateReport.getSignId()) - .printFileName(printFileName) - .printNum(0) - .printStatus("1") - .createUser(certificateReport.getCreateUser()) - .build(); - return certificatePrint; - } + } 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 4ff0b77..61db6ed 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 @@ -7,6 +7,7 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.service.listeners.util.PdfUtils; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; @@ -19,6 +20,10 @@ import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; +import com.itextpdf.text.pdf.parser.ImageRenderInfo; +import com.itextpdf.text.pdf.parser.PdfReaderContentParser; +import com.itextpdf.text.pdf.parser.RenderListener; +import com.itextpdf.text.pdf.parser.TextRenderInfo; import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.HeaderFooter; @@ -29,6 +34,7 @@ import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; import javax.imageio.ImageIO; import javax.swing.*; @@ -151,13 +157,135 @@ } public static void main(String[] args) throws Exception { - String path = "D:\\casic\\cut\\"; - String filePath = path + "1.xlsx"; - String image = path + "test.png"; - write("{qr}", image, filePath,path+"2.xls"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); +// PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); +// PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); +// for (float[] f : list) { +// // 读图片 +// com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(imagePath); +// // 获取操作的页面 +// PdfContentByte under = pdfStamper.getOverContent((int) f[2]); +//// image.scaleAbsolute(100, 100); +//// // 添加图片 +// image.setAbsolutePosition((int) f[0], (int) f[1],BaseFont.NOT_EMBEDDED)) +// under.addImage(image); +// +// } +// pdfStamper.close(); +// pdfReader.close(); } + // 指定关键字 + public static String KEY_WORD = "j检定专业"; + // PDF当前页数 + public static int curPage = 0; + + /** + * 获取指定PDF文件中指定关键字的坐标 + * + * @param fileByte + * @return + * @throws Exception + */ + public static List getKeyWordCoordinate(byte[] fileByte, String keyWord) throws ServiceException { + // 坐标信息集合 + List arrays = new ArrayList<>(); + final int[] count = {0}; + if (keyWord.toCharArray().length < 2) { + return null; + } + PdfReader pdfReader = null; + try { + pdfReader = new PdfReader(fileByte); + int pageNum = pdfReader.getNumberOfPages(); + PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader); + for (curPage = 1; curPage <= pageNum; curPage++) { + pdfReaderContentParser.processContent(curPage, new RenderListener() { + // 关键字标志 + boolean isKeyWord = false; + // PDF读出来的文字与截取关键字的第index位对比,如果在关键字的长度里 + /** + * 这里从PDF中是一个一个读取文字的,把读取出来的PDF文字先和关键字的第一个字比较看是否相同: + * 如果相同,则假设已经找到关键字(将isKeyWord设为true),把这个关键字的坐标存到集合里面,并计算集合里存放了多少个数据(count++)、设置进入到一个循环(loop + * = true一个循环即为关键字从第一个字到最后一个字依次和读取的PDF文字比较的过程); + * 如果在这个比较过程中发现有的字符和关键字不匹配,则移除与之对应的集合里的数据。 + */ + // 关键字的第几位 + int index = 0; + // 对比关键字是否进入到一个循环 + boolean loop = false; + + // 处理数据 + @Override + public void renderText(TextRenderInfo textRenderInfo) { + String text = textRenderInfo.getText(); + if (text.contains(new String(keyWord.toCharArray())) && text != null) { + // 把当前从PDF文件中读取的文字横坐标、纵坐标和当前页存到集合里面 + com.itextpdf.awt.geom.Rectangle2D.Float.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange(); + float[] resu = new float[3]; + resu[0] = boundingRectange.x; + resu[1] = boundingRectange.y; + resu[2] = curPage; + arrays.add(resu); + count[0] = count[0] + 1; + + isKeyWord = true; + loop = true; + return; + } + + if (isKeyWord) { + // 获取关键字中下一个字符和读取文字比较 + index++; + + if (index < keyWord.toCharArray().length) { + if (text.equalsIgnoreCase(new String(keyWord.toCharArray(), index, 1)) && text != null) { + isKeyWord = true; + return; + } else { + isKeyWord = false; + + } + } else { + // 如果index大于关键字字符数组的长度,则该循环结束 + loop = false; + } + } + + index = 0; + } + + @Override + public void renderImage(ImageRenderInfo arg0) { + + } + + @Override + public void endTextBlock() { + + } + + @Override + public void beginTextBlock() { + + } + }); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (pdfReader != null) { + pdfReader.close(); + } + } + return arrays; + } + public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { System.out.println("进来了 不匹配 跳出"); @@ -208,6 +336,7 @@ return; } } + /** * @param imgSrc 原图片地址 * @param imgTarget 新图片地址 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 38410f1..4c02f06 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 @@ -217,7 +217,7 @@ //否则新增加一个段落到页眉 paragraph = header.addParagraph(); } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { //复制艺术字并设置多行多列位置 shape = (ShapeObject) shape.deepClone(); 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 f427bc9..a06164b 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,9 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + + ReturnDTO exportApprovalCertificateFile(Long id); 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 38db277..c7fd881 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 @@ -3,8 +3,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MeasureTypeEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.enums.sample.SampleStatusEnum; @@ -64,7 +66,7 @@ if (sampleInfo != null) { //比较哪个时间更早 String endTime = sampleInfo.getValidDeadline(); - if (StringUtils.isNotEmpty(endTime)) { + if (StringUtils.isNotEmpty(endTime)&&StringUtils.isNotEmpty(certificateReport1.getExpirationDate())) { endTime = DateUtil.compare(DateUtil.parseDateTime(endTime), DateUtil.parseDateTime(certificateReport1.getExpirationDate())) < 0 ? endTime : certificateReport1.getExpirationDate(); } @@ -81,62 +83,9 @@ } } } - - //获取证书报告信息 - certificateReport = certificateReportMapper.selectById(id); - //进行证书报告生成,并在远程注册服务器注册 - PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); - try { - DictCodeUtils.convertDictCodeToName(certificateReport); -// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); -// //生成证书打印信息 -// CertificatePrintBuilder(certificateReport, printFileName); - } catch (Exception ex) { - log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); - } - - } - - /** - * 通过审批的证书报告,产生证书打印 - */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); - int row = certificatePrintMapper.insert(certificatePrint); - if (row <= 0) { - throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); - } } - /** - * 审批通过的证书报告,生成相应的证书打印信息 - * - * @param certificateReport - * @return - */ - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() - .certificateReportCode(certificateReport.getCertificateReportCode()) - .certificateReportFile(certificateReport.getCertificateReportFile()) - .certificateReportType(certificateReport.getCertificateReportType()) - .certificateReportCategory(certificateReport.getCertificateReportCategory()) - .certificateReportName(certificateReport.getCertificateReportName()) - .measureDeptId(certificateReport.getMeasureDeptId()) - .measurePersonId(certificateReport.getMeasurePersonId()) - .originalRecordId(certificateReport.getOriginalRecordId()) - .remark(certificateReport.getRemark()) - .sampleId(certificateReport.getSampleId()) - .orderId(certificateReport.getOrderId()) - .templateId(certificateReport.getTemplateId()) - .signId(certificateReport.getSignId()) - .printFileName(printFileName) - .printNum(0) - .printStatus("1") - .createUser(certificateReport.getCreateUser()) - .build(); - return certificatePrint; - } + } 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 4ff0b77..61db6ed 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 @@ -7,6 +7,7 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.service.listeners.util.PdfUtils; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; @@ -19,6 +20,10 @@ import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; +import com.itextpdf.text.pdf.parser.ImageRenderInfo; +import com.itextpdf.text.pdf.parser.PdfReaderContentParser; +import com.itextpdf.text.pdf.parser.RenderListener; +import com.itextpdf.text.pdf.parser.TextRenderInfo; import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.HeaderFooter; @@ -29,6 +34,7 @@ import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; import javax.imageio.ImageIO; import javax.swing.*; @@ -151,13 +157,135 @@ } public static void main(String[] args) throws Exception { - String path = "D:\\casic\\cut\\"; - String filePath = path + "1.xlsx"; - String image = path + "test.png"; - write("{qr}", image, filePath,path+"2.xls"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); +// PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); +// PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); +// for (float[] f : list) { +// // 读图片 +// com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(imagePath); +// // 获取操作的页面 +// PdfContentByte under = pdfStamper.getOverContent((int) f[2]); +//// image.scaleAbsolute(100, 100); +//// // 添加图片 +// image.setAbsolutePosition((int) f[0], (int) f[1],BaseFont.NOT_EMBEDDED)) +// under.addImage(image); +// +// } +// pdfStamper.close(); +// pdfReader.close(); } + // 指定关键字 + public static String KEY_WORD = "j检定专业"; + // PDF当前页数 + public static int curPage = 0; + + /** + * 获取指定PDF文件中指定关键字的坐标 + * + * @param fileByte + * @return + * @throws Exception + */ + public static List getKeyWordCoordinate(byte[] fileByte, String keyWord) throws ServiceException { + // 坐标信息集合 + List arrays = new ArrayList<>(); + final int[] count = {0}; + if (keyWord.toCharArray().length < 2) { + return null; + } + PdfReader pdfReader = null; + try { + pdfReader = new PdfReader(fileByte); + int pageNum = pdfReader.getNumberOfPages(); + PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader); + for (curPage = 1; curPage <= pageNum; curPage++) { + pdfReaderContentParser.processContent(curPage, new RenderListener() { + // 关键字标志 + boolean isKeyWord = false; + // PDF读出来的文字与截取关键字的第index位对比,如果在关键字的长度里 + /** + * 这里从PDF中是一个一个读取文字的,把读取出来的PDF文字先和关键字的第一个字比较看是否相同: + * 如果相同,则假设已经找到关键字(将isKeyWord设为true),把这个关键字的坐标存到集合里面,并计算集合里存放了多少个数据(count++)、设置进入到一个循环(loop + * = true一个循环即为关键字从第一个字到最后一个字依次和读取的PDF文字比较的过程); + * 如果在这个比较过程中发现有的字符和关键字不匹配,则移除与之对应的集合里的数据。 + */ + // 关键字的第几位 + int index = 0; + // 对比关键字是否进入到一个循环 + boolean loop = false; + + // 处理数据 + @Override + public void renderText(TextRenderInfo textRenderInfo) { + String text = textRenderInfo.getText(); + if (text.contains(new String(keyWord.toCharArray())) && text != null) { + // 把当前从PDF文件中读取的文字横坐标、纵坐标和当前页存到集合里面 + com.itextpdf.awt.geom.Rectangle2D.Float.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange(); + float[] resu = new float[3]; + resu[0] = boundingRectange.x; + resu[1] = boundingRectange.y; + resu[2] = curPage; + arrays.add(resu); + count[0] = count[0] + 1; + + isKeyWord = true; + loop = true; + return; + } + + if (isKeyWord) { + // 获取关键字中下一个字符和读取文字比较 + index++; + + if (index < keyWord.toCharArray().length) { + if (text.equalsIgnoreCase(new String(keyWord.toCharArray(), index, 1)) && text != null) { + isKeyWord = true; + return; + } else { + isKeyWord = false; + + } + } else { + // 如果index大于关键字字符数组的长度,则该循环结束 + loop = false; + } + } + + index = 0; + } + + @Override + public void renderImage(ImageRenderInfo arg0) { + + } + + @Override + public void endTextBlock() { + + } + + @Override + public void beginTextBlock() { + + } + }); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (pdfReader != null) { + pdfReader.close(); + } + } + return arrays; + } + public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { System.out.println("进来了 不匹配 跳出"); @@ -208,6 +336,7 @@ return; } } + /** * @param imgSrc 原图片地址 * @param imgTarget 新图片地址 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 38410f1..4c02f06 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 @@ -217,7 +217,7 @@ //否则新增加一个段落到页眉 paragraph = header.addParagraph(); } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { //复制艺术字并设置多行多列位置 shape = (ShapeObject) shape.deepClone(); 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 2ba364e..d544f9e 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 @@ -94,6 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); + printDocUrl=pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); 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 eeab650..a599b61 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 @@ -48,7 +48,7 @@ @ApiOperation("证书报告记录导出") @PostMapping("/listExport") @ResponseBody - public void export(@RequestBody @Valid CertificateReportApprovalRequest request , HttpServletResponse response) throws IOException { + public void export(@RequestBody @Valid CertificateReportApprovalRequest request, HttpServletResponse response) throws IOException { certificateReportService.originExport(request, response); } @@ -56,11 +56,11 @@ @ApiOperation("证书报告保存(保存至草稿箱)") @PostMapping("/save") @ResponseBody - public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + public ReturnDTO save(@RequestBody @Valid BusinessCertificateReport certificateReport, BindingResult bindingResult) { + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } - return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); + return ReturnUtil.success(certificateReportService.saveCertificateReport(certificateReport)); } /** @@ -73,7 +73,7 @@ Assert.isFalse(Objects.isNull(certificateReport.getId()), () -> { throw new BusinessException(BusinessExceptionEnum.ID_NULL); }); - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.draftUpdate(certificateReport); @@ -84,7 +84,7 @@ @PostMapping("/submit") @ResponseBody public ReturnDTO certificateReportSubmit(@RequestBody @Valid BaseApprovalSubmitRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.submitCertificateReport(request); @@ -115,7 +115,7 @@ @PostMapping("/approval/listPage") @ResponseBody public ReturnDTO> approvalListPage(@RequestBody @Valid CertificateReportApprovalRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } Page page = PageFactory.defaultPage(); @@ -132,7 +132,7 @@ @PostMapping("/approval/operate/delete") @ResponseBody public ReturnDTO delete(@RequestBody @Valid ApprovalDeleteRequest request, BindingResult bindingResult) { - if(bindingResult.hasErrors()){ + if (bindingResult.hasErrors()) { throw new BusinessException(CoreExceptionEnum.REQUEST_NULL.getCode(), bindingResult.getFieldError().getDefaultMessage()); } return certificateReportService.approvalDelete(request); @@ -140,7 +140,7 @@ /** * 审批操作-编辑 - * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 + * 驳回的流程放置在未通过列表中,实现进行编辑后自动审核通过发起人节点 */ @ApiOperation("未通过证书报告编辑(驳回后的证书报告重新编辑,仅未通过列表中的编辑按钮可调用)") @PostMapping("/failUpdate") @@ -156,18 +156,16 @@ } - @ApiOperation("根据样品id/客户id查询检定证书") @PostMapping("/certificateRecordsById") - public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificationBySampleId(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateRecordsById(customerSampleIdRequest))); } - @ApiOperation("根据样品id查询证书监控列表") @PostMapping("/certificateMonitorsById") - public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception{ + public ReturnDTO> certificateMonitorsById(@RequestBody CustomerSampleIdRequest customerSampleIdRequest) throws Exception { return ReturnUtil.success(super.packForBT(certificateReportService.certificateMonitorsById(customerSampleIdRequest))); } @@ -178,5 +176,13 @@ certificateReportService.exportCertificateFile(certificateReport, response); } + @ApiOperation("审批后再次打印") + @PostMapping("/approval/exportFile") + public ReturnDTO exportApprovalCertificateFile(@RequestBody @Valid IdDTO idDTO) { + Assert.isFalse(Objects.isNull(idDTO.getId()), () -> { + throw new BusinessException(BusinessExceptionEnum.ID_NULL); + }); + return certificateReportService.exportApprovalCertificateFile(idDTO.getId()); + } } diff --git a/casic-metering-service/pom.xml b/casic-metering-service/pom.xml index 8ea0bed..98ee689 100644 --- a/casic-metering-service/pom.xml +++ b/casic-metering-service/pom.xml @@ -84,7 +84,7 @@ com.itextpdf itextpdf - 5.5.13 + 5.5.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 cf9a952..486faab 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 @@ -27,13 +27,16 @@ import com.casic.missiles.enums.BusinessExceptionEnum; import com.casic.missiles.enums.ExportEnum; import com.casic.missiles.enums.business.CertificatePrintStatusEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MonitorCodeEnum; import com.casic.missiles.enums.meter.MeterDictEnum; import com.casic.missiles.enums.system.ApplyFromIdEnum; import com.casic.missiles.enums.system.ApprovalStatusEnum; import com.casic.missiles.exception.BusinessException; +import com.casic.missiles.mapper.business.BusinessCertificatePrintMapper; import com.casic.missiles.mapper.business.BusinessCertificateReportMapper; import com.casic.missiles.mapper.meter.MeterStaffMapper; +import com.casic.missiles.model.business.BusinessCertificatePrint; import com.casic.missiles.model.business.BusinessCertificateReport; import com.casic.missiles.model.business.BusinessOriginalRecord; import com.casic.missiles.model.customer.CustomerSampleInfo; @@ -48,6 +51,7 @@ import com.casic.missiles.utils.DictCodeUtils; import com.casic.missiles.utils.NumberGeneratorUtil; import com.casic.missiles.utils.PageUtil; +import com.casic.missiles.utils.SpringContextUtil; import org.apache.commons.lang3.StringUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInstance; @@ -60,6 +64,10 @@ import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.*; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static com.casic.missiles.enums.business.FilePrintTypeEnum.CALIBRATION_CERTIFICATE; @@ -96,6 +104,8 @@ private PrintFileRegister printFileRegister; @Autowired private AbstractPermissionContext permissionContext; + private final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(2, 10, 100, + TimeUnit.SECONDS, new LinkedBlockingQueue<>(10)); /** * 保存证书报告信息 @@ -365,7 +375,77 @@ throw new BusinessException(BusinessExceptionEnum.OUTSOURCE_CERTIFICATE_NO_FILES); } - private List handleApprovalStatus(Page page, CertificateReportApprovalRequest request) { + @Override + @Transactional + public ReturnDTO exportApprovalCertificateFile(Long id) { + //获取证书报告信息 + BusinessCertificateReport certificateReport = this.baseMapper.selectById(id); + if (ApprovalStatusEnum.PASSED.equals(certificateReport.getApprovalStatus())) { + //生成证书报告的,需要改变为动态选择性 + CompletableFuture certificateFutureTask = CompletableFuture.supplyAsync( + () -> printFileRegister.registerPrintFile( + RegisterCustomParameters.builder() + .customFileName(certificateReport.getCertificateReportName() + certificateReport.getCertificateReportCode()) + .customObject(certificateReport) + .prefixType(FilePrintTypeEnum.CALIBRATION_APPROVAL) + .pdf(true) + .build()), threadPool); + certificateFutureTask.thenRun( + () -> { + String printFileName = certificateFutureTask.join(); + certificateReport.setCertificateReportFile(certificateFutureTask.join()); + this.baseMapper.updateById(certificateReport); + //生成证书打印信息 + CertificatePrintBuilder(certificateReport, printFileName); + } + ); + } + return ReturnUtil.success(); + } + + /** + * 通过审批的证书报告,产生证书打印 + */ + private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); + BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); + int row = certificatePrintMapper.insert(certificatePrint); + if (row <= 0) { + throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); + } + } + + /** + * 审批通过的证书报告,生成相应的证书打印信息 + * + * @param certificateReport + * @return + */ + private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { + BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() + .certificateReportCode(certificateReport.getCertificateReportCode()) + .certificateReportFile(certificateReport.getCertificateReportFile()) + .certificateReportType(certificateReport.getCertificateReportType()) + .certificateReportCategory(certificateReport.getCertificateReportCategory()) + .certificateReportName(certificateReport.getCertificateReportName()) + .measureDeptId(certificateReport.getMeasureDeptId()) + .measurePersonId(certificateReport.getMeasurePersonId()) + .originalRecordId(certificateReport.getOriginalRecordId()) + .remark(certificateReport.getRemark()) + .sampleId(certificateReport.getSampleId()) + .orderId(certificateReport.getOrderId()) + .templateId(certificateReport.getTemplateId()) + .signId(certificateReport.getSignId()) + .printFileName(printFileName) + .printNum(0) + .printStatus("1") + .createUser(certificateReport.getCreateUser()) + .build(); + return certificatePrint; + } + + private List handleApprovalStatus + (Page page, CertificateReportApprovalRequest request) { List approvalList = new ArrayList<>(); List businessKeys = new ArrayList<>(); switch (request.getApprovalStatus()) { @@ -450,7 +530,8 @@ return approvalList; } - private List handleAllApprovalListResponse(List approvalList, List allApproveList) { + private List handleAllApprovalListResponse + (List approvalList, List allApproveList) { Map taskMap = new HashMap<>(); allApproveList.forEach(allApprove -> { taskMap.put(allApprove.getBusinessKey(), allApprove.getStatus()); @@ -485,7 +566,8 @@ } } - private List handleApprovalListResponse(List approvalList, String status) { + private List handleApprovalListResponse + (List approvalList, String status) { approvalList.stream().forEach(result -> { //审批状态两种获取方式:1、在此处设置,2、在flowable中设置业务状态,暂采取1 result.setApprovalStatusName(dictService.getDictNameByCode(MeterDictEnum.APPROVAL_STATUS, status)); 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 f427bc9..a06164b 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,9 @@ Page certificateMonitorsById(CustomerSampleIdRequest customerSampleIdRequest) throws Exception; - void exportCertificateFile(@RequestBody @Valid BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + void exportCertificateFile(BusinessCertificateReport certificateReport, HttpServletResponse response)throws Exception; + + ReturnDTO exportApprovalCertificateFile(Long id); 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 38db277..c7fd881 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 @@ -3,8 +3,10 @@ import cn.hutool.core.date.DateUtil; import cn.hutool.core.lang.Assert; import com.alibaba.fastjson.JSONObject; +import com.casic.missiles.dto.business.certificate.RegisterCustomParameters; import com.casic.missiles.dto.flowable.NotifyEventStatusDTO; import com.casic.missiles.enums.BusinessExceptionEnum; +import com.casic.missiles.enums.business.FilePrintTypeEnum; import com.casic.missiles.enums.business.MeasureTypeEnum; import com.casic.missiles.enums.notifyevent.ActionStatusBeanEnum; import com.casic.missiles.enums.sample.SampleStatusEnum; @@ -64,7 +66,7 @@ if (sampleInfo != null) { //比较哪个时间更早 String endTime = sampleInfo.getValidDeadline(); - if (StringUtils.isNotEmpty(endTime)) { + if (StringUtils.isNotEmpty(endTime)&&StringUtils.isNotEmpty(certificateReport1.getExpirationDate())) { endTime = DateUtil.compare(DateUtil.parseDateTime(endTime), DateUtil.parseDateTime(certificateReport1.getExpirationDate())) < 0 ? endTime : certificateReport1.getExpirationDate(); } @@ -81,62 +83,9 @@ } } } - - //获取证书报告信息 - certificateReport = certificateReportMapper.selectById(id); - //进行证书报告生成,并在远程注册服务器注册 - PrintFileRegister printFileRegister = SpringContextUtil.getBean(PrintFileRegister.class); - try { - DictCodeUtils.convertDictCodeToName(certificateReport); -// String printFileName = printFileRegister.registerPrintFile(certificateReport, certificateReport.getCertificateReportTypeName()); -// //生成证书打印信息 -// CertificatePrintBuilder(certificateReport, printFileName); - } catch (Exception ex) { - log.error("打印异常,证书报告信息为{},异常信息为{}", JSONObject.toJSON(certificateReport), ex); - } - - } - - /** - * 通过审批的证书报告,产生证书打印 - */ - private void CertificatePrintBuilder(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrintMapper certificatePrintMapper = SpringContextUtil.getBean(BusinessCertificatePrintMapper.class); - BusinessCertificatePrint certificatePrint = getCertificatePrintByReport(certificateReport, printFileName); - int row = certificatePrintMapper.insert(certificatePrint); - if (row <= 0) { - throw new BusinessException(BusinessExceptionEnum.HANDLE_FAILED); - } } - /** - * 审批通过的证书报告,生成相应的证书打印信息 - * - * @param certificateReport - * @return - */ - private BusinessCertificatePrint getCertificatePrintByReport(BusinessCertificateReport certificateReport, String printFileName) { - BusinessCertificatePrint certificatePrint = BusinessCertificatePrint.builder() - .certificateReportCode(certificateReport.getCertificateReportCode()) - .certificateReportFile(certificateReport.getCertificateReportFile()) - .certificateReportType(certificateReport.getCertificateReportType()) - .certificateReportCategory(certificateReport.getCertificateReportCategory()) - .certificateReportName(certificateReport.getCertificateReportName()) - .measureDeptId(certificateReport.getMeasureDeptId()) - .measurePersonId(certificateReport.getMeasurePersonId()) - .originalRecordId(certificateReport.getOriginalRecordId()) - .remark(certificateReport.getRemark()) - .sampleId(certificateReport.getSampleId()) - .orderId(certificateReport.getOrderId()) - .templateId(certificateReport.getTemplateId()) - .signId(certificateReport.getSignId()) - .printFileName(printFileName) - .printNum(0) - .printStatus("1") - .createUser(certificateReport.getCreateUser()) - .build(); - return certificatePrint; - } + } 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 4ff0b77..61db6ed 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 @@ -7,6 +7,7 @@ import com.alibaba.excel.ExcelWriter; import com.alibaba.excel.write.metadata.WriteSheet; import com.alibaba.excel.write.metadata.fill.FillConfig; +import com.casic.missiles.model.exception.ServiceException; import com.casic.missiles.service.listeners.util.PdfUtils; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; @@ -19,6 +20,10 @@ import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; +import com.itextpdf.text.pdf.parser.ImageRenderInfo; +import com.itextpdf.text.pdf.parser.PdfReaderContentParser; +import com.itextpdf.text.pdf.parser.RenderListener; +import com.itextpdf.text.pdf.parser.TextRenderInfo; import com.spire.doc.Document; import com.spire.doc.FileFormat; import com.spire.doc.HeaderFooter; @@ -29,6 +34,7 @@ import com.spire.doc.fields.ShapeObject; import com.spire.xls.*; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; import javax.imageio.ImageIO; import javax.swing.*; @@ -151,13 +157,135 @@ } public static void main(String[] args) throws Exception { - String path = "D:\\casic\\cut\\"; - String filePath = path + "1.xlsx"; - String image = path + "test.png"; - write("{qr}", image, filePath,path+"2.xls"); +// String path = "D:\\casic\\cut\\"; +//// String wordPath = path + "问TOE202403001.docx"; +// String pdfPath = path + "1.pdf"; +// String imagePath = path + "test.png"; +// List list = getKeyWordCoordinate(IOUtils.toByteArray(new FileInputStream(pdfPath)), "专用章"); +// PdfReader pdfReader = new PdfReader(new FileInputStream(pdfPath)); +// PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(path + "2.pdf")); +// for (float[] f : list) { +// // 读图片 +// com.itextpdf.text.Image image = com.itextpdf.text.Image.getInstance(imagePath); +// // 获取操作的页面 +// PdfContentByte under = pdfStamper.getOverContent((int) f[2]); +//// image.scaleAbsolute(100, 100); +//// // 添加图片 +// image.setAbsolutePosition((int) f[0], (int) f[1],BaseFont.NOT_EMBEDDED)) +// under.addImage(image); +// +// } +// pdfStamper.close(); +// pdfReader.close(); } + // 指定关键字 + public static String KEY_WORD = "j检定专业"; + // PDF当前页数 + public static int curPage = 0; + + /** + * 获取指定PDF文件中指定关键字的坐标 + * + * @param fileByte + * @return + * @throws Exception + */ + public static List getKeyWordCoordinate(byte[] fileByte, String keyWord) throws ServiceException { + // 坐标信息集合 + List arrays = new ArrayList<>(); + final int[] count = {0}; + if (keyWord.toCharArray().length < 2) { + return null; + } + PdfReader pdfReader = null; + try { + pdfReader = new PdfReader(fileByte); + int pageNum = pdfReader.getNumberOfPages(); + PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader); + for (curPage = 1; curPage <= pageNum; curPage++) { + pdfReaderContentParser.processContent(curPage, new RenderListener() { + // 关键字标志 + boolean isKeyWord = false; + // PDF读出来的文字与截取关键字的第index位对比,如果在关键字的长度里 + /** + * 这里从PDF中是一个一个读取文字的,把读取出来的PDF文字先和关键字的第一个字比较看是否相同: + * 如果相同,则假设已经找到关键字(将isKeyWord设为true),把这个关键字的坐标存到集合里面,并计算集合里存放了多少个数据(count++)、设置进入到一个循环(loop + * = true一个循环即为关键字从第一个字到最后一个字依次和读取的PDF文字比较的过程); + * 如果在这个比较过程中发现有的字符和关键字不匹配,则移除与之对应的集合里的数据。 + */ + // 关键字的第几位 + int index = 0; + // 对比关键字是否进入到一个循环 + boolean loop = false; + + // 处理数据 + @Override + public void renderText(TextRenderInfo textRenderInfo) { + String text = textRenderInfo.getText(); + if (text.contains(new String(keyWord.toCharArray())) && text != null) { + // 把当前从PDF文件中读取的文字横坐标、纵坐标和当前页存到集合里面 + com.itextpdf.awt.geom.Rectangle2D.Float.Float boundingRectange = textRenderInfo.getBaseline().getBoundingRectange(); + float[] resu = new float[3]; + resu[0] = boundingRectange.x; + resu[1] = boundingRectange.y; + resu[2] = curPage; + arrays.add(resu); + count[0] = count[0] + 1; + + isKeyWord = true; + loop = true; + return; + } + + if (isKeyWord) { + // 获取关键字中下一个字符和读取文字比较 + index++; + + if (index < keyWord.toCharArray().length) { + if (text.equalsIgnoreCase(new String(keyWord.toCharArray(), index, 1)) && text != null) { + isKeyWord = true; + return; + } else { + isKeyWord = false; + + } + } else { + // 如果index大于关键字字符数组的长度,则该循环结束 + loop = false; + } + } + + index = 0; + } + + @Override + public void renderImage(ImageRenderInfo arg0) { + + } + + @Override + public void endTextBlock() { + + } + + @Override + public void beginTextBlock() { + + } + }); + } + } catch (IOException e) { + e.printStackTrace(); + } finally { + if (pdfReader != null) { + pdfReader.close(); + } + } + return arrays; + } + public static void write(String val, String imgpath, String filePath, String outPath) throws Exception { if (!StringUtils.isEmpty(val) && !val.equals("{qr}") && !val.equals("{qr}")) { System.out.println("进来了 不匹配 跳出"); @@ -208,6 +336,7 @@ return; } } + /** * @param imgSrc 原图片地址 * @param imgTarget 新图片地址 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 38410f1..4c02f06 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 @@ -217,7 +217,7 @@ //否则新增加一个段落到页眉 paragraph = header.addParagraph(); } - for (int i = 0; i < 4; i++) { + for (int i = 0; i < 5; i++) { for (int j = 0; j < 3; j++) { //复制艺术字并设置多行多列位置 shape = (ShapeObject) shape.deepClone(); 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 2ba364e..d544f9e 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 @@ -94,6 +94,7 @@ //默认转为docx,只需要进行docx的替换即可 String pdfNewUrl = printDocUrl.replaceAll(WORD_SUFFIX, PDF_SUFFIX); FilePrintRegisterUtils.wordToPdf(printDocUrl, pdfNewUrl); + printDocUrl=pdfNewUrl; } } catch (Exception rex) { log.error("文件打印出现异常,打印参数信息为{},异常信息为{}", JSON.toJSON(registerParameters.getCustomObject()), rex); 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 index d8a36fd..2a74d2f 100644 --- 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 @@ -53,9 +53,10 @@ List approvalImageList = customizedSignNamesParamCreator(); //初始化,生成模板文件 FilePrintRegister filePrintRegister = initialization(templateFileDir, metaData.getId(), metaData.getCertificateReportFile()); - filePrintRegister.setTemplateWordType(metaData.getCertificateReportTypeName().contains("检测") ? true : false); + filePrintRegister.setTemplateWordType("1".equals(metaData.getCertificateReportCategory()) ? true : false); filePrintRegister.setCustomFileName(registerParameters.getCustomFileName()); filePrintRegister.setParams(new HashMap()); + filePrintRegister.setWatermark(true); //定制化签名开发 List electronicSignList = this.createSignNames(ApprovalLogMap, filePrintRegister, approvalImageList); filePrintRegister.setElectronicImageList(electronicSignList);