From 6096429d2d9aa5e6b41d51a6c71361803c9a33e7 Mon Sep 17 00:00:00 2001 From: xiaoguangbin Date: Mon, 10 Feb 2025 10:57:40 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E8=87=AA=E5=BB=BA=E5=8F=B0=E7=AB=99?= =?UTF-8?q?=E8=83=BD=E8=B0=B1=E7=AE=97=E6=B3=95=E5=A2=9E=E5=8A=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E5=92=8C=E8=BF=94=E5=9B=9E=E7=BB=93=E6=9E=9C=EF=BC=9B?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=BB=BA=E5=8F=B0=E7=AB=99=E6=8A=A5?= =?UTF-8?q?=E5=91=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../modules/spectrum/Sample_C_Analysis.java | 38 +- .../org/jeecg/common/util/SelfBaseUtil.java | 357 +++++++++++++++++- .../entity/GardsROIResultsSpectrum.java | 94 +++++ .../entity/GardsXeResultsSpectrum.java | 6 + .../modules/service/AnalysisManService.java | 4 + .../service/AnalysisManServiceImpl.java | 27 ++ .../service/impl/SelfStationServiceImpl.java | 59 ++- 7 files changed, 564 insertions(+), 21 deletions(-) create mode 100644 jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsROIResultsSpectrum.java diff --git a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/Sample_C_Analysis.java b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/Sample_C_Analysis.java index 0fda53db..cf27e583 100644 --- a/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/Sample_C_Analysis.java +++ b/jeecg-module-auto-process/src/main/java/org/jeecg/modules/spectrum/Sample_C_Analysis.java @@ -3,6 +3,7 @@ package org.jeecg.modules.spectrum; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.ListUtil; +import cn.hutool.core.io.FileUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.NumberUtil; @@ -28,6 +29,7 @@ import org.jeecg.modules.base.entity.rnauto.*; import org.jeecg.modules.base.enums.*; import org.jeecg.modules.config.datasource.DataSourceSwitcher; import org.jeecg.modules.eneity.event.SpectrumErrorEvent; +import org.jeecg.modules.entity.GardsROIResultsSpectrum; import org.jeecg.modules.entity.GardsXeResultsSpectrum; import org.jeecg.modules.entity.vo.*; import org.jeecg.modules.enums.ErrorType; @@ -50,6 +52,8 @@ import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; import java.io.IOException; import java.lang.reflect.Field; import java.text.ParseException; @@ -63,6 +67,12 @@ import java.util.*; @Slf4j public class Sample_C_Analysis { + /** + * 报告文件后缀 + */ + private static final String ARR_FILE_SUFFIX = ".txt"; + private static final String ARR_FILE_NAME_TAIL = "_rpt"; + private final Map fieldMap = fieldMap(); private AbstractS_D_Q_G_SpectrumHandler spectrumHandler; @@ -150,6 +160,8 @@ public class Sample_C_Analysis { private SelfBgAnalyseResult analyseResult; + private String spectrumFileRelativePath; + public Sample_C_Analysis(AbstractS_D_Q_G_SpectrumHandler spectrumHandler, EnergySpectrumStruct sampleStruct, SpectrumServiceQuotes serviceQuotes, GardsSampleData sampleData) { this.analyseResult = new SelfBgAnalyseResult(); @@ -163,6 +175,7 @@ public class Sample_C_Analysis { this.sampleInputFilename = sampleData.getInputFileName(); this.sampleFilename = StringUtils.substring(sampleData.getInputFileName(), sampleData.getInputFileName().lastIndexOf((StringConstant.SLASH))+1); + this.spectrumFileRelativePath = spectrumHandler.getFileSaveRelativePath(); } public void analysis() throws CAnalyseException, AnalySpectrumException{ @@ -248,13 +261,28 @@ public class Sample_C_Analysis { sampleStruct.POI_G_y2, sampleFilePathName, phdFile1, phdFile2, phdFile3, phdFile4); analyseResult.setXeResults(selfXeResults); + List roiResult = SelfBaseUtil.getRoiResult(selfXeResults); boolean analyFlag = analyFlag1 && analyFlag2 && analyFlag3 && analyFlag4 && !selfXeResults.isEmpty(); if (analyFlag) { this.endAnalysisTime = new Date(); + + StringBuilder finalReportPath = new StringBuilder(); + finalReportPath.append(spectrumPathProperties.getRootPath()); +// finalReportPath.append(File.separator); + finalReportPath.append(spectrumPathProperties.getSaveFilePath()); + finalReportPath.append(File.separator); + finalReportPath.append(spectrumPathProperties.getArrPath()); + finalReportPath.append(File.separator); + finalReportPath.append(this.spectrumFileRelativePath); +// finalReportPath.append(arrFilePath); + finalReportPath.append(File.separator); + String arrFileTail = ARR_FILE_NAME_TAIL+ARR_FILE_SUFFIX; + finalReportPath.append(this.sampleFilename.replace(DataType.SAMPLEPHD.getSuffix(),arrFileTail)); + // gamma数据插入数据库 - this.storageDataToDatabase(mdcInfoMap, + this.storageDataToDatabase(mdcInfoMap, finalReportPath.toString(), null, middleData1, middleData2, middleData3, middleData4); // 生成gamma日志文件 @@ -262,6 +290,9 @@ public class Sample_C_Analysis { // 生成gamma报告文件 writeReport(middleData1, middleData2, middleData3, middleData4); + + // 生成beta报告 + SelfBaseUtil.createReport(sampleId, finalReportPath.toString(), sampleStruct, null, selfXeResults); //发送数据到redis // middleData.setSample_id(String.valueOf(sampleId)); // pushToRedis(middleData); @@ -539,7 +570,8 @@ public class Sample_C_Analysis { } } - public void storageDataToDatabase(Map mdcInfoMap, GStoreMiddleProcessData... middleDatas){ + public void storageDataToDatabase(Map mdcInfoMap, String reportPath, String logFilePath, + GStoreMiddleProcessData... middleDatas){ // 如果数据已经存储 不再重复存储 Integer idAnalysis = serviceQuotes.getAnalysesService().getIdAnalysis(this.sampleData.getSampleId()); if(ObjectUtil.isNotNull(idAnalysis)) return; @@ -548,7 +580,7 @@ public class Sample_C_Analysis { try { Integer sampleId = this.sampleData.getSampleId(); // 保存分析结果 ==> INSERT INTO RNAUTO.GARDS_ANALYSES TODO 填充Beta分析产生的报告和日志地址 - saveAnalysis(sampleId, this.detSampleData, this.startAnalysisTime, this.endAnalysisTime, null, null); + saveAnalysis(sampleId, this.detSampleData, this.startAnalysisTime, this.endAnalysisTime, logFilePath, reportPath); // 获取分析结果ID ==> SELECT IDANALYSIS idAnalysis = serviceQuotes.getAnalysesService().getIdAnalysis(sampleId); // 保存分析结果 ==> INSERT INTO RNAUTO.GARDS_ANALYSES diff --git a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/common/util/SelfBaseUtil.java b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/common/util/SelfBaseUtil.java index e2be4744..e15aa602 100644 --- a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/common/util/SelfBaseUtil.java +++ b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/common/util/SelfBaseUtil.java @@ -1,5 +1,8 @@ package org.jeecg.common.util; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.IORuntimeException; import cn.hutool.core.lang.Console; @@ -12,9 +15,12 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang.SerializationUtils; +import org.jeecg.common.constant.StringConstant; import org.jeecg.modules.base.abstracts.AbstractLogOrReport; import org.jeecg.modules.base.enums.CalName; import org.jeecg.modules.base.enums.SampleFileHeader; +import org.jeecg.modules.entity.GardsROIResultsSpectrum; import org.jeecg.modules.entity.GardsXeResultsSpectrum; import org.jeecg.modules.entity.vo.*; import org.jeecg.modules.native_jni.CalValuesHandler; @@ -186,6 +192,7 @@ public class SelfBaseUtil extends AbstractLogOrReport { if (StrUtil.isNotEmpty(filePathName) && new File(filePathName).exists()) { //解析文件内容 long start = System.currentTimeMillis(); + struct = EnergySpectrumHandler.getSourceDataNotHis(filePathName); Console.log("getsource:{}", (System.currentTimeMillis() - start)); start = System.currentTimeMillis(); @@ -727,8 +734,8 @@ public class SelfBaseUtil extends AbstractLogOrReport { * @param gammaPhdFiles gammaPHD * @throws JsonProcessingException */ - public static List betaAnalyse(HashMap nuclideMap, List POI_G_y1, List POI_G_y2, - String betaPhdFile, PHDFile ... gammaPhdFiles) { + public static List betaAnalyse(HashMap nuclideMap, List POI_G_y1, + List POI_G_y2, String betaPhdFile, PHDFile ... gammaPhdFiles) { List xeDataList = Lists.newArrayList(); // 获取峰面积、半衰期、发射几率 @@ -736,6 +743,7 @@ public class SelfBaseUtil extends AbstractLogOrReport { Console.log(JSON.toJSONString(nuclideParam)); // 调用beta分析算法 String resultStr = EnergySpectrumHandler.selfBgAnalyse(betaPhdFile, JSON.toJSONString(nuclideParam)); + Console.log(resultStr); if (StrUtil.isNotBlank(resultStr)) { xeDataList = JSON.parseArray(resultStr, GardsXeResultsSpectrum.class); xeDataList.forEach(GardsXeResultsSpectrum::getMdc); @@ -765,10 +773,38 @@ public class SelfBaseUtil extends AbstractLogOrReport { } } } - Console.log(resultStr); return xeDataList; } + /** + * 获取 + * @param xeResultsList + * @return + */ + public static List getRoiResult (List xeResultsList) { + List results = Lists.newArrayList(); + for (GardsXeResultsSpectrum xe : xeResultsList) { + GardsROIResultsSpectrum gardsRoiResults = new GardsROIResultsSpectrum(); + BeanUtil.copyProperties(xe, gardsRoiResults); + switch (xe.getNuclideName()) { + case "XE-131m": + gardsRoiResults.setRoi(1); + break; + case "XE-133m": + gardsRoiResults.setRoi(2); + break; + case "XE-133": + gardsRoiResults.setRoi(3); + break; + case "XE-135": + gardsRoiResults.setRoi(4); + break; + } + results.add(gardsRoiResults); + } + return results; + } + /** * 获取结算结果需要的参数(峰面积、半衰期、发射几率) * @param gStart RoiLimit Gamma Start @@ -807,8 +843,8 @@ public class SelfBaseUtil extends AbstractLogOrReport { // 半衰期 nuclideParam.put("halflife", nuclideMap.get(nuclideName).getHalflife().toString()); // baseline 计数,这里使用的energy是固定的 从配置文件中取出 - nuclideParam.put("baseline", getBetaAnalyseBaseLineCount(phdFiles[g], nuclideName, nuclideMap.get(nuclideName).getEnergy())); - + nuclideParam.put("baseline", getBetaAnalyseBaseLineCount(phdFiles[g], nuclideName, nuclideMap.get(nuclideName).getEnergy()) +""); + nuclideParam.put("lcConst", "2.33"); for (PeakInfo info : vPeak) { double energy = info.energy; // 找匹配roi范围的 energy @@ -865,6 +901,7 @@ public class SelfBaseUtil extends AbstractLogOrReport { } nuclideParam.put("exist", false); nuclideParam.put("area", area+""); + } param.put(mapKey, nuclideParam); } @@ -898,17 +935,17 @@ public class SelfBaseUtil extends AbstractLogOrReport { } // 通过energy带入到FHWM公式中,将结果energy转化channel,加减1.25之后取这个范围之内的baseline进行加和 List energyList = Lists.newLinkedList(); - energyList.add(energy - (fwhm - 1.25)); + energyList.add(energy - (fwhm - Math.pow(fwhm, 1.25))); // 使用gamma公式将能量转换为道址 CalValuesOut energyToChannel = CalValuesHandler.energyToChannel(energyList, userEnerParaP); long begin = Math.round(energyToChannel.counts.get(0)); - Console.log("nuclide:{},energy:{},fwhmL:{},beginChannel:{}",nuclideName, energy, (fwhm - 1.25), begin); + Console.log("nuclide:{},energy:{},fwhmL:{},beginChannel:{}",nuclideName, energy, (fwhm - Math.pow(fwhm, 1.25)), begin); energyList = Lists.newLinkedList(); - energyList.add(energy + (fwhm + 1.25)); + energyList.add(energy + (fwhm + Math.pow(fwhm, 1.25))); energyToChannel = CalValuesHandler.energyToChannel(energyList, userEnerParaP); long end = Math.round(energyToChannel.counts.get(0)); - Console.log("nuclide:{},energy:{},fwhmR:{},endChannel:{}",nuclideName, energy, (fwhm + 1.25), end); + Console.log("nuclide:{},energy:{},fwhmR:{},endChannel:{}",nuclideName, energy, (fwhm + Math.pow(fwhm, 1.25)), end); if (begin >= 0 && end <= vBase.size()) { for (long i = begin; i < end; i++) { baseLineCount += vBase.get((int)i); @@ -917,4 +954,306 @@ public class SelfBaseUtil extends AbstractLogOrReport { return baseLineCount; } + static StringBuilder reportContent = null; + protected static EnergySpectrumStruct sampleStruct = null; + protected static EnergySpectrumStruct qcStruct = null; + + /** + * 自建台站beta报告 + * @param sampleId + * @param sampleStruct sample + * @param qcStruct qc + * @param selfXeResults 分析结果 + * @return + */ + public static String getReport(Integer sampleId, EnergySpectrumStruct sampleStruct, EnergySpectrumStruct qcStruct, + List selfXeResults) { + reportContent = new StringBuilder(); + SelfBaseUtil.sampleStruct = sampleStruct; + handleReportHeader(); + handleFileInfoMation(); + handleCollectionInfoMation(sampleId); + handleAcquisitionInfoMation(); + handleSoftware(); + handleGasCalibration(qcStruct); + handleGasLimits(); + handleNetCount(selfXeResults); + handleConcetration(selfXeResults); + handleResult(selfXeResults); + if(null != sampleStruct) { + SelfBaseUtil.qcStruct = qcStruct; + } + + return reportContent.toString(); + } + public static void createReport(Integer sampleId, String finalReportPath, EnergySpectrumStruct sampleStruct, + EnergySpectrumStruct qcStruct, List selfXeResults) { + getReport(sampleId, sampleStruct, qcStruct, selfXeResults); + + if(!FileUtil.exist(finalReportPath)){ + FileUtil.writeString(reportContent.toString(), finalReportPath,"utf-8"); + }else { + FileUtil.appendString(reportContent.toString(), finalReportPath,"utf-8"); + } + } + + /** + * 处理报告头 + */ + private static void handleReportHeader(){ + String header_1 = "%-64s CNL06 GENERATED REPORT"; + String header_2 = "%-63s AUTO RADIONUCLIDE REPORT"; + String header_3 = "%-65s (Noble Gas Version) "; + String createDateLine = "%-58s Creation Date %s"; + final String createDate = DateUtils.formatDate(new Date(), "yyyy/MM/dd-HH:mm:ss"); + reportContent.append(String.format(header_1, StringConstant.SPACE)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(header_2,StringConstant.SPACE)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(header_3,StringConstant.SPACE)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(createDateLine,StringConstant.SPACE,createDate)); + reportContent.append(System.lineSeparator()).append(System.lineSeparator()); + } + + /** + * 处理#FILE INFORMATION 模块 + */ + private static void handleFileInfoMation(){ + String fileBlock = "#FILE INFORMATION"; + String sampleMeasId = " SampleMeasID:%-36s %s"; + String gasMeasId = " GASBKMeasID:%-37s %s"; + String detMeasId = " DETBKMeasID:%-37s %s"; + String srId = " SRID:%-44s %s"; + String detectorType = " Detector Type:%-35s %s"; + reportContent.append(fileBlock); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(sampleMeasId,StringConstant.SPACE,sampleStruct.measurement_id)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(gasMeasId,StringConstant.SPACE,sampleStruct.gas_bk_measurement_id)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(detMeasId,StringConstant.SPACE,sampleStruct.detector_bk_measurement_id)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(srId,StringConstant.SPACE,sampleStruct.sample_ref_id)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(detectorType,StringConstant.SPACE,"3D b-g")); + reportContent.append(System.lineSeparator()).append(System.lineSeparator()); + } + + /** + * 处理#COLLECTION INFORMATION 模块 + */ + private static void handleCollectionInfoMation(Integer sampleId){ + String collectionInfoBlock = "#COLLECTION INFORMATION"; + String stationId = " Station ID:%-38s %s"; + String detectorId = " Detector ID:%-37s %s"; + String sampleIdLabel = " Sample ID:%-39s %s"; + String collectionStart = " Collection Start:%-32s %s"; + String collectionStop = " Collection Stop:%-33s %s"; + String collectionTime = " Collection TIME(h):%-30s %s"; + String airVolume = " Air Volume[cm3]:%-33s %s"; + String xeVolume = " Xe Volume[cm3]:%-34s %s"; + reportContent.append(collectionInfoBlock); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(stationId,StringConstant.SPACE,sampleStruct.site_code)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(detectorId,StringConstant.SPACE,sampleStruct.detector_code)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(sampleIdLabel,StringConstant.SPACE, sampleId)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(collectionStart,StringConstant.SPACE,sampleStruct.collection_start_date+StringConstant.SPACE+sampleStruct.collection_start_time)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(collectionStop,StringConstant.SPACE,sampleStruct.collection_stop_date+StringConstant.SPACE+sampleStruct.collection_stop_time)); + reportContent.append(System.lineSeparator()); + DateTime collectStart = DateUtil.parse(sampleStruct.collection_start_date + StringConstant.SPACE + sampleStruct.collection_start_time); + DateTime collectStop = DateUtil.parse(sampleStruct.collection_stop_date + StringConstant.SPACE + sampleStruct.collection_stop_time); + + reportContent.append(String.format(collectionTime,StringConstant.SPACE,String.valueOf((collectStop.getTime() - collectStart.getTime())/1000))); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(airVolume,StringConstant.SPACE,String.valueOf(sampleStruct.air_volume))); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(xeVolume,StringConstant.SPACE,String.valueOf(sampleStruct.sample_volume_of_Xe))); + reportContent.append(System.lineSeparator()).append(System.lineSeparator()); + } + + /** + * 处理#ACQUISITION INFORMATION 模块 + */ + private static void handleAcquisitionInfoMation(){ + String acqInfoBlock = "#ACQUISITION INFORMATION"; + String acquisitionStart = " Acquisition Start:%-31s %s"; + String acqRealTime = " Acq Real Time(s):%-32s %s"; + String acqLiveTime = " Acq Live Time(s):%-32s %s"; + reportContent.append(acqInfoBlock); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(acquisitionStart,StringConstant.SPACE,sampleStruct.acquisition_start_date+StringConstant.SPACE+sampleStruct.acquisition_start_time)); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(acqRealTime,StringConstant.SPACE,String.valueOf(sampleStruct.acquisition_real_time))); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(acqLiveTime,StringConstant.SPACE,String.valueOf(sampleStruct.acquisition_live_time))); + reportContent.append(System.lineSeparator()).append(System.lineSeparator()); + } + + /** + * 处理#SOFTWARE 模块 + */ + private static void handleSoftware(){ + String softwareBlock = "#SOFTWARE"; + String version = " version:%-42s %s"; + reportContent.append(softwareBlock); + reportContent.append(System.lineSeparator()); +// reportContent.append(String.format(version,StringConstant.SPACE, spectrumServiceQuotes.getSoftwareProperties().getSwVersion())); + reportContent.append(String.format(version,StringConstant.SPACE, "1.0")); + reportContent.append(System.lineSeparator()).append(System.lineSeparator()); + } + + private static void handleGasCalibration(EnergySpectrumStruct struct) { + reportContent.append("#GAS New CALIBRATION"); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format("%sNew Beta%-43sNew Gamma%-42s", StringPool.SPACE, StringPool.SPACE, StringPool.SPACE)); + reportContent.append(System.lineSeparator()); + + if(null == struct) { + return; + } + + // todo 现在用的是分析之前的公式,分析之后的公式还需要补充 + + List bChannel = struct.b_channel; + List bElectronEnergy = struct.b_electron_energy; + + //计算得到C to E公式数据 + List bFittingPara = EnergySpectrumHandler.GetFileFittingPara(bChannel, bElectronEnergy); + List bFittingParaStr = new LinkedList<>(); + for (Double para:bFittingPara) { + bFittingParaStr.add(String.valueOf(para)); + } + DecimalFormat df = new DecimalFormat("0.000000"); + + + //拼接新计算公式 CH + String newBetaGasCHStr = String.format("%sCH(x) = (%s)+(%s)*x+(%s)x*x", StringPool.SPACE, + (NumberFormatUtil.numberSixLen(bFittingParaStr.get(0))), + (NumberFormatUtil.numberSixLen(bFittingParaStr.get(1))), + (NumberFormatUtil.numberSixLen(bFittingParaStr.get(2)))); + + List gCentroidChannel = struct.g_centroid_channel; + List gEnergy = struct.g_energy; + //计算C to E公式参数 + List gFittingPara = EnergySpectrumHandler.GetFileFittingPara(gCentroidChannel, gEnergy); + List gFittingParaStr = new LinkedList<>(); + for (Double para:gFittingPara) { + gFittingParaStr.add(String.valueOf(para)); + } + String newGammaGasCHStr = String.format("CH(x) = (%s)+(%s)*x+(%s)x*x%-24s", + (NumberFormatUtil.numberSixLen(gFittingParaStr.get(0))), + (NumberFormatUtil.numberSixLen(gFittingParaStr.get(1))), + (NumberFormatUtil.numberSixLen(gFittingParaStr.get(2))), + StringPool.SPACE); + reportContent.append(String.format("%s%-"+(52-newBetaGasCHStr.length())+"s%s", newBetaGasCHStr, StringPool.SPACE, newGammaGasCHStr)); + reportContent.append(System.lineSeparator()); + + //E to C + List bFittingParaToUi = EnergySpectrumHandler.GetFileFittingPara(bElectronEnergy, bChannel); + List bFittingParaToUiStr = new LinkedList<>(); + for (Double para:bFittingParaToUi) { + bFittingParaToUiStr.add(String.valueOf(para)); + } + //拼接新计算公式 E + String newBetaGasEStr = String.format("%sE(x) = (%s)+(%s)*x+(%s)x*x", StringPool.SPACE, + (NumberFormatUtil.numberSixLen(bFittingParaToUiStr.get(0))), + (NumberFormatUtil.numberSixLen(bFittingParaToUiStr.get(1))), + (NumberFormatUtil.numberSixLen(bFittingParaToUiStr.get(2)))); + + //计算E to C公式参数 + List gFittingParaToUi = EnergySpectrumHandler.GetFileFittingPara(gEnergy, gCentroidChannel); + List gFittingParaToUiStr = new LinkedList<>(); + for (Double para:gFittingParaToUi) { + gFittingParaToUiStr.add(String.valueOf(para)); + } + String newGammaGasEStr = String.format("E(x) = (%s)+(%s)*x+(%s)x*x%-24s", + (NumberFormatUtil.numberSixLen(gFittingParaToUiStr.get(0))), + (NumberFormatUtil.numberSixLen(gFittingParaToUiStr.get(1))), + (NumberFormatUtil.numberSixLen(gFittingParaToUiStr.get(2))), + StringPool.SPACE); + reportContent.append(String.format("%s%"+(52-newBetaGasEStr.length())+"s%s", newBetaGasEStr, StringPool.SPACE, newGammaGasEStr)); + reportContent.append(System.lineSeparator()); + reportContent.append(System.lineSeparator()); + } + + private static void handleGasLimits() { + String limitRoi = "%s%-15s%-25s%-25s"; + reportContent.append("#GAS: LIMITS PER ROI"); + reportContent.append(System.lineSeparator()); + reportContent.append(String.format(limitRoi, StringPool.SPACE, "Roi", "Beta", "Gamma")); + reportContent.append(System.lineSeparator()); + for (int i = 0; i < sampleStruct.POI_B_x1.size(); i++) { + reportContent.append(String.format(limitRoi, StringPool.SPACE, i + 1, + sampleStruct.POI_B_x1.get(i)+" to " + sampleStruct.POI_B_x2.get(i), + sampleStruct.POI_G_y1.get(i) + " to " + sampleStruct.POI_G_y2.get(i))); + reportContent.append(System.lineSeparator()); + } + reportContent.append(System.lineSeparator()); + + } + + private static void handleNetCount(List selfXeResults) { + List roiResult = SelfBaseUtil.getRoiResult(selfXeResults); + reportContent.append("#NET COUNTS AND LC PER ROI"); + reportContent.append(System.lineSeparator()); + String netRoi = "%s%-15s%-25s%-15s"; + reportContent.append(String.format(netRoi, StringPool.SPACE, "Roi", "Net count", "LC")); + reportContent.append(System.lineSeparator()); + + + for (GardsROIResultsSpectrum result : roiResult) { + reportContent.append(String.format(netRoi, StringPool.SPACE, result.getRoi(), + NumberFormatUtil.numberSixLen(String.valueOf(result.getNet())) +" +/- "+ + NumberFormatUtil.numberSixLen(String.valueOf(result.getNetErr())), + NumberFormatUtil.numberSixLen(String.valueOf(result.getLc())))); + reportContent.append(System.lineSeparator()); + } + reportContent.append(System.lineSeparator()); + } + + private static void handleConcetration(List selfXeResults) { + List roiResult = SelfBaseUtil.getRoiResult(selfXeResults); + reportContent.append("#CONCENTRATION AND LC PER ROI"); + reportContent.append(System.lineSeparator()); + String conLcRoi = "%s%-15s%-25s%-15s%-15s"; + reportContent.append(String.format(conLcRoi, StringPool.SPACE, "Roi", "Conc(mBq/m3)", "LC(mBq/m3)", "MDC(mBq/m3):")); + reportContent.append(System.lineSeparator()); + + for (GardsROIResultsSpectrum result : roiResult) { + reportContent.append(String.format(conLcRoi, StringPool.SPACE, result.getRoi(), + NumberFormatUtil.numberSixLen(String.valueOf(result.getConc())) +" +/- "+ + NumberFormatUtil.numberSixLen(String.valueOf(result.getConcErr())), + NumberFormatUtil.numberSixLen(String.valueOf(result.getLc())), + NumberFormatUtil.numberSixLen(String.valueOf(result.getMdc()))) + ); + reportContent.append(System.lineSeparator()); + } + reportContent.append(System.lineSeparator()); + } + + private static void handleResult(List selfXeResults) { + List roiResult = SelfBaseUtil.getRoiResult(selfXeResults); + reportContent.append("#RESULT SUMMARY"); + reportContent.append(System.lineSeparator()); + String resultSum = "%s%-15s%-25s%-25s%-15s%-15s"; + reportContent.append(String.format(resultSum, StringPool.SPACE, "Nuclide Name", "Conc(mBq/m3)", "Uncertainty(mBq/m3)", + "MDC(mBq/m3)", "NID Flag")); + reportContent.append(System.lineSeparator()); + for (GardsROIResultsSpectrum result : roiResult) { + reportContent.append(String.format(resultSum, StringPool.SPACE, result.getRoi(), + NumberFormatUtil.numberSixLen(String.valueOf(result.getConc())) +" +/- "+ + NumberFormatUtil.numberSixLen(String.valueOf(result.getConcErr())), + NumberFormatUtil.numberSixLen(String.valueOf(result.getConcErr())), + NumberFormatUtil.numberSixLen(String.valueOf(result.getMdc())), + NumberFormatUtil.numberSixLen(String.valueOf(result.getNidFlag())) + )); + reportContent.append(System.lineSeparator()); + } + reportContent.append(System.lineSeparator()); + } } diff --git a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsROIResultsSpectrum.java b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsROIResultsSpectrum.java new file mode 100644 index 00000000..d3181eb3 --- /dev/null +++ b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsROIResultsSpectrum.java @@ -0,0 +1,94 @@ +package org.jeecg.modules.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +@Data +public class GardsROIResultsSpectrum implements Serializable { + + /** + * 样品id + */ + private Integer sampleId; + + /** + * 感兴趣区ID号 + */ + private Integer roi; + + /** + * 分析ID号 + */ + private Integer idAnalysis; + + /** + * 样品谱感兴趣区总计数 + */ + private Double sGross; + + /** + * 气体本底谱感兴趣区总计数 + */ + private Double gGross; + + /** + * 探测器本底谱感兴趣区总计数 + */ + private Double bGross; + + /** + * 样品谱感兴趣区净计数 + */ + private Double sNet; + + /** + * 气体本底谱感兴趣区净计数 + */ + private Double gNet; + + /** + * 感兴趣区净计数 + */ + private Double net; + + /** + * 感兴趣区净计数不确定度 + */ + private Double netErr; + + /** + * 感兴趣区活度浓度 + */ + private Double conc; + + /** + * 感兴趣区活度浓度不确定度 + */ + private Double concErr; + + /** + * 感兴趣区LC + */ + private Double lc; + + private Double lcCts; + + /** + * 感兴趣区MDC + */ + private Double mdc; + + /** + * 感兴趣区识别标示;1:识别到,0,未识别到 + */ + private Integer nidFlag; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date moddate; + +} diff --git a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsXeResultsSpectrum.java b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsXeResultsSpectrum.java index 6a5e6758..3135c64d 100644 --- a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsXeResultsSpectrum.java +++ b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/entity/GardsXeResultsSpectrum.java @@ -15,4 +15,10 @@ public class GardsXeResultsSpectrum extends GardsXeResults implements Serializab private String color; + private Double concLc; + + private Double net; + + private Double netErr; + } diff --git a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/service/AnalysisManService.java b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/service/AnalysisManService.java index ea2d4fd1..1c50aea6 100644 --- a/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/service/AnalysisManService.java +++ b/jeecg-module-beta-gamma-analyser/src/main/java/org/jeecg/modules/service/AnalysisManService.java @@ -33,6 +33,8 @@ public interface AnalysisManService { void deleteAnalySetting(Integer idAnalysis); + void deleteROIResults(Integer idAnalysis); + void saveCalibrationPairsROI(Integer sampleId, Integer idAnalysis); void saveCalibrationROI(Integer sampleId, Integer idAnalysis); @@ -60,4 +62,6 @@ public interface AnalysisManService { void saveSampleG_EnergyRecord(List list, Integer sampleId, Integer anayId); void saveGardsXeResults(Integer sampleId, Integer idAnalysis, List xeResultsList); + + void saveROIResults(Integer sampleId, Integer idAnalysis, List xeResultsList); } diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/AnalysisManServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/AnalysisManServiceImpl.java index 6e651bb1..88b339a2 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/AnalysisManServiceImpl.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/AnalysisManServiceImpl.java @@ -53,6 +53,8 @@ public class AnalysisManServiceImpl implements AnalysisManService { private IGardsCalibrationPairsSpectrumService calibrationPairsSpectrumService; @Autowired private IGardsXeResultsSpectrumService xeResultsSpectrumService; + @Autowired + private IGardsROIResultsSpectrumService roiResultsSpectrumService; private Map middleDataMap; @@ -172,6 +174,13 @@ public class AnalysisManServiceImpl implements AnalysisManService { analySettingRoiService.remove(wrapper); } + @Override + public void deleteROIResults(Integer idAnalysis) { + LambdaUpdateWrapper wrapper = new LambdaUpdateWrapper<>(); + wrapper.eq(GardsRoiResults::getIdAnalysis, idAnalysis); + roiResultsSpectrumService.remove(wrapper); + } + @Override public void saveCalibrationPairsROI(Integer sampleId, Integer idAnalysis) { List pairsRois = new ArrayList<>(); @@ -825,6 +834,24 @@ public class AnalysisManServiceImpl implements AnalysisManService { } } + @Override + @Transactional + public void saveROIResults(Integer sampleId, Integer idAnalysis, List xeResultsList) { + List results = Lists.newArrayList(); + for (GardsXeResultsSpectrum result : xeResultsList) { + GardsRoiResults gardsRoiResults = new GardsRoiResults(); + BeanUtil.copyProperties(result, gardsRoiResults); + gardsRoiResults.setSampleId(sampleId); + gardsRoiResults.setIdAnalysis(idAnalysis); + gardsRoiResults.setNet(result.getNet()); + gardsRoiResults.setNetErr(result.getNetErr()); + results.add(gardsRoiResults); + } + if (CollectionUtils.isNotEmpty(results)) { + roiResultsSpectrumService.saveBatch(results); + } + } + public Map fieldMap(){ Map fieldMap = new HashMap<>(); // Gards_Nucl_Lines_Ided diff --git a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java index 5dc3a6f4..d35f6de8 100644 --- a/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java +++ b/jeecg-module-spectrum-analysis/src/main/java/org/jeecg/modules/service/impl/SelfStationServiceImpl.java @@ -154,6 +154,7 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf Map resultMap = new HashMap<>(); //页面展示结果数组 List xeResultsSpectrumList = new LinkedList<>(); + List roiResultsSpectrumList = new LinkedList<>(); List gammaCalibrationSpectrumList= new LinkedList<>(); List betaCalibrationSpectrumList = new LinkedList<>(); List gammaCalibrationPairsList = new LinkedList<>(); @@ -235,6 +236,7 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf betaCalibrationPairsList = spectrumAnalysisMapper.ReadBetaFitChannelEnergy(analysisID); } xeResultsSpectrumList = spectrumAnalysisMapper.ReadXeResults(dbName, analysisID, sampleId); + roiResultsSpectrumList = spectrumAnalysisMapper.ReadROIResults(dbName, analysisID, sampleId); gammaCalibrationSpectrumList = spectrumAnalysisMapper.ReadGammaCalibrationParam(dbName, analysisID); betaCalibrationSpectrumList = spectrumAnalysisMapper.ReadBetaCalibrationParam(dbName, analysisID); //判断sample文件名是否为空 @@ -479,6 +481,7 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf } } betaDataFile.setXeResultsSpectrumList(xeResultsSpectrumList); + betaDataFile.setRoiResultsSpectrumList(roiResultsSpectrumList); betaDataFile.setSaveAnalysisResult(true); selfStationData.setBAnalyed(true); resultMap.put("XeData", phdFileUtil.viewXeData(xeResultsSpectrumList)); @@ -2658,6 +2661,8 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf betaDataFile.setXeDataList(xeResults); betaDataFile.setXeResultsSpectrumList(betaResult); + betaDataFile.setRoiResultsSpectrumList(SelfBaseUtil.getRoiResult(betaResult)); + //横坐标 beta-gamma long bChannels = struct.b_channels; //纵坐标 gamma @@ -5570,8 +5575,27 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf gardsAnalyses.setUseddetphdId(detId); } gardsAnalyses.setAnalyst(userName); + + String subDirSavePath = ""; + + String dataType = sampleStruct.data_type; + subDirSavePath+=nameStandUtil.GetSysTemSubdir(sampleStruct.system_type); + subDirSavePath+=nameStandUtil.GetDateTypeSubdir(dataType); + String path = nameStandUtil.SetFileDir(subDirSavePath, saveFileName); + Map fileNameMap = nameStandUtil.NameStandard(dataType, sampleStruct.spectrum_quantity, sampleStruct.acquisition_live_time, betaDataFile.getSampleFileName(), sampleStruct.measurement_id); + String rptName = fileNameMap.get("rpt"); + String qsReportPath="Rrr"+StringPool.SLASH+path+StringPool.SLASH+userName+"_"+rptName; + qsReportPath = qsReportPath.replace(StringPool.BACK_SLASH, StringPool.SLASH); + String reportPath = spectrumPathProperties.getSaveFilePath()+StringPool.SLASH+qsReportPath; + // 报告路径 + gardsAnalyses.setReportPath(qsReportPath); + + String logName = fileNameMap.get("log"); + String qsLogPath= path+StringPool.SLASH+userName+"_"+logName; + qsLogPath = qsLogPath.replace(StringPool.BACK_SLASH, StringPool.SLASH); + String analyses_absolute_LogPath=spectrumPathProperties.getLogPath()+StringPool.SLASH+qsLogPath; + // todo 补充日志 gardsAnalyses.setLogPath(""); - gardsAnalyses.setReportPath(""); // 写入 RNMAN数据库 // 判断idAnalysis是否为空 if (ObjectUtil.isNull(idAnalysis)) { @@ -5604,6 +5628,8 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf analysisManService.deleteMDC(idAnalysis); // 删除GARDS_ANALY_SETTING_ROI表数据 analysisManService.deleteAnalySetting(idAnalysis); + // 删除GARDS_ROI_RESULTS表数据 + analysisManService.deleteROIResults(idAnalysis); } // 向 RNMAN.GARDS_ANALYSES_ROI 表插入数据 analysisManService.saveAnalysisROI(sampleId, idAnalysis, selfStationData.getRoiBBoundaryStart(), @@ -5627,6 +5653,8 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf analysisManService.saveAnalySettingROI(sampleId, idAnalysis, phdFiles); // 向 RNMAN.GARDS_MDC 表写入 MDC计算结果 analysisManService.saveMDCROI(sampleId, mdcInfoMaps, idAnalysis); + // 向 RNMAN.GARDS_MDC 表写入 MDC计算结果 + analysisManService.saveROIResults(sampleId, idAnalysis, selfStationData.getBetaDataFile().getXeResultsSpectrumList()); // todo 逻辑不对 需要重写,用户修改QC刻度更新数据之后需要变更 20241009 // analysisManService.saveBetaCalibration(selfStationData.getBetaDataFile(), sampleId, idAnalysis); @@ -5694,6 +5722,21 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf } } // 存储报告文件 + { + String rptContent = SelfBaseUtil.getReport(sampleId, sampleStruct, qcStruct, + betaDataFile.getXeResultsSpectrumList()); + String rptFileName = reportPath.substring(reportPath.lastIndexOf(StringPool.SLASH)+1)+".txt"; + File rptFile = new File(rptFileName); + try { + FileUtil.writeString(rptContent, rptFile, "UTF-8"); + FileInputStream in = new FileInputStream(rptFile); + ftpUtil.saveFile(spectrumPathProperties.getRootPath()+reportPath+".txt", in); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } finally { + rptFile.delete(); + } + } } catch (Exception e) { throw new RuntimeException(e); } @@ -5844,10 +5887,10 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf String rootPath = spectrumPathProperties.getRootPath(); String saveFilePath = spectrumPathProperties.getSaveFilePath(); // todo beta报告暂时展示gamma -// reportPath = rootPath + saveFilePath + StrUtil.SLASH + reportPath + FileTypeEnum.arr.getType(); -// if (!FileUtil.exist(reportPath)) -// return Result.error("The automatic handler generated report does not exist!"); -// result.put("Beta", FileUtil.readUtf8String(reportPath)); + reportPath = rootPath + saveFilePath + StrUtil.SLASH + reportPath + FileTypeEnum.arr.getType(); + if (!FileUtil.exist(reportPath)) + return Result.error("The automatic handler generated report does not exist!"); + result.put("Beta", FileUtil.readUtf8String(reportPath)); List analysisRois = analysisRoiAutoService.analysisRoi(idAnalysis); for (org.jeecg.modules.base.entity.rnauto.GardsAnalysisRoi analysisRoi : analysisRois) { Integer roiNum = analysisRoi.getRoiNum(); @@ -5855,8 +5898,6 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf roiReportPath = rootPath + saveFilePath + StrUtil.SLASH + roiReportPath + FileTypeEnum.arr.getType(); if (!FileUtil.exist(roiReportPath)) continue; result.put("Gamma_ROI_" + roiNum, FileUtil.readUtf8String(roiReportPath)); - // todo beta报告暂时展示gamma - result.put("Beta", FileUtil.readUtf8String(roiReportPath)); } return Result.OK(result); } @@ -5890,8 +5931,8 @@ public class SelfStationServiceImpl extends AbstractLogOrReport implements ISelf result.put("Gamma_ROI_2", reportContent2); result.put("Gamma_ROI_3", reportContent3); result.put("Gamma_ROI_4", reportContent4); - // todo beta报告暂时使用gamma的 - result.put("Beta", reportContent1); + result.put("Beta", SelfBaseUtil.getReport(rrrLogInfo.getSampleId(), selfStationData.getSampleStruct(), + selfStationData.getQcStruct(), selfStationData.getBetaDataFile().getXeResultsSpectrumList())); return Result.OK(result); }