diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessSampleEntrustDepartmentController.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessSampleEntrustDepartmentController.java index 8dc322c3..ca3b8459 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessSampleEntrustDepartmentController.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/admin/BusinessSampleEntrustDepartmentController.java @@ -26,6 +26,8 @@ import com.zt.plat.framework.datapermission.core.annotation.DeptDataPermissionIg import static com.zt.plat.framework.common.pojo.CommonResult.success; import com.zt.plat.framework.excel.core.util.ExcelUtils; +import com.zt.plat.framework.security.core.LoginUser; +import com.zt.plat.framework.security.core.util.SecurityFrameworkUtils; import com.zt.plat.module.qms.business.bus.controller.vo.*; import com.zt.plat.module.qms.business.bus.dal.dataobject.BusinessSampleEntrustDepartmentDO; import com.zt.plat.module.qms.business.bus.service.BusinessSampleEntrustDepartmentService; @@ -89,6 +91,10 @@ public class BusinessSampleEntrustDepartmentController implements BusinessContro @Operation(summary = "获得委检登记分析部门业务分页") // @PreAuthorize("@ss.hasPermission('t:business-sample-entrust-department:query')") public CommonResult> getBusinessSampleEntrustDepartmentPage(@Valid BusinessSampleEntrustDepartmentPageReqVO pageReqVO) { + if (pageReqVO.getAssayDepartmentId() == null) { + LoginUser loginUser = SecurityFrameworkUtils.getLoginUser(); + pageReqVO.setAssayDepartmentId(loginUser.getVisitDeptId()); + } PageResult pageResult = businessSampleEntrustDepartmentService.getBusinessSampleEntrustDepartmentPage(pageReqVO); return success(pageResult); } diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFilePageReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFilePageReqVO.java index de27a98f..437ac49c 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFilePageReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFilePageReqVO.java @@ -31,6 +31,9 @@ public class BusinessSampleEntrustFilePageReqVO extends PageParam { @Schema(description = "路径") private String filePath; + @Schema(description = "扩展信息") + private String externalInfomation; + @Schema(description = "所属部门") private String systemDepartmentCode; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileRespVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileRespVO.java index f2cddc22..2b3ecdbb 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileRespVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileRespVO.java @@ -42,6 +42,9 @@ public class BusinessSampleEntrustFileRespVO { @ExcelProperty("路径") private String filePath; + @Schema(description = "扩展信息") + private String externalInfomation; + @Schema(description = "所属部门") @ExcelProperty("所属部门") private String systemDepartmentCode; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileSaveReqVO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileSaveReqVO.java index 4f955d1d..d3b49d66 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileSaveReqVO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/controller/vo/BusinessSampleEntrustFileSaveReqVO.java @@ -31,6 +31,9 @@ public class BusinessSampleEntrustFileSaveReqVO { @Schema(description = "路径") private String filePath; + @Schema(description = "扩展信息") + private String externalInfomation; + @Schema(description = "所属部门") private String systemDepartmentCode; diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSampleEntrustFileDO.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSampleEntrustFileDO.java index 8df6b741..1805a612 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSampleEntrustFileDO.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/dataobject/BusinessSampleEntrustFileDO.java @@ -62,6 +62,11 @@ public class BusinessSampleEntrustFileDO extends BusinessBaseDO { @TableField("FILE_PATH") private String filePath; /** + * 扩展信息 + */ + @TableField("EXT_INF") + private String externalInfomation; + /** * 所属部门 */ @TableField("SYS_DEPT_CD") diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessSampleEntrustFileMapper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessSampleEntrustFileMapper.java index cda59398..71770c48 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessSampleEntrustFileMapper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/dal/mapper/BusinessSampleEntrustFileMapper.java @@ -32,6 +32,7 @@ public interface BusinessSampleEntrustFileMapper extends BaseMapperX usageReportDicProjectIdList = businessAssayProjectDataDOList.stream().filter(f -> businessAssayTaskDataAssayDepartmentIdList.contains(f.getBusinessAssayTaskDataId()) && (QmsCommonConstant.ASSAY_PROJECT_USAGE_REPORT.equals(f.getUsage()) || QmsCommonConstant.ASSAY_PROJECT_USAGE_INGREDIENT_REPORT.equals(f.getUsage()))).map(m -> m.getDictionaryProjectId()).distinct().collect(Collectors.toList()); + List usageReportProjectNameList = dictionaryProjectList.stream().filter(f -> usageReportDicProjectIdList.contains(f.getId())).map(m -> m.getShowName()).collect(Collectors.toList()); BusinessSampleEntrustDepartmentDO businessSampleEntrustDepartmentDO = new BusinessSampleEntrustDepartmentDO(); businessSampleEntrustDepartmentDO.setId(IdWorker.getId()); @@ -800,7 +803,7 @@ public class SampleEntrustGenSampleDataCmp extends NodeComponent { return Arrays.stream(parts) .map(String::trim) // 去除每个ID前后的空格 .filter(s -> !s.isEmpty()); // 过滤掉空项(例如 "101,,102" 中间的空项) - }).distinct().collect(Collectors.toList()); + }).filter(f -> usageReportProjectNameList.contains(f)).distinct().collect(Collectors.toList()); businessSampleEntrustDepartmentDO.setAssayProject(CollUtil.join(assayProjectList, ",")); List configAssayMethodIdAssayDepartmentIdList = businessAssayTaskDataAssayDepartmentList.stream().map(m -> m.getConfigAssayMethodId()).distinct().collect(Collectors.toList()); @@ -814,6 +817,16 @@ public class SampleEntrustGenSampleDataCmp extends NodeComponent { List businessBaseSampleIdList = businessAssayTaskDataAssayDepartmentList.stream().map(m -> m.getBusinessBaseSampleId()).distinct().collect(Collectors.toList()); for (Long businessBaseSampleId : businessBaseSampleIdList) { + //获取当前主样的分析任务id + List currBaseBusinessAssayTaskDataAssayDepartmentIdList = businessAssayTaskDataAssayDepartmentList.stream().filter(f -> f.getBusinessBaseSampleId().equals(businessBaseSampleId)).map(m -> m.getId()).collect(Collectors.toList()); + //统计检测项目是上报的或者配料上报的数量 + usageCount = businessAssayProjectDataDOList.stream().filter(f -> currBaseBusinessAssayTaskDataAssayDepartmentIdList.contains(f.getBusinessAssayTaskDataId()) && (QmsCommonConstant.ASSAY_PROJECT_USAGE_REPORT.equals(f.getUsage()) || QmsCommonConstant.ASSAY_PROJECT_USAGE_INGREDIENT_REPORT.equals(f.getUsage()))).count(); + if (usageCount <= 0) {//如果没有上报检测项目,则跳出当前循环 + continue; + } + List currBaseUsageReportDicProjectIdList = businessAssayProjectDataDOList.stream().filter(f -> currBaseBusinessAssayTaskDataAssayDepartmentIdList.contains(f.getBusinessAssayTaskDataId()) && (QmsCommonConstant.ASSAY_PROJECT_USAGE_REPORT.equals(f.getUsage()) || QmsCommonConstant.ASSAY_PROJECT_USAGE_INGREDIENT_REPORT.equals(f.getUsage()))).map(m -> m.getDictionaryProjectId()).distinct().collect(Collectors.toList()); + List currBaseUsageReportProjectNameList = dictionaryProjectList.stream().filter(f -> currBaseUsageReportDicProjectIdList.contains(f.getId())).map(m -> m.getShowName()).collect(Collectors.toList()); + BusinessSampleEntrustDetailDO businessSampleEntrustDetailDO = sampleEntrustDetailList.stream().filter(f -> f.getBusinessBaseSampleId().equals(businessBaseSampleId)).findFirst().orElse(null); BusinessSampleEntrustDepartmentDetailDO businessSampleEntrustDepartmentDetailDO = new BusinessSampleEntrustDepartmentDetailDO(); @@ -836,7 +849,7 @@ public class SampleEntrustGenSampleDataCmp extends NodeComponent { return Arrays.stream(parts) .map(String::trim) // 去除每个ID前后的空格 .filter(s -> !s.isEmpty()); // 过滤掉空项(例如 "101,,102" 中间的空项) - }).distinct().collect(Collectors.toList()); + }).filter(f -> currBaseUsageReportProjectNameList.contains(f)).distinct().collect(Collectors.toList()); businessSampleEntrustDepartmentDetailDO.setAssayProject(CollUtil.join(sampleAssayProjectList, ",")); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleDeptEntrustDocAuditServiceImpl.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleDeptEntrustDocAuditServiceImpl.java index 2069ceb5..a359d991 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleDeptEntrustDocAuditServiceImpl.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/bus/service/SampleDeptEntrustDocAuditServiceImpl.java @@ -1,6 +1,7 @@ package com.zt.plat.module.qms.business.bus.service; import java.io.IOException; +import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -15,6 +16,7 @@ import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson2.JSONObject; import com.zt.plat.framework.common.exception.ServiceException; @@ -216,9 +218,14 @@ public class SampleDeptEntrustDocAuditServiceImpl implements SampleDeptEntrustDo Long loginUserId = SecurityFrameworkUtils.getLoginUserId(); Long businessSampleEntrustDepartmentId = param.getBusinessSampleEntrustDepartmentId(); BusinessSampleEntrustDepartmentDO businessSampleEntrustDepartmentDO = businessSampleEntrustDepartmentMapper.selectById(businessSampleEntrustDepartmentId); + if (QmsCommonConstant.YES.equals(businessSampleEntrustDepartmentDO.getIsReported())) { + throw new ServiceException(1_032_100_000, "当前商检报告已审核!"); + } + businessSampleEntrustDepartmentDO.setIsReported(QmsCommonConstant.YES); businessSampleEntrustDepartmentDO.setReportOperator(nickName); businessSampleEntrustDepartmentDO.setReportOperatorId(loginUserId); + businessSampleEntrustDepartmentDO.setReportTime(LocalDateTime.now()); businessSampleEntrustDepartmentDO.setAssayStatus(QmsCommonConstant.CHECKED); Set assayOperatorSet = new HashSet<>(); @@ -290,6 +297,13 @@ public class SampleDeptEntrustDocAuditServiceImpl implements SampleDeptEntrustDo businessFileApi.createBusinessFile(businessFileSaveReqDTO); //设置附件 + JSONObject fileExtInfoJSON = new JSONObject(); + fileExtInfoJSON.put("taskNo", businessAssayTaskJson.getString("taskNo")); + fileExtInfoJSON.put("taskName", businessAssayTaskJson.getString("taskName")); + fileExtInfoJSON.put("assayOperator", businessAssayTaskJson.getString("assayOperator")); + fileExtInfoJSON.put("assayTime", businessAssayTaskJson.getString("assayTime")); + fileExtInfoJSON.put("reportOperator", businessAssayTaskJson.getString("reportOperator")); + fileExtInfoJSON.put("reportTime", businessAssayTaskJson.getString("reportTime")); BusinessSampleEntrustFileDO businessSampleEntrustFileDO = new BusinessSampleEntrustFileDO(); businessSampleEntrustFileDO.setBusinessSampleEntrustRegistrationId(businessSampleEntrustDepartmentDO.getBusinessSampleEntrustRegistrationId()); businessSampleEntrustFileDO.setBusinessSampleEntrustDepartmentId(businessSampleEntrustDepartmentDO.getId()); @@ -297,6 +311,7 @@ public class SampleDeptEntrustDocAuditServiceImpl implements SampleDeptEntrustDo businessSampleEntrustFileDO.setFileId(fileRespDTO.getId()); businessSampleEntrustFileDO.setFileName(fileRespDTO.getName()); businessSampleEntrustFileDO.setFilePath(fileRespDTO.getDirectory()); + businessSampleEntrustFileDO.setExternalInfomation(fileExtInfoJSON.toJSONString()); businessSampleEntrustFileDOList.add(businessSampleEntrustFileDO); @@ -329,7 +344,7 @@ public class SampleDeptEntrustDocAuditServiceImpl implements SampleDeptEntrustDo formData.put("sampleCategory", sampleCategory); formData.put("entrustCode", businessSampleEntrustRegistrationDO.getEntrustNumber()); - jsonObjectParam.put("assayReportDataList", businessAssayReportDataList); + jsonObjectParam.put("assayReportDataList", JSON.parseArray(JSON.toJSONString(businessAssayReportDataList))); jsonObjectParam.put("itemNameList", param.getAssayProject()); jsonObjectParam.put("signatureData", signatureData); jsonObjectParam.put("formData", formData); @@ -364,6 +379,11 @@ public class SampleDeptEntrustDocAuditServiceImpl implements SampleDeptEntrustDo businessFileApi.createBusinessFile(businessFileSaveReqDTO); //设置附件 + JSONObject fileExtInfoJSON = new JSONObject(); + fileExtInfoJSON.put("entrustNumber", businessSampleEntrustRegistrationDO.getEntrustNumber()); + fileExtInfoJSON.put("assayDepartmentName", businessSampleEntrustDepartmentDO.getAssayDepartmentName()); + fileExtInfoJSON.put("reportOperator", businessSampleEntrustDepartmentDO.getReportOperator()); + fileExtInfoJSON.put("reportTime", DateUtil.formatLocalDateTime(businessSampleEntrustDepartmentDO.getReportTime())); BusinessSampleEntrustFileDO businessSampleEntrustFileDO = new BusinessSampleEntrustFileDO(); businessSampleEntrustFileDO.setBusinessSampleEntrustRegistrationId(businessSampleEntrustDepartmentDO.getBusinessSampleEntrustRegistrationId()); businessSampleEntrustFileDO.setBusinessSampleEntrustDepartmentId(businessSampleEntrustDepartmentDO.getId()); @@ -371,6 +391,7 @@ public class SampleDeptEntrustDocAuditServiceImpl implements SampleDeptEntrustDo businessSampleEntrustFileDO.setFileId(fileRespDTO.getId()); businessSampleEntrustFileDO.setFileName(fileRespDTO.getName()); businessSampleEntrustFileDO.setFilePath(fileRespDTO.getDirectory()); + businessSampleEntrustFileDO.setExternalInfomation(fileExtInfoJSON.toJSONString()); businessSampleEntrustFileDOList.add(businessSampleEntrustFileDO); diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/reportdoc/service/ReportDocumentAssistService.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/reportdoc/service/ReportDocumentAssistService.java index 3c5ad762..9d60a3a0 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/reportdoc/service/ReportDocumentAssistService.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/business/reportdoc/service/ReportDocumentAssistService.java @@ -137,9 +137,29 @@ public class ReportDocumentAssistService { .body(bodyStr) .timeout(15000) .execute(); - log.info("html2pdf--end at {}", LocalDateTime.now()); + if (response.getStatus() != 200) { + // 尝试读取错误响应体以便调试(注意:如果流已消费则无法再次读取,这里 bodyStream 还没读) + String errorBody = response.body(); + log.error("HTML2PDF 服务返回错误状态码: {}, 响应内容: {}", response.getStatus(), errorBody); + throw new IOException("生成 PDF 失败,远程服务返回状态码: " + response.getStatus() + ", 详情: " + errorBody); + } + + // 只有状态码为 200 时,才读取流 InputStream inputStream = response.bodyStream(); - return IOUtils.toByteArray(inputStream); + if (inputStream == null) { + throw new IOException("生成 PDF 失败,响应流为空"); + } + + byte[] pdfBytes = IOUtils.toByteArray(inputStream); + + // 【可选防御性检查】验证返回的数据是否真的像 PDF (以 %PDF 开头) + if (pdfBytes.length < 5 || !(new String(pdfBytes, 0, 4).startsWith("%PDF"))) { + log.error("生成的 PDF 数据头校验失败,前100字节: {}", new String(pdfBytes, 0, Math.min(100, pdfBytes.length))); + throw new IOException("生成的文件不是有效的 PDF 格式,可能是服务端返回了错误信息"); + } + + log.info("html2pdf--end at {}, 文件大小: {} bytes", LocalDateTime.now(), pdfBytes.length); + return pdfBytes; } /* diff --git a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/gridreport/PdfHelper.java b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/gridreport/PdfHelper.java index 04341b97..557f0d1a 100644 --- a/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/gridreport/PdfHelper.java +++ b/zt-module-qms/zt-module-qms-server/src/main/java/com/zt/plat/module/qms/framework/gridreport/PdfHelper.java @@ -103,7 +103,7 @@ public class PdfHelper { pdfDocument.save(baos); return baos.toByteArray(); } catch (Exception e) { - log.error("处理pdf出错!"); + log.error("处理pdf出错!", e); } return null; }