From b467b276415ab9a074cfdb5e56a15aebd4576b19 Mon Sep 17 00:00:00 2001 From: ls Date: Sun, 4 May 2025 12:19:54 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E9=AA=8C=E6=8A=A5=E5=91=8A=E6=89=B9?= =?UTF-8?q?=E9=87=8F=20zip=20=E4=B8=8B=E8=BD=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 + .../src/main/resources/application-dev.yml | 2 +- .../ExperimentReportController.java | 42 ++-- .../modules/database/dto/RadiationMapDTO.java | 22 ++ .../database/entity/ExperimentReport.java | 232 ++++++++++-------- .../service/IExperimentReportService.java | 1 + .../impl/ExperimentDocServiceImpl.java | 184 ++++++++------ .../impl/ExperimentReportServiceImpl.java | 3 + templates/fzsyzjd.docx | Bin 41100 -> 41146 bytes 9 files changed, 300 insertions(+), 189 deletions(-) diff --git a/README.md b/README.md index 0a98ecf..38a3aa7 100644 --- a/README.md +++ b/README.md @@ -72,4 +72,7 @@ ADD COLUMN `sample_model` varchar(2048) NULL COMMENT '样品型号' ; ```sql ALTER TABLE `physical-boot`.`experiment_report` ADD COLUMN `last_status` varchar(32) NULL COMMENT '上一个状态' AFTER `confirmer`; + +ALTER TABLE `physical-boot`.`experiment_report` + ADD COLUMN `file_url` text NULL COMMENT '生成的文件路径' AFTER `sample_info`; ``` \ No newline at end of file diff --git a/physical-launcher/src/main/resources/application-dev.yml b/physical-launcher/src/main/resources/application-dev.yml index ada68d4..6c658d5 100644 --- a/physical-launcher/src/main/resources/application-dev.yml +++ b/physical-launcher/src/main/resources/application-dev.yml @@ -243,7 +243,7 @@ jeecg: minio_url: http://47.102.126.67:29000 minio_public_url: http://47.102.126.67/oss/ minio_name: root - minio_pass: 12345678 + minio_pass: FeF4qA6uQBHeRd bucketName: physical #分布式锁配置 redisson: diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/controller/ExperimentReportController.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/controller/ExperimentReportController.java index a26d59f..3e96e24 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/controller/ExperimentReportController.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/controller/ExperimentReportController.java @@ -2,6 +2,7 @@ package org.jeecg.modules.database.controller; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjUtil; +import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -30,6 +31,7 @@ import org.springframework.web.bind.annotation.*; import org.springframework.web.servlet.ModelAndView; import java.util.*; +import java.util.stream.Collectors; /** * @Description: 试验报告 @@ -81,10 +83,10 @@ public class ExperimentReportController extends JeecgController page = new Page<>(pageNo, pageSize); IPage pageList = experimentReportService.join(page, experimentReport, queryWrapper); - pageList.getRecords().forEach(v -> { - ExperimentDoc experimentDoc = experimentDocService.getByExperimentId(v.getExperimentId(), ExperimentDocType.sybg.getType()); - v.setFileUrl(Optional.ofNullable(experimentDoc).map(ExperimentDoc::getFilePath).orElse(null)); - }); + //pageList.getRecords().forEach(v -> { + // ExperimentDoc experimentDoc = experimentDocService.getByExperimentId(v.getExperimentId(), ExperimentDocType.sybg.getType()); + // v.setFileUrl(Optional.ofNullable(experimentDoc).map(ExperimentDoc::getFilePath).orElse(null)); + //}); return Result.OK(pageList); } @@ -114,7 +116,17 @@ public class ExperimentReportController extends JeecgController sampleList = JSON.parseArray(sampleInfo, Map.class); + String modelBatch = sampleList.stream().map(v -> String.valueOf(v.getOrDefault("modelBatch", ""))).collect( + Collectors.joining("-")); + String sampleName = sampleList.stream().map(v -> String.valueOf(v.getOrDefault("sampleName", ""))).collect( + Collectors.joining("-")); + fileName = sampleName + "-" + modelBatch; + } + experimentReport.setReportName("试验报告-" + fileName); experimentReportService.save(experimentReport); return Result.OK("添加成功!"); } @@ -192,9 +204,9 @@ public class ExperimentReportController extends JeecgController { - ExperimentDoc experimentDoc = experimentDocService.getByExperimentId(experimentId, ExperimentDocType.sybg.getType()); - v.setFileUrl(Optional.ofNullable(experimentDoc).map(ExperimentDoc::getFilePath).orElse(null)); - }); + //experimentReport.forEach(v -> { + // ExperimentDoc experimentDoc = experimentDocService.getByExperimentId(experimentId, ExperimentDocType.sybg.getType()); + // v.setFileUrl(Optional.ofNullable(experimentDoc).map(ExperimentDoc::getFilePath).orElse(null)); + //}); return Result.OK(experimentReport); } @@ -309,10 +321,12 @@ public class ExperimentReportController extends JeecgController proton; + public List assembleDetails() { + List allList = new ArrayList<>(); + if (CollUtil.isNotEmpty(getXgy())) { + allList.addAll(getXgy()); + } + if (CollUtil.isNotEmpty(getDgy())) { + allList.addAll(getDgy()); + } + if (CollUtil.isNotEmpty(getX())) { + allList.addAll(getX()); + } + if (CollUtil.isNotEmpty(getElectronics())) { + allList.addAll(getElectronics()); + } + if (CollUtil.isNotEmpty(getProton())) { + allList.addAll(getProton()); + } + return allList; + } + } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/entity/ExperimentReport.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/entity/ExperimentReport.java index 12a7380..31db19c 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/entity/ExperimentReport.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/entity/ExperimentReport.java @@ -3,8 +3,6 @@ package org.jeecg.modules.database.entity; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.v3.oas.annotations.media.Schema; -import java.io.Serializable; -import java.util.Date; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; @@ -12,6 +10,9 @@ import org.apache.commons.lang3.StringUtils; import org.jeecgframework.poi.excel.annotation.Excel; import org.springframework.format.annotation.DateTimeFormat; +import java.io.Serializable; +import java.util.Date; + /** * @Description: 试验报告 @Author: jeecg-boot @Date: 2024-10-23 @Version: V1.0 */ @@ -21,129 +22,158 @@ import org.springframework.format.annotation.DateTimeFormat; @EqualsAndHashCode(callSuper = false) @Schema(description = "试验报告") public class ExperimentReport implements Serializable { - private static final long serialVersionUID = 1L; + private static final long serialVersionUID = 1L; - /** 主键 */ - @TableId(type = IdType.ASSIGN_ID) - @Schema(description = "主键") - private String id; + /** + * 主键 + */ + @TableId(type = IdType.ASSIGN_ID) + @Schema(description = "主键") + private String id; - /** 创建人 */ - @Schema(description = "创建人") - private String createBy; + /** + * 创建人 + */ + @Schema(description = "创建人") + private String createBy; - /** 创建日期 */ - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") - @DateTimeFormat(pattern = "yyyy-MM-dd") - @Schema(description = "创建日期") - private Date createTime; + /** + * 创建日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @Schema(description = "创建日期") + private Date createTime; - /** 更新人 */ - @Schema(description = "更新人") - private String updateBy; + /** + * 更新人 + */ + @Schema(description = "更新人") + private String updateBy; - /** 更新日期 */ - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") - @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") - @Schema(description = "更新日期") - private Date updateTime; + /** + * 更新日期 + */ + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm") + @Schema(description = "更新日期") + private Date updateTime; - /** 所属部门 */ - @Schema(description = "所属部门") - private String sysOrgCode; + /** + * 所属部门 + */ + @Schema(description = "所属部门") + private String sysOrgCode; - /** 试验ID */ - @Excel(name = "试验ID", width = 15) - @Schema(description = "试验ID") - private String experimentId; + /** + * 试验ID + */ + @Excel(name = "试验ID", width = 15) + @Schema(description = "试验ID") + private String experimentId; - /** 样品信息 */ - @Excel(name = "样品信息", width = 15) - @Schema(description = "样品信息") - private String sampleInfo; + /** + * 样品信息 + */ + @Excel(name = "样品信息", width = 15) + @Schema(description = "样品信息") + private String sampleInfo; - /** 偏置原理图 */ - @Excel(name = "偏置原理图", width = 15) - @Schema(description = "偏置原理图") - private String imgUrls; + /** + * 偏置原理图 + */ + @Excel(name = "偏置原理图", width = 15) + @Schema(description = "偏置原理图") + private String imgUrls; - /** 偏置原理说明 */ - @Excel(name = "偏置原理说明", width = 15) - @Schema(description = "偏置原理说明") - private String description; + /** + * 偏置原理说明 + */ + @Excel(name = "偏置原理说明", width = 15) + @Schema(description = "偏置原理说明") + private String description; - /** 审核员 */ - @Excel(name = "审核员", width = 15) - @Schema(description = "审核员") - private String auditor; + /** + * 审核员 + */ + @Excel(name = "审核员", width = 15) + @Schema(description = "审核员") + private String auditor; - /** 校对员 */ - @Excel(name = "校对员", width = 15) - @Schema(description = "校对员") - private String proofreader; + /** + * 校对员 + */ + @Excel(name = "校对员", width = 15) + @Schema(description = "校对员") + private String proofreader; - /** 确认员 */ - @Excel(name = "确认员", width = 15) - @Schema(description = "确认员") - private String confirmer; + /** + * 确认员 + */ + @Excel(name = "确认员", width = 15) + @Schema(description = "确认员") + private String confirmer; - /** 报告名称 */ - @Excel(name = "报告名称", width = 15) - @Schema(description = "报告名称") - private String reportName; + /** + * 报告名称 + */ + @Excel(name = "报告名称", width = 15) + @Schema(description = "报告名称") + private String reportName; - /** 状态 */ - @Excel(name = "状态", width = 15) - @Schema( - description = - "状态(申请中待校对:INIT,不合格:REJECT ,校对通过待审核:PROOFREAD_PASS,审核通过待批准:AUDIT_PASS,批准通过:PASSED)") - private String status; + /** + * 状态 + */ + @Excel(name = "状态", width = 15) + @Schema( + description = + "状态(申请中待校对:INIT,不合格:REJECT ,校对通过待审核:PROOFREAD_PASS,审核通过待批准:AUDIT_PASS,批准通过:PASSED)") + private String status; - @Excel(name = "上一个状态", width = 15) - @Schema(description ="上一个状态") - private String lastStatus; + @Excel(name = "上一个状态", width = 15) + @Schema(description = "上一个状态") + private String lastStatus; + @Excel(name = "审批意见", width = 15) + @Schema(description = "审批意见") + private String auditorMemo; - @Excel(name = "审批意见", width = 15) - @Schema(description = "审批意见") - private String auditorMemo; + @Excel(name = "校对意见", width = 15) + @Schema(description = "校对意见") + private String proofreaderMemo; - @Excel(name = "校对意见", width = 15) - @Schema(description = "校对意见") - private String proofreaderMemo; + @Excel(name = "批准意见", width = 15) + @Schema(description = "批准意见") + private String confirmerMemo; - @Excel(name = "批准意见", width = 15) - @Schema(description = "批准意见") - private String confirmerMemo; + @Excel(name = "审批时间", width = 15) + @Schema(description = "审批时间") + private String auditorTime; - @Excel(name = "审批时间", width = 15) - @Schema(description = "审批时间") - private String auditorTime; + @Excel(name = "校对时间", width = 15) + @Schema(description = "校对时间") + private String proofreaderTime; - @Excel(name = "校对时间", width = 15) - @Schema(description = "校对时间") - private String proofreaderTime; + @Excel(name = "批准时间", width = 15) + @Schema(description = "批准时间") + private String confirmerTime; - @Excel(name = "批准时间", width = 15) - @Schema(description = "批准时间") - private String confirmerTime; + @Schema(description = "生成的文件路径") + private String fileUrl; - @TableField(exist = false) - private String fileUrl; + @TableField(exist = false) + private String memo; - @TableField(exist = false) - private String memo; - - public String getMemo() { - if (StringUtils.isNotBlank(proofreaderMemo)) { - return proofreaderMemo; + public String getMemo() { + if (StringUtils.isNotBlank(proofreaderMemo)) { + return proofreaderMemo; + } + if (StringUtils.isNotBlank(auditorMemo)) { + return auditorMemo; + } + if (StringUtils.isNotBlank(confirmerMemo)) { + return confirmerMemo; + } + return null; } - if (StringUtils.isNotBlank(auditorMemo)) { - return auditorMemo; - } - if (StringUtils.isNotBlank(confirmerMemo)) { - return confirmerMemo; - } - return null; - } } diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReportService.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReportService.java index 19dcd25..45094eb 100644 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReportService.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/IExperimentReportService.java @@ -16,6 +16,7 @@ import java.util.List; */ public interface IExperimentReportService extends IService { List getByExperimentId(String experimentId); + List getPassedByExperimentId(String experimentId); ExperimentReport getLatestReport(String experimentId); diff --git a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/impl/ExperimentDocServiceImpl.java b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/impl/ExperimentDocServiceImpl.java index 6a6d02d..8b5e503 100755 --- a/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/impl/ExperimentDocServiceImpl.java +++ b/physical-module-system/physical-system-biz/src/main/java/org/jeecg/modules/database/service/impl/ExperimentDocServiceImpl.java @@ -5,6 +5,7 @@ import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.file.PathUtil; +import cn.hutool.core.util.ZipUtil; import com.alibaba.fastjson.*; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -110,10 +111,10 @@ public class ExperimentDocServiceImpl extends ServiceImpl headers = document.getHeaderList(); - - // 遍历所有节,确保每个节的页眉都添加了页码 - for (XWPFHeader h : headers) { - // 添加页码到每个节的页眉 - //addPageNumberToHeader("报告编号:" + experiment.getExperimentNo(), h); - } - - try (FileOutputStream out = new FileOutputStream(outputFile)) { - document.write(out); - } - document.close();*/ - String path = MinioUtil.upload(FileUtil.getInputStream(outputFile), - "experiment_doc/" + experimentId + "/" + version + "/" + experiment.getName() + "-" + fileName + ".docx"); + String path = generateUpload(experimentId, fileName, version, tmpDirPath); return path; } catch (Exception e) { log.error(e.getMessage()); @@ -199,40 +175,81 @@ public class ExperimentDocServiceImpl extends ServiceImpl assembleParams(String experimentId, String type, String outputFile) throws IOException { + private String generateUpload(String experimentId, String type, String version, String tmpDirPath) throws Exception { String absolutePath = templatePath + File.separator + docTempalteMap.get(type); + Experiment experiment = experimentService.getById(experimentId); switch (type) { case "辐照试验计划表": Map jhparams = assembleFzsyjhb(experimentId); XWPFTemplate jhrender = XWPFTemplate.compile(absolutePath).render(jhparams); - jhrender.writeToFile(outputFile); - break; + String outputFile1 = tmpDirPath + File.separator + type + "-" + experimentId + "-" + version + ".docx"; + if (FileUtil.exist(outputFile1)) { + FileUtil.del(outputFile1); + } + jhrender.writeToFile(outputFile1); + return MinioUtil.upload(FileUtil.getInputStream(outputFile1), + "experiment_doc/" + experimentId + "/" + version + "/" + experiment.getName() + "-" + type + ".docx"); case "试验报告评审表": Map psparams = assembleSybgpsb(experimentId); XWPFTemplate psrender = XWPFTemplate.compile(absolutePath).render(psparams); - psrender.writeToFile(outputFile); - break; + String outputFile2 = tmpDirPath + File.separator + type + "-" + experimentId + "-" + version + ".docx"; + if (FileUtil.exist(outputFile2)) { + FileUtil.del(outputFile2); + } + psrender.writeToFile(outputFile2); + return MinioUtil.upload(FileUtil.getInputStream(outputFile2), + "experiment_doc/" + experimentId + "/" + version + "/" + experiment.getName() + "-" + type + ".docx"); case "设备使用记录表": Map sbParams = assembleSbsyjlb(experimentId); LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); Configure config = Configure.builder().bind("equipment", policy).build(); XWPFTemplate template = XWPFTemplate.compile(absolutePath, config).render(sbParams); - template.writeToFile(outputFile); - break; + String outputFile3 = tmpDirPath + File.separator + type + "-" + experimentId + "-" + version + ".docx"; + if (FileUtil.exist(outputFile3)) { + FileUtil.del(outputFile3); + } + template.writeToFile(outputFile3); + return MinioUtil.upload(FileUtil.getInputStream(outputFile3), + "experiment_doc/" + experimentId + "/" + version + "/" + experiment.getName() + "-" + type + ".docx"); case "试验报告": - Map params = assembleSybg(experimentId); - XWPFTemplate render = XWPFTemplate.compile(absolutePath).render(params); - render.writeToFile(outputFile); - break; + List reportList = experimentReportService.getPassedByExperimentId(experimentId); + List pathList = new ArrayList<>(); + + String outputDir = tmpDirPath + type + File.separator + experimentId + File.separator + version; + if (FileUtil.exist(outputDir)) { + FileUtil.del(outputDir); + } + if (!FileUtil.exist(outputDir)) { + FileUtil.mkdir(outputDir); + } + for (ExperimentReport experimentReport : reportList) { + Map params = assembleSybg(experimentId, experimentReport); + XWPFTemplate render = XWPFTemplate.compile(absolutePath).render(params); + String filePath = outputDir + File.separator + experimentReport.getReportName() + ".docx"; + render.writeToFile(filePath); + String reportPath = MinioUtil.upload(FileUtil.getInputStream(filePath), + "experiment_doc/" + experimentId + "/" + version + "/" + experimentReport.getReportName() + ".docx"); + pathList.add(reportPath); + } + File zip = ZipUtil.zip(outputDir); + String zipPath = MinioUtil.upload(FileUtil.getInputStream(zip), + "experiment_doc/" + experimentId + "/" + version + "/" + type + "-" + experiment.getName() + ".zip"); + + return zipPath; case "辐照试验总结单": Map zjdParams = assembleFzsyzjd(experimentId); LoopRowTableRenderPolicy zjdpolicy = new LoopRowTableRenderPolicy(); Configure zjdconfig = Configure.builder().bind("sample", zjdpolicy).build(); XWPFTemplate zjdtemplate = XWPFTemplate.compile(absolutePath, zjdconfig).render(zjdParams); - zjdtemplate.writeToFile(outputFile); - break; + String outputFile5 = tmpDirPath + File.separator + type + "-" + experimentId + "-" + version + ".docx"; + if (FileUtil.exist(outputFile5)) { + FileUtil.del(outputFile5); + } + zjdtemplate.writeToFile(outputFile5); + return MinioUtil.upload(FileUtil.getInputStream(outputFile5), + "experiment_doc/" + experimentId + "/" + version + "/" + experiment.getName() + "-" + type + ".docx"); } - return new HashMap<>(); + return null; } private Map assembleFzsyzjd(String experimentId) { @@ -259,44 +276,65 @@ public class ExperimentDocServiceImpl extends ServiceImpl> sampleList = new ArrayList<>(); - List sampleInfoList = experiment.getSampleInfoList(); - for (int i = 0; i < sampleInfoList.size(); i++) { - ExperimentSampleInfo sampleInfo = sampleInfoList.get(i); - Map sample = new HashMap<>(); - sample.put("index", i + 1); - sample.put("样品名称", sampleInfo.getSampleName()); - sample.put("样品型号", sampleInfo.getSampleModel()); - sample.put("样品类型", sampleInfo.getSampleType()); - sample.put("样品批次", sampleInfo.getSampleBatch()); - sample.put("样品编号", sampleInfo.getModelBatch()); - sample.put("注量率", ""); - sample.put("总剂量", ""); - sampleList.add(sample); + + for (ExperimentRadiationProcess radiationProcess : radiationProcessList) { + List sampleInfoList = radiationProcess.getSampleInfoList(); + String radiationDetailJson = radiationProcess.getRadiationDetail(); + OptionalDouble maxPoint = OptionalDouble.empty(); + OptionalDouble maxRate = OptionalDouble.empty(); + if (StringUtils.isNotBlank(radiationDetailJson)) { + RadiationMapDTO radiationMap = JSON.parseObject(radiationDetailJson, RadiationMapDTO.class); + List detailDTOList = radiationMap.assembleDetails(); + maxPoint = detailDTOList.stream().map(obj -> obj.getPoint()) // 获取point字段 + .filter(point -> StringUtils.isNotBlank(point)) + .filter(str -> str.matches("-?\\d+(\\.\\d+)?")) // 只保留数字格式的字符串 + .mapToDouble(Double::parseDouble) // 转换为double + .max(); + maxRate = detailDTOList.stream().map(obj -> obj.getActualMeasurementRate()) // 获取point字段 + .filter(point -> StringUtils.isNotBlank(point)) + .filter(str -> str.matches("-?\\d+(\\.\\d+)?")) // 只保留数字格式的字符串 + .mapToDouble(Double::parseDouble) // 转换为double + .max(); + } + for (int i = 0; i < sampleInfoList.size(); i++) { + ExperimentSampleInfo sampleInfo = sampleInfoList.get(i); + Map sample = new HashMap<>(); + sample.put("index", i + 1); + sample.put("样品名称", sampleInfo.getSampleName()); + sample.put("样品型号", sampleInfo.getSampleModel()); + sample.put("样品类型", sampleInfo.getSampleType()); + sample.put("样品批次", sampleInfo.getSampleBatch()); + sample.put("样品编号", sampleInfo.getModelBatch()); + sample.put("注量率", maxRate.orElse(0)); + sample.put("总剂量", maxPoint.orElse(0)); + sampleList.add(sample); + } } root.put("sample", sampleList); return root; } - private Map assembleSybg(String experimentId) { + private Map assembleSybg(String experimentId, ExperimentReport experimentReport) { Experiment experiment = experimentService.getById(experimentId); experimentService.fetchExperimentDetail(experiment); if (Objects.isNull(experiment)) { return new HashMap<>(); } - ExperimentReport latestReport = experimentReportService.getLatestReport(experimentId); Map params = new HashMap<>(); - if (Objects.nonNull(latestReport)) { - params.put("审核人员姓名", Optional.ofNullable(sysUserService.getById(latestReport.getAuditor())).map(SysUser::getRealname) + if (Objects.nonNull(experimentReport)) { + params.put("审核人员姓名", Optional.ofNullable(sysUserService.getById(experimentReport.getAuditor())).map(SysUser::getRealname) .orElse("")); - params.put("校对人员姓名", Optional.ofNullable(sysUserService.getById(latestReport.getProofreader())).map(SysUser::getRealname) + params.put("校对人员姓名", Optional.ofNullable(sysUserService.getById(experimentReport.getProofreader())) + .map(SysUser::getRealname) .orElse("")); - params.put("批准人员姓名", Optional.ofNullable(sysUserService.getById(latestReport.getConfirmer())).map(SysUser::getRealname) + params.put("批准人员姓名", Optional.ofNullable(sysUserService.getById(experimentReport.getConfirmer())) + .map(SysUser::getRealname) .orElse("")); - params.put("报告生成日期", formatDate(latestReport.getCreateTime())); - params.put("批准日期", latestReport.getConfirmerTime()); - params.put("校对日期", latestReport.getProofreaderTime()); - params.put("审核日期", latestReport.getAuditorTime()); + params.put("报告生成日期", formatDate(experimentReport.getCreateTime())); + params.put("批准日期", experimentReport.getConfirmerTime()); + params.put("校对日期", experimentReport.getProofreaderTime()); + params.put("审核日期", experimentReport.getAuditorTime()); } params.put("试验报告名称", experiment.getName()); @@ -325,8 +363,8 @@ public class ExperimentDocServiceImpl extends ServiceImpl sampleInfoList = JSON.parseArray(sampleInfo, JSONObject.class); if (CollUtil.isNotEmpty(sampleInfoList)) { @@ -391,8 +429,8 @@ public class ExperimentDocServiceImpl extends ServiceImpl getByExperimentId(String experimentId) { return list(new LambdaQueryWrapper().eq(ExperimentReport::getExperimentId, experimentId)); + } @Override + public List getPassedByExperimentId(String experimentId) { + return list(new LambdaQueryWrapper().eq(ExperimentReport::getExperimentId, experimentId).eq(ExperimentReport::getStatus,ExperimentReportStatus.PASSED)); } @Override diff --git a/templates/fzsyzjd.docx b/templates/fzsyzjd.docx index 2d864273a4a52f083075df6065d66f3d42e56920..48aae5e94724cb4b96330f69f8439bdf11062b22 100644 GIT binary patch delta 4216 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 bD3cbTJOMb9Q=m8jVUvuYC