From 61f328d577993f53bc9a6a778c6ca05a6a446cdc Mon Sep 17 00:00:00 2001 From: nieziyan Date: Wed, 6 Sep 2023 20:07:10 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9AExportFile?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecg-boot-base-core/pom.xml | 20 +++++ .../org/jeecg/common/util/ExportUtil.java | 68 +++++++++++++++++ .../jeecg/modules/base/dto/QCResultDto.java | 14 ++++ .../modules/entity/vo/TableQCResult.java | 5 ++ .../resources/excelTemplate/SampleInfo-G.xlsx | Bin 0 -> 19456 bytes .../modules/spectrum/Sample_G_Analysis.java | 2 +- .../org/jeecg/common/util/GammaFileUtil.java | 69 +++++++++--------- .../modules/controller/GammaController.java | 22 ++++-- .../SpectrumAnalysesController.java | 25 ++++++- .../jeecg/modules/service/IGammaService.java | 10 ++- .../service/ISpectrumAnalysisService.java | 4 +- .../service/impl/GammaServiceImpl.java | 38 ++++++++-- .../impl/SpectrumAnalysisServiceImpl.java | 26 ++++++- .../template/export/SampleInfo-G.xls | Bin 0 -> 19968 bytes .../main/resources/template/export/export.xls | Bin 0 -> 18944 bytes 15 files changed, 249 insertions(+), 54 deletions(-) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/QCResultDto.java create mode 100644 jeecg-boot-base-core/src/main/resources/excelTemplate/SampleInfo-G.xlsx create mode 100644 jeecg-module-spectrum-analysis/src/main/resources/template/export/SampleInfo-G.xls create mode 100644 jeecg-module-spectrum-analysis/src/main/resources/template/export/export.xls diff --git a/jeecg-boot-base-core/pom.xml b/jeecg-boot-base-core/pom.xml index 1e5181eb..a2a12189 100644 --- a/jeecg-boot-base-core/pom.xml +++ b/jeecg-boot-base-core/pom.xml @@ -258,5 +258,25 @@ commons-net 3.3 + \ No newline at end of file diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ExportUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ExportUtil.java index 4b40c13a..d9f25273 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ExportUtil.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/ExportUtil.java @@ -1,10 +1,19 @@ package org.jeecg.common.util; +import cn.hutool.core.util.ObjectUtil; +import org.apache.poi.ss.usermodel.Workbook; +import org.jeecg.modules.base.dto.QCResultDto; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.TemplateExportParams; + import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; public class ExportUtil { @@ -33,4 +42,63 @@ public class ExportUtil { response.setHeader("Content-disposition", "attachment;filename=" + name); return response.getOutputStream(); } + + public static void exportXls(HttpServletResponse response, Class target, + List data, String sheetName, String fileName){ + ExportParams params = new ExportParams(); + params.setSheetName(sheetName); + Workbook workbook = null; + OutputStream outputStream = null; + try { + // 设置文件名、Excel类型(xls|xlsx) + outputStream = ExportUtil.xls(response,fileName); + workbook = ExcelExportUtil. + exportExcel(params, target, data); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + }finally { + try { + if (ObjectUtil.isNotNull(outputStream)) + outputStream.close(); + if (ObjectUtil.isNotNull(workbook)) + workbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + + public static void exportXls(HttpServletResponse response, Class target, List data){ + exportXls(response, target, data, "sheet1", "file"); + } + + public static TemplateExportParams excelTemplate(String name){ + //return new TemplateExportParams("C:/Users/a/Desktop/"+ name +".xlsx"); + return new TemplateExportParams("E:\\Code\\IDEA\\AnalysisSystemForRadionuclide\\jeecg-boot-base-core\\src\\main\\resources\\excelTemplate\\"+ name +".xlsx"); + } + + public static void exportXls(HttpServletResponse response, String template, + Map data, String fileName){ + TemplateExportParams params = excelTemplate(template); + Workbook workbook = null; + OutputStream outputStream = null; + try { + // 设置文件名、Excel类型(xls|xlsx) + outputStream = ExportUtil.xls(response,fileName); + workbook = ExcelExportUtil.exportExcel(params, data); + workbook.write(outputStream); + } catch (IOException e) { + e.printStackTrace(); + }finally { + try { + if (ObjectUtil.isNotNull(outputStream)) + outputStream.close(); + if (ObjectUtil.isNotNull(workbook)) + workbook.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } } diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/QCResultDto.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/QCResultDto.java new file mode 100644 index 00000000..4d9dc19d --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/dto/QCResultDto.java @@ -0,0 +1,14 @@ +package org.jeecg.modules.base.dto; + +import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; + +@Data +public class QCResultDto { + + @Excel(name = "Name",orderNum = "1",width = 30) + private String fieldName; + + @Excel(name = "Value",orderNum = "2",width = 10) + private Object fieldValue; +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/entity/vo/TableQCResult.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/entity/vo/TableQCResult.java index c67d472a..d036c0cc 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/entity/vo/TableQCResult.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/entity/vo/TableQCResult.java @@ -1,18 +1,23 @@ package org.jeecg.modules.entity.vo; import lombok.Data; +import org.jeecgframework.poi.excel.annotation.Excel; import java.io.Serializable; @Data public class TableQCResult implements Serializable { + @Excel(name = "Name",orderNum = "1",width = 20) private String name; + @Excel(name = "Flag",orderNum = "2",width = 10) private String flag; + @Excel(name = "Value",orderNum = "3",width = 15) private double value; + @Excel(name = "Standard",orderNum = "4",width = 30) private String standard; } diff --git a/jeecg-boot-base-core/src/main/resources/excelTemplate/SampleInfo-G.xlsx b/jeecg-boot-base-core/src/main/resources/excelTemplate/SampleInfo-G.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..b956e69e7945596d63df34233452a4a4d1394cca GIT binary patch literal 19456 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 ncP<}ajS7VKY`kIN!4KXq3Wn$p(GTeU@N22G@}G 写日志文件和报告文件 + /** 收尾处理 ==> 写日志文件和报告文件 **/ }catch (Exception e){ e.printStackTrace(); diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/GammaFileUtil.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/GammaFileUtil.java index 43d64f28..070f2915 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/GammaFileUtil.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/common/util/GammaFileUtil.java @@ -75,19 +75,21 @@ public class GammaFileUtil { pathName = StringPool.SLASH + spectrumPathProperties.getRootPath() + StringPool.SLASH + pathName; ftpClient.changeWorkingDirectory(pathName); List ftpFiles = Arrays.asList(ftpClient.listFiles()); - ftpFiles = ftpFiles.stream().filter(item-> item.getName().equals(fileName)).collect(Collectors.toList()); - if (ftpFiles.size() == 0){ + ftpFiles = ftpFiles.stream().filter(item -> item.getName().equals(fileName)).collect(Collectors.toList()); + if (ftpFiles.size() == 0) { result.error500("ftp获取文件数据失败"); return false; } FTPFile ftpFile = ftpFiles.get(0); - if (Objects.nonNull(ftpFile)){ + if (Objects.nonNull(ftpFile)) { InputStream inputStream = ftpClient.retrieveFileStream(ftpFile.getName()); //声明一个临时文件 File file = File.createTempFile("tmp", null); //将ftp文件的输入流复制给临时文件 FileUtils.copyInputStreamToFile(inputStream, file); //读取文件信息 + //String path = "C:\\Users\\a\\Desktop\\AUX04_005-20230601_1405_S_FULL_40186.PHD"; + //EnergySpectrumStruct struct = EnergySpectrumHandler.getSourceData(path); EnergySpectrumStruct struct = EnergySpectrumHandler.getSourceData(file.getAbsolutePath()); //MsgInfo phd.getMsgInfo().setMsg_id(struct.msg_id); @@ -109,64 +111,64 @@ public class GammaFileUtil { //Comment phd.setOriTotalCmt(struct.comment); //Collection - if (StringUtils.isNotBlank(struct.collection_start_date) || StringUtils.isNotBlank(struct.collection_start_time) || StringUtils.isNotBlank(struct.collection_stop_date) || StringUtils.isNotBlank(struct.collection_stop_time) || Objects.nonNull(struct.air_volume)){ + if (StringUtils.isNotBlank(struct.collection_start_date) || StringUtils.isNotBlank(struct.collection_start_time) || StringUtils.isNotBlank(struct.collection_stop_date) || StringUtils.isNotBlank(struct.collection_stop_time) || Objects.nonNull(struct.air_volume)) { phd.getCollect().setCollection_start_date(struct.collection_start_date); phd.getCollect().setCollection_start_time(struct.collection_start_time); phd.getCollect().setCollection_stop_date(struct.collection_stop_date); phd.getCollect().setCollection_stop_time(struct.collection_stop_time); phd.getCollect().setAir_volume(struct.air_volume); - if(phd.getCollect().getCollection_start_time().indexOf('.')<0) { - phd.getCollect().setCollection_start_time(phd.getCollect().getCollection_start_time()+".0"); + if (phd.getCollect().getCollection_start_time().indexOf('.') < 0) { + phd.getCollect().setCollection_start_time(phd.getCollect().getCollection_start_time() + ".0"); } - if(phd.getCollect().getCollection_stop_time().indexOf('.')<0) { - phd.getCollect().setCollection_stop_time(phd.getCollect().getCollection_stop_time()+".0"); + if (phd.getCollect().getCollection_stop_time().indexOf('.') < 0) { + phd.getCollect().setCollection_stop_time(phd.getCollect().getCollection_stop_time() + ".0"); } - }else { + } else { phd.getCollect().setAir_volume(0.0); } //Acquisition - if (StringUtils.isNotBlank(struct.acquisition_start_date) || StringUtils.isNotBlank(struct.acquisition_start_time) || Objects.nonNull(struct.acquisition_real_time) || Objects.nonNull(struct.acquisition_live_time)){ + if (StringUtils.isNotBlank(struct.acquisition_start_date) || StringUtils.isNotBlank(struct.acquisition_start_time) || Objects.nonNull(struct.acquisition_real_time) || Objects.nonNull(struct.acquisition_live_time)) { phd.getAcq().setAcquisition_start_date(struct.acquisition_start_date); phd.getAcq().setAcquisition_start_time(struct.acquisition_start_time); phd.getAcq().setAcquisition_real_time(struct.acquisition_real_time); phd.getAcq().setAcquisition_live_time(struct.acquisition_live_time); - if(phd.getAcq().getAcquisition_start_time().indexOf('.')<0) { - phd.getAcq().setAcquisition_start_time(phd.getAcq().getAcquisition_start_time()+".0"); + if (phd.getAcq().getAcquisition_start_time().indexOf('.') < 0) { + phd.getAcq().setAcquisition_start_time(phd.getAcq().getAcquisition_start_time() + ".0"); } - }else { + } else { phd.getAcq().setAcquisition_live_time(0.0); phd.getAcq().setAcquisition_real_time(0.0); } //Processing - if (Objects.nonNull(struct.sample_volume_of_Xe) || Objects.nonNull(struct.uncertainty_1) || Objects.nonNull(struct.Xe_collection_yield) || Objects.nonNull(struct.uncertainty_2) || StringUtils.isNotBlank(struct.archive_bottle_id) ){ + if (Objects.nonNull(struct.sample_volume_of_Xe) || Objects.nonNull(struct.uncertainty_1) || Objects.nonNull(struct.Xe_collection_yield) || Objects.nonNull(struct.uncertainty_2) || StringUtils.isNotBlank(struct.archive_bottle_id)) { phd.getProcess().setSample_volume_of_Xe(struct.sample_volume_of_Xe); phd.getProcess().setUncertainty_1(struct.uncertainty_1); phd.getProcess().setXe_collection_yield(struct.Xe_collection_yield); phd.getProcess().setUncertainty_2(struct.uncertainty_2); phd.getProcess().setArchive_bottle_id(struct.archive_bottle_id); - }else { + } else { phd.getProcess().setSample_volume_of_Xe(0.0); phd.getProcess().setXe_collection_yield(0.0); phd.getProcess().setUncertainty_1(0.0); phd.getProcess().setUncertainty_2(0.0); } //Sample - if (Objects.nonNull(struct.dimension_1) || Objects.nonNull(struct.dimension_2)){ + if (Objects.nonNull(struct.dimension_1) || Objects.nonNull(struct.dimension_2)) { phd.getSampleBlock().setDimension_1(struct.dimension_1); phd.getSampleBlock().setDimension_2(struct.dimension_2); - }else { + } else { phd.getSampleBlock().setDimension_1(0.0); phd.getSampleBlock().setDimension_2(0.0); } //Calibration - if (StringUtils.isNotBlank(struct.date_calibration) || StringUtils.isNotBlank(struct.time_calibration)){ + if (StringUtils.isNotBlank(struct.date_calibration) || StringUtils.isNotBlank(struct.time_calibration)) { phd.getCalibration().setDate_calibration(struct.date_calibration); phd.getCalibration().setTime_calibration(struct.time_calibration); } //Certificate - if (Objects.nonNull(struct.total_source_activity) || StringUtils.isNotBlank(struct.assay_date) || StringUtils.isNotBlank(struct.assay_time) || StringUtils.isNotBlank(struct.units_activity) || CollectionUtils.isNotEmpty(struct.nuclide_name) + if (Objects.nonNull(struct.total_source_activity) || StringUtils.isNotBlank(struct.assay_date) || StringUtils.isNotBlank(struct.assay_time) || StringUtils.isNotBlank(struct.units_activity) || CollectionUtils.isNotEmpty(struct.nuclide_name) || CollectionUtils.isNotEmpty(struct.half_life_time) || CollectionUtils.isNotEmpty(struct.time_unit) || CollectionUtils.isNotEmpty(struct.activity_nuclide_time_assay) || CollectionUtils.isNotEmpty(struct.uncertainty) - || CollectionUtils.isNotEmpty(struct.cer_g_energy) || CollectionUtils.isNotEmpty(struct.g_intensity) || CollectionUtils.isNotEmpty(struct.electron_decay_mode) || CollectionUtils.isNotEmpty(struct.maximum_energy) || CollectionUtils.isNotEmpty(struct.intensity_b_particle) || Objects.nonNull(struct.record_count)){ + || CollectionUtils.isNotEmpty(struct.cer_g_energy) || CollectionUtils.isNotEmpty(struct.g_intensity) || CollectionUtils.isNotEmpty(struct.electron_decay_mode) || CollectionUtils.isNotEmpty(struct.maximum_energy) || CollectionUtils.isNotEmpty(struct.intensity_b_particle) || Objects.nonNull(struct.record_count)) { phd.getCertificate().setTotal_source_activity(struct.total_source_activity); phd.getCertificate().setAssay_date(struct.assay_date); phd.getCertificate().setAssay_time(struct.assay_time); @@ -184,23 +186,23 @@ public class GammaFileUtil { phd.getCertificate().setRecord_count(struct.record_count); } //g_Spectrum - if (Objects.nonNull(struct.num_g_channel) || Objects.nonNull(struct.g_energy_span) || Objects.nonNull(struct.g_begin_channel) || CollectionUtils.isNotEmpty(struct.g_counts)){ + if (Objects.nonNull(struct.num_g_channel) || Objects.nonNull(struct.g_energy_span) || Objects.nonNull(struct.g_begin_channel) || CollectionUtils.isNotEmpty(struct.g_counts)) { phd.getSpec().setNum_g_channel(struct.num_g_channel); phd.getSpec().setG_energy_span(struct.g_energy_span); phd.getSpec().setBegin_channel(struct.g_begin_channel); phd.getSpec().setCounts(struct.g_counts); - int i=0; - for (;i 0){ + int i = 0; + for (; i < phd.getSpec().getNum_g_channel(); ++i) { + if (phd.getSpec().getCounts().get(i) > 0) { break; } } - if(i == phd.getSpec().getNum_g_channel()){ + if (i == phd.getSpec().getNum_g_channel()) { phd.setValid(false); } } //g_Energy - if (CollectionUtils.isNotEmpty(struct.g_energy) || CollectionUtils.isNotEmpty(struct.g_centroid_channel) || CollectionUtils.isNotEmpty(struct.g_uncertainty) || Objects.nonNull(struct.g_record_count)){ + if (CollectionUtils.isNotEmpty(struct.g_energy) || CollectionUtils.isNotEmpty(struct.g_centroid_channel) || CollectionUtils.isNotEmpty(struct.g_uncertainty) || Objects.nonNull(struct.g_record_count)) { GEnergyBlock gEnergyBlock = new GEnergyBlock(); gEnergyBlock.setG_energy(struct.g_energy); gEnergyBlock.setCentroid_channel(struct.g_centroid_channel); @@ -209,7 +211,7 @@ public class GammaFileUtil { phd.getMapEnerKD().put(CalName.CalPHD.getType(), gEnergyBlock); } //g_Resolution - if (CollectionUtils.isNotEmpty(struct.g_r_energy) || CollectionUtils.isNotEmpty(struct.g_r_FWHM) || CollectionUtils.isNotEmpty(struct.g_r_uncertainty) || Objects.nonNull(struct.g_r_record_count)){ + if (CollectionUtils.isNotEmpty(struct.g_r_energy) || CollectionUtils.isNotEmpty(struct.g_r_FWHM) || CollectionUtils.isNotEmpty(struct.g_r_uncertainty) || Objects.nonNull(struct.g_r_record_count)) { GResolutionBlock gResolutionBlock = new GResolutionBlock(); gResolutionBlock.setG_energy(struct.g_r_energy); gResolutionBlock.setFWHM(struct.g_r_FWHM); @@ -218,7 +220,7 @@ public class GammaFileUtil { phd.getMapResoKD().put(CalName.CalPHD.getType(), gResolutionBlock); } //g_Efficiency - if (CollectionUtils.isNotEmpty(struct.g_e_energy) || CollectionUtils.isNotEmpty(struct.g_e_efficiency) || CollectionUtils.isNotEmpty(struct.g_e_uncertainty) || Objects.nonNull(struct.g_e_record_count)){ + if (CollectionUtils.isNotEmpty(struct.g_e_energy) || CollectionUtils.isNotEmpty(struct.g_e_efficiency) || CollectionUtils.isNotEmpty(struct.g_e_uncertainty) || Objects.nonNull(struct.g_e_record_count)) { GEfficiencyBlock gEfficiencyBlock = new GEfficiencyBlock(); gEfficiencyBlock.setG_energy(struct.g_e_energy); gEfficiencyBlock.setEfficiency(struct.g_e_efficiency); @@ -227,7 +229,7 @@ public class GammaFileUtil { phd.getMapEffiKD().put(CalName.CalPHD.getType(), gEfficiencyBlock); } //TotalEff - if (CollectionUtils.isNotEmpty(struct.t_g_energy) || CollectionUtils.isNotEmpty(struct.total_efficiency) || CollectionUtils.isNotEmpty(struct.t_uncertainty) || Objects.nonNull(struct.t_record_count)){ + if (CollectionUtils.isNotEmpty(struct.t_g_energy) || CollectionUtils.isNotEmpty(struct.total_efficiency) || CollectionUtils.isNotEmpty(struct.t_uncertainty) || Objects.nonNull(struct.t_record_count)) { TotaleffBlock totaleffBlock = new TotaleffBlock(); totaleffBlock.setG_energy(struct.t_g_energy); totaleffBlock.setTotal_efficiency(struct.total_efficiency); @@ -237,18 +239,19 @@ public class GammaFileUtil { } // 初始化默认分析设置 - if(phd.getHeader().getSystem_type().equals("P")) { + if (phd.getHeader().getSystem_type().equals("P")) { phd.getSetting().setECutAnalysis_Low(35.0); phd.getSetting().setBUpdateCal(true); } - phd.getSetting().setRefTime_conc(DateUtils.parseDate(phd.getCollect().getCollection_start_date() + " " + phd.getCollect().getCollection_start_time().substring(0, phd.getCollect().getCollection_start_time().indexOf(StringPool.DOT)),"yyyy/MM/dd HH:mm:ss")); - phd.getSetting().setRefTime_act(DateUtils.parseDate(phd.getAcq().getAcquisition_start_date() + " " + phd.getAcq().getAcquisition_start_time().substring(0, phd.getAcq().getAcquisition_start_time().indexOf(StringPool.DOT)),"yyyy/MM/dd HH:mm:ss")); + phd.getSetting().setRefTime_conc(DateUtils.parseDate(phd.getCollect().getCollection_start_date() + " " + phd.getCollect().getCollection_start_time().substring(0, phd.getCollect().getCollection_start_time().indexOf(StringPool.DOT)), "yyyy/MM/dd HH:mm:ss")); + phd.getSetting().setRefTime_act(DateUtils.parseDate(phd.getAcq().getAcquisition_start_date() + " " + phd.getAcq().getAcquisition_start_time().substring(0, phd.getAcq().getAcquisition_start_time().indexOf(StringPool.DOT)), "yyyy/MM/dd HH:mm:ss")); phd.setUsedSetting(phd.getSetting()); phd.setBAnalyed(false); phd.setAnaly_start_time(DateUtils.formatDate(new Date(), "yyyy/MM/dd HH:mm:ss")); + } - } catch (IOException e) { + }catch (IOException e) { throw new RuntimeException(e); } catch (ParseException e) { throw new RuntimeException(e); diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/GammaController.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/GammaController.java index c25ed7d3..e8102e8f 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/GammaController.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/GammaController.java @@ -1,10 +1,8 @@ package org.jeecg.modules.controller; +import cn.hutool.core.collection.CollUtil; import org.jeecg.common.api.vo.Result; -import org.jeecg.modules.entity.vo.ChangeData; -import org.jeecg.modules.entity.vo.CoeffData; -import org.jeecg.modules.entity.vo.ConfigureData; -import org.jeecg.modules.entity.vo.InputData; +import org.jeecg.modules.entity.vo.*; import org.jeecg.modules.service.IGammaService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @@ -189,11 +187,25 @@ public class GammaController { return gammaService.sampleInformation(sampleId, fileName); } + @GetMapping("exportSampleInformation") + public void exportSampleInformation(Integer sampleId, String fileName, + HttpServletResponse response){ + gammaService.exportSampleInformation(sampleId, fileName, response); + } + @GetMapping("viewQCResult") - public Result viewQCResult(Integer sampleId, String fileName){ + public Result> viewQCResult(Integer sampleId, String fileName){ return gammaService.viewQCResult(sampleId, fileName); } + @GetMapping("exportQCResult") + public void exportQCResult(Integer sampleId, String fileName,HttpServletResponse response){ + Result> result = gammaService.viewQCResult(sampleId, fileName); + List tableQCResults = result.getResult(); + if (CollUtil.isEmpty(tableQCResults))return; + gammaService.exportQCResult(tableQCResults,response); + } + @GetMapping("viewRLR") public Result viewRLR(Integer sampleId, String fileName){ return gammaService.viewRLR(sampleId, fileName); diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SpectrumAnalysesController.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SpectrumAnalysesController.java index 071d4b48..4054b615 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SpectrumAnalysesController.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/controller/SpectrumAnalysesController.java @@ -1,14 +1,13 @@ package org.jeecg.modules.controller; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.util.ObjectUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.vo.Result; import org.jeecg.modules.entity.GardsSampleDataSpectrum; -import org.jeecg.modules.entity.vo.AnalyseData; -import org.jeecg.modules.entity.vo.BgDataAnlyseResultIn; -import org.jeecg.modules.entity.vo.FittingBody; -import org.jeecg.modules.entity.vo.StatisticsQueryData; +import org.jeecg.modules.entity.vo.*; import org.jeecg.modules.service.ISpectrumAnalysisService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; @@ -103,6 +102,16 @@ public class SpectrumAnalysesController { return spectrumAnalysisService.viewQCResult(sampleId); } + + @GetMapping("exportQCResult") + @ApiOperation(value = "导出QC Result数据", notes = "导出QC Result数据") + public void exportQCResult(Integer sampleId,HttpServletResponse response){ + Result result = spectrumAnalysisService.viewQCResult(sampleId); + QCResult qcResult = result.getResult(); + if (ObjectUtil.isNull(qcResult))return; + spectrumAnalysisService.exportQCResult(qcResult,response); + } + @GetMapping("viewRLR") @ApiOperation(value = "查看RLR数据", notes = "查看RLR数据") public Result viewRLR(Integer sampleId){ @@ -183,4 +192,12 @@ public class SpectrumAnalysesController { return spectrumAnalysisService.saveToDB(anlyseResultIn); } + public static void main(String[] args) { + String str = "\n#FILE INFORMATION\n SampleMeasID: AUX04_005-2023/06/18-14:05\n GASBKMeasID: AUX04_005-2023/06/18-02:05\n DETBKMeasID: AUX04_005-2022/04/22-13:27\n SRID: 04202306171811X\n\n#COLLECTION INFORMATION\n Station CODE: AUX04\n Detector CODE: AUX04_005\n Sample ID: 426132\n Collection Start: 2023/06/17 18:54:10\n Collection Stop: 2023/06/18 06:54:08\n Collection TIME: 43198.00\n Sample Volume[m3]: 14.410883\n Xe Volume[cm3]: 1.00978\n\n#ACQUISITION INFORMATION\n Acquisition Start: 2023/06/18 14:05:09\n Acq Real Time: 40200.803\n Acq Live Time: 40187.202\n\n"; + String[] parts = str.split("\\n"); + + for (String part : parts) { + System.out.println(part); + } + } } diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/IGammaService.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/IGammaService.java index d3886c7f..9061c8f9 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/IGammaService.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/IGammaService.java @@ -6,6 +6,7 @@ import org.jeecg.modules.entity.vo.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.List; +import java.util.Map; public interface IGammaService{ @@ -72,9 +73,14 @@ public interface IGammaService{ Result Spectrum(Integer sampleId, String fileName); - Result sampleInformation(Integer sampleId, String fileName); + Result> sampleInformation(Integer sampleId, String fileName); - Result viewQCResult(Integer sampleId, String fileName); + void exportSampleInformation(Integer sampleId, String fileName, + HttpServletResponse response); + + Result> viewQCResult(Integer sampleId, String fileName); + + void exportQCResult(List data,HttpServletResponse response); Result viewRLR(Integer sampleId, String fileName); diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISpectrumAnalysisService.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISpectrumAnalysisService.java index 6ccc60bb..2760fc91 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISpectrumAnalysisService.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/ISpectrumAnalysisService.java @@ -37,7 +37,9 @@ public interface ISpectrumAnalysisService { Result viewSampleInformation(Integer sampleId); - Result viewQCResult(Integer sampleId); + Result viewQCResult(Integer sampleId); + + void exportQCResult(QCResult qcResult,HttpServletResponse response); Result viewRLR(Integer sampleId); diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/GammaServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/GammaServiceImpl.java index 446f624d..a57a4f97 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/GammaServiceImpl.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/GammaServiceImpl.java @@ -1,5 +1,6 @@ package org.jeecg.modules.service.impl; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -8,6 +9,7 @@ import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.google.common.cache.Cache; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; +import org.jeecg.common.Excel.ExportExcel; import org.jeecg.common.api.vo.Result; import org.jeecg.common.cache.LocalCache; import org.jeecg.common.properties.SpectrumPathProperties; @@ -20,15 +22,17 @@ import org.jeecg.modules.entity.*; import org.jeecg.modules.mapper.SpectrumAnalysisMapper; import org.jeecg.modules.native_jni.CalValuesHandler; import org.jeecg.modules.service.*; +import org.jeecgframework.poi.excel.ExcelExportUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; +import org.springframework.core.io.DefaultResourceLoader; +import org.springframework.core.io.Resource; import org.springframework.stereotype.Service; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; import java.math.BigDecimal; import java.sql.Connection; import java.sql.ResultSet; @@ -1432,8 +1436,8 @@ public class GammaServiceImpl implements IGammaService { } @Override - public Result sampleInformation(Integer sampleId, String fileName) { - Result result = new Result(); + public Result> sampleInformation(Integer sampleId, String fileName) { + Result> result = new Result(); Cache phdCache = localCache.getPHDCache(); PHDFile phd = phdCache.getIfPresent(fileName); if (Objects.isNull(phd)){ @@ -1478,8 +1482,23 @@ public class GammaServiceImpl implements IGammaService { } @Override - public Result viewQCResult(Integer sampleId, String fileName) { - Result result = new Result(); + public void exportSampleInformation(Integer sampleId, String fileName, + HttpServletResponse response) { + /*Result> result = sampleInformation(sampleId, fileName); + Map sampleInfo = result.getResult(); + if (MapUtil.isEmpty(sampleInfo)) return;*/ + /*Map data = sampleInfo.entrySet().stream() + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));*/ + /*String exportFileName = "SampleInfo-Gamma.xls"; + ExportUtil.exportXls(response,"SampleInfo-G",data,exportFileName);*/ + Map data = new HashMap<>(); + data.put("name","123"); + data.put("sex",1); + } + + @Override + public Result> viewQCResult(Integer sampleId, String fileName) { + Result> result = new Result(); Cache phdCache = localCache.getPHDCache(); PHDFile phd = phdCache.getIfPresent(fileName); if (Objects.isNull(phd)){ @@ -1546,6 +1565,13 @@ public class GammaServiceImpl implements IGammaService { return result; } + @Override + public void exportQCResult(List data, HttpServletResponse response) { + String sheetName = "QCResult-Gamma"; + String fileName = "QCResult-Gamma.xls"; + ExportUtil.exportXls(response,TableQCResult.class,data,sheetName,fileName); + } + @Override public Result viewRLR(Integer sampleId, String fileName) { Result result = new Result(); diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java index ca6dcb51..3a2e6c4d 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SpectrumAnalysisServiceImpl.java @@ -1,5 +1,8 @@ package org.jeecg.modules.service.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjectUtil; import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; @@ -10,11 +13,13 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.net.ftp.FTP; import org.apache.commons.net.ftp.FTPClient; import org.apache.commons.net.ftp.FTPFile; +import org.apache.poi.ss.usermodel.Workbook; import org.jeecg.common.api.QueryRequest; import org.jeecg.common.api.vo.Result; import org.jeecg.common.properties.SpectrumPathProperties; import org.jeecg.common.system.util.JwtUtil; import org.jeecg.common.util.*; +import org.jeecg.modules.base.dto.QCResultDto; import org.jeecg.modules.base.entity.original.*; import org.jeecg.modules.base.enums.*; import org.jeecg.modules.entity.*; @@ -25,6 +30,8 @@ import org.jeecg.modules.native_jni.struct.BgAnalyseResult; import org.jeecg.modules.native_jni.struct.BgBoundary; import org.jeecg.modules.native_jni.struct.EnergySpectrumStruct; import org.jeecg.modules.service.*; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -1049,8 +1056,8 @@ public class SpectrumAnalysisServiceImpl implements ISpectrumAnalysisService { } @Override - public Result viewQCResult(Integer sampleId) { - Result result = new Result(); + public Result viewQCResult(Integer sampleId) { + Result result = new Result(); QCResult qcResult = new QCResult(); Sections sections = new Sections(); List collectionTimeSections = sections.getCollectionTimeSections(); @@ -1276,6 +1283,21 @@ public class SpectrumAnalysisServiceImpl implements ISpectrumAnalysisService { return result; } + @Override + public void exportQCResult(QCResult qcResult, HttpServletResponse response) { + Map qcMap = BeanUtil.beanToMap(qcResult); + List qcResultDtos = new ArrayList<>(); + for (Map.Entry entry : qcMap.entrySet()) { + QCResultDto qcResultDto = new QCResultDto(); + qcResultDto.setFieldName(entry.getKey()); + qcResultDto.setFieldValue(entry.getValue()); + qcResultDtos.add(qcResultDto); + } + String sheetName = "QCResult-Beta"; + String fileName = "QCResult-Beta.xls"; + ExportUtil.exportXls(response,QCResultDto.class,qcResultDtos,sheetName,fileName); + } + @Override public Result viewRLR(Integer sampleId) { Result result = new Result(); diff --git a/jeecg-module-spectrum-analysis/src/main/resources/template/export/SampleInfo-G.xls b/jeecg-module-spectrum-analysis/src/main/resources/template/export/SampleInfo-G.xls new file mode 100644 index 0000000000000000000000000000000000000000..e1fc215a50ccc3f043935719f70d3f33544fcef3 GIT binary patch literal 19968 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 literal 0 HcmV?d00001