添加QC-Flag、sauna、sauna2的显示规则计算参数。

添加规则实体类,修改Sections类获取规则方式
This commit is contained in:
duwenyuan 2025-06-30 10:24:35 +08:00
parent be5ef47c10
commit 8010b316b8
9 changed files with 2073 additions and 1354 deletions

View File

@ -0,0 +1,23 @@
package org.jeecg.modules.entity.vo.QCFlagParmData;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class ParamConfig {
@XmlElement(name = "collectionTime")
private RuleGroup collectionTime;
@XmlElement(name = "acquisitionTime")
private RuleGroup acquisitionTime;
@XmlElement(name = "xeVolume")
private RuleGroup xeVolume;
@XmlElement(name = "airVolume")
private RuleGroup airVolume;
}

View File

@ -0,0 +1,16 @@
package org.jeecg.modules.entity.vo.QCFlagParmData;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
public class QCFlagParam {
@XmlElement(name = "sauna")
public ParamConfig sauna;
@XmlElement(name = "sauna2")
public ParamConfig sauna2;
}

View File

@ -0,0 +1,20 @@
package org.jeecg.modules.entity.vo.QCFlagParmData;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class Rule {
@XmlAttribute(name = "min")
private double min;
@XmlAttribute(name = "max")
private Double max; // 使用Double以便可以为null表示没有上限
@XmlAttribute(name = "color")
private String color;
}

View File

@ -0,0 +1,15 @@
package org.jeecg.modules.entity.vo.QCFlagParmData;
import lombok.Data;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import java.util.List;
@Data
@XmlAccessorType(XmlAccessType.FIELD)
public class RuleGroup {
@XmlElement(name = "Rule")
List<Rule> rules;
}

View File

@ -1,11 +1,22 @@
package org.jeecg.modules.entity.vo;
import lombok.Data;
import org.jeecg.common.properties.ParameterProperties;
import org.jeecg.modules.base.enums.StationDetailType;
import org.jeecg.modules.entity.vo.QCFlagParmData.QCFlagParam;
import org.jeecg.modules.entity.vo.QCFlagParmData.Rule;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;
import java.io.File;
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
import static org.jeecg.modules.base.enums.StationDetailType.*;
@Data
public class Sections implements Serializable {
@ -17,7 +28,17 @@ public class Sections implements Serializable {
private List<Double> airVolumeSections;
public Sections(){
//region QC-Flag参数
private List<Rule> collectionTimeRules;
private List<Rule> acquisitionTimeRules;
private List<Rule> xeVolumeRules;
private List<Rule> airVolumeRules;
//endregion
public Sections() {
collectionTimeSections = new LinkedList<>();
collectionTimeSections.add(0.0);
collectionTimeSections.add(6.0);
@ -43,4 +64,34 @@ public class Sections implements Serializable {
airVolumeSections.add(10.0);
}
public Sections(StationDetailType sectionsType,String pathname) {
try {
// 创建JAXB上下文
JAXBContext context = JAXBContext.newInstance(QCFlagParam.class);
// 创建Unmarshaller
Unmarshaller unmarshaller = context.createUnmarshaller();
File file = new File(pathname);
QCFlagParam config = (QCFlagParam) unmarshaller.unmarshal(file);
switch (sectionsType) {
case SAUNA:
collectionTimeRules = config.sauna.getCollectionTime().getRules();
acquisitionTimeRules = config.sauna.getAcquisitionTime().getRules();
xeVolumeRules = config.sauna.getXeVolume().getRules();
airVolumeRules = config.sauna.getAirVolume().getRules();
break;
case SAUNA2:
collectionTimeRules = config.sauna2.getCollectionTime().getRules();
acquisitionTimeRules = config.sauna2.getAcquisitionTime().getRules();
xeVolumeRules = config.sauna2.getXeVolume().getRules();
airVolumeRules = config.sauna2.getAirVolume().getRules();
break;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}

View File

@ -39,6 +39,7 @@ import org.jeecg.modules.base.entity.rnman.*;
import org.jeecg.modules.base.enums.*;
import org.jeecg.modules.entity.*;
import org.jeecg.modules.entity.vo.*;
import org.jeecg.modules.entity.vo.QCFlagParmData.Rule;
import org.jeecg.modules.mapper.SpectrumAnalysisMapper;
import org.jeecg.modules.native_jni.EnergySpectrumHandler;
import org.jeecg.modules.native_jni.struct.BgAnalyseResult;
@ -385,6 +386,7 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
@Override
public Result getDBSpectrumChart(String dbName, Integer sampleId, String analyst, HttpServletRequest request) {
HashMap<String, GardsStations> stationInfoMap = (HashMap<String, GardsStations>) redisUtil.get("stationInfoMap");
Result result = new Result();
//获取当前的用户名称
String userName = JwtUtil.getUserNameByToken(request);
@ -632,8 +634,23 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
qcMap.put("fileName", betaDataFile.getQcFileName());
resultMap.put("qc", qcMap);
}
//分析状态颜色
phdFileUtil.getLightColor(sampleMap, gasBgMap, detBgMap, qcMap);
Integer stationId = spectrumAnalysisMapper.getStationId(betaDataFile.getSampleStruct().getSite_code());
GardsStations station = stationInfoMap.get(stationId.toString());
switch (station.getEfficCalculType()) {
case "SAUNA":
//分析状态颜色
phdFileUtil.getLightColor(StationDetailType.SAUNA, sampleMap, gasBgMap, detBgMap, qcMap);
break;
case "SAUNA2":
//分析状态颜色
phdFileUtil.getLightColor(StationDetailType.SAUNA2, sampleMap, gasBgMap, detBgMap, qcMap);
break;
default:
//分析状态颜色
phdFileUtil.getLightColor(sampleMap, gasBgMap, detBgMap, qcMap);
break;
}
//Xe
if (CollectionUtils.isNotEmpty(xeResultsSpectrumList)) {
for (GardsXeResultsSpectrum xeData : xeResultsSpectrumList) {
@ -796,6 +813,7 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
@Override
public Result getFileSpectrumChart(String sampleFileName, String gasFileName, String detFileName, String qcFileName, HttpServletRequest request) {
Result result = new Result();
HashMap<String, GardsStations> stationInfoMap = (HashMap<String, GardsStations>) redisUtil.get("stationInfoMap");
//获取用户名
String userName = JwtUtil.getUserNameByToken(request);
//上传文件路径
@ -862,6 +880,7 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
resultMap.put("qc", qcMap);
}
}
} else {
xeResultsSpectrumList = betaDataFile.getXeResultsSpectrumList();
sampleMap = loadData("sample", betaDataFile);
@ -877,7 +896,22 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
qcMap.put("fileName", betaDataFile.getQcFileName());
resultMap.put("qc", qcMap);
}
phdFileUtil.getLightColor(sampleMap, gasBgMap, detBgMap, qcMap);
Integer stationId = spectrumAnalysisMapper.getStationId(betaDataFile.getSampleStruct().getSite_code());
GardsStations station = stationInfoMap.get(stationId.toString());
switch (station.getEfficCalculType()) {
case "SAUNA":
//分析状态颜色
phdFileUtil.getLightColor(StationDetailType.SAUNA, sampleMap, gasBgMap, detBgMap, qcMap);
break;
case "SAUNA2":
//分析状态颜色
phdFileUtil.getLightColor(StationDetailType.SAUNA2, sampleMap, gasBgMap, detBgMap, qcMap);
break;
default:
//分析状态颜色
phdFileUtil.getLightColor(sampleMap, gasBgMap, detBgMap, qcMap);
break;
}
//Xe
if (CollectionUtils.isNotEmpty(xeResultsSpectrumList)) {
for (GardsXeResultsSpectrum xeData : xeResultsSpectrumList) {
@ -1685,6 +1719,7 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
@Override
public Result<QCResult> viewQCResult(Integer sampleId, String dbName, String sampleFileName, String gasFileName, String detFileName, HttpServletRequest request) {
Result<QCResult> result = new Result();
HashMap<String, GardsStations> stationInfoMap = (HashMap<String, GardsStations>) redisUtil.get("stationInfoMap");
//获取用户名称
String userName = JwtUtil.getUserNameByToken(request);
//读取本地缓存
@ -1694,6 +1729,25 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
result.error500("Load basic file information first!");
return result;
}
Integer stationId = spectrumAnalysisMapper.getStationId(betaDataFile.getSampleStruct().getSite_code());
GardsStations station = stationInfoMap.get(stationId.toString());
QCResult qcResult = new QCResult();
switch (station.getEfficCalculType()) {
case "SAUNA":
qcResult = ProcessQCResultBranch(StationDetailType.SAUNA,betaDataFile);
break;
case "SAUNA2":
qcResult = ProcessQCResultBranch(StationDetailType.SAUNA2, betaDataFile);
break;
default:
break;
}
result.setSuccess(true);
result.setResult(qcResult);
return result;
}
private QCResult ProcessQCResultBranch(BetaDataFile betaDataFile) {
QCResult qcResult = new QCResult();
//获取各数据的范围信息
Sections sections = new Sections();
@ -1718,80 +1772,187 @@ public class SpectrumAnalysisServiceImpl extends AbstractLogOrReport implements
gardsXeResults = xeDataList.get(0);
}
//解析sample,gas,det文件并判断数据状态
if (Objects.nonNull(betaDataFile)) {
EnergySpectrumStruct sampleSourceData = betaDataFile.getSampleStruct();
EnergySpectrumStruct gasSourceData = betaDataFile.getGasStruct();
EnergySpectrumStruct detSourceData = betaDataFile.getDetStruct();
try {
if (Objects.nonNull(sampleSourceData) && Objects.nonNull(gasSourceData) && Objects.nonNull(detSourceData)) {
Date collectStartDate = DateUtils.parseDate(sampleSourceData.collection_start_date + StringPool.SPACE + sampleSourceData.collection_start_time);
Date collectStopDate = DateUtils.parseDate(sampleSourceData.collection_stop_date + StringPool.SPACE + sampleSourceData.collection_stop_time);
Double collection_time = Double.valueOf((collectStopDate.getTime() - collectStartDate.getTime()) / 1000);
String collection_time_value = String.format("%.4f", collection_time / 3600.0);
qcResult.setCollectTimeValue(collection_time_value);
if (collectionTimeSections.get(1) < collection_time / 3600.0 && collection_time / 3600.0 < collectionTimeSections.get(4)) {
qcResult.setCollectTimeStatus("Pass");
} else {
qcResult.setCollectTimeStatus("Failed");
}
String acquisition_live_sec = String.format("%.2f", sampleSourceData.acquisition_live_time / 3600.0);
qcResult.setAcquisitionTimeValue(acquisition_live_sec);
if (acquisitionTimeSections.get(1) < sampleSourceData.acquisition_live_time / 3600.0 && sampleSourceData.acquisition_live_time / 3600.0 < acquisitionTimeSections.get(4)) {
qcResult.setAcquisitionTimeStatus("Pass");
} else {
qcResult.setAcquisitionTimeStatus("Failed");
}
String s_xe_stable_volume = String.valueOf(sampleSourceData.sample_volume_of_Xe);
qcResult.setXenonVolumeValue(s_xe_stable_volume);
if (xeVolumeSections.get(1) < sampleSourceData.sample_volume_of_Xe) {
qcResult.setXenonVolumeStatus("Pass");
} else {
qcResult.setXenonVolumeStatus("Failed");
}
//
String gasMeasurementID = gasSourceData.measurement_id;
if (gasMeasurementID.equals(sampleSourceData.gas_bk_measurement_id)) {
qcResult.setGasBgValue("Match");
qcResult.setGasBgEvaluationMetrics("Match");
qcResult.setGasBgValueAndStatus(true);
} else {
qcResult.setGasBgValue("");
qcResult.setGasBgEvaluationMetrics("");
qcResult.setGasBgValueAndStatus(false);
}
//
String detMeasurementID = detSourceData.measurement_id;
if (detMeasurementID.equals(sampleSourceData.detector_bk_measurement_id)) {
qcResult.setDetBgValue("Match");
qcResult.setDetBgEvaluationMetrics("Match");
qcResult.setDetBgValueAndStatus(true);
} else {
qcResult.setDetBgValue("");
qcResult.setDetBgEvaluationMetrics("");
qcResult.setDetBgValueAndStatus(false);
}
}
} catch (ParseException e) {
throw new RuntimeException(e);
}
if (Objects.nonNull(gardsXeResults)) {
qcResult.setXe133MDCValue(String.valueOf(gardsXeResults.getMdc()));
if (0.001 < gardsXeResults.getMdc() && gardsXeResults.getMdc() < 5.0) {
qcResult.setXe133MDCStatus("Pass");
EnergySpectrumStruct sampleSourceData = betaDataFile.getSampleStruct();
EnergySpectrumStruct gasSourceData = betaDataFile.getGasStruct();
EnergySpectrumStruct detSourceData = betaDataFile.getDetStruct();
try {
if (Objects.nonNull(sampleSourceData) && Objects.nonNull(gasSourceData) && Objects.nonNull(detSourceData)) {
Date collectStartDate = DateUtils.parseDate(sampleSourceData.collection_start_date + StringPool.SPACE + sampleSourceData.collection_start_time);
Date collectStopDate = DateUtils.parseDate(sampleSourceData.collection_stop_date + StringPool.SPACE + sampleSourceData.collection_stop_time);
Double collection_time = (double) ((collectStopDate.getTime() - collectStartDate.getTime()) / 1000);
String collection_time_value = String.format("%.4f", collection_time / 3600.0);
qcResult.setCollectTimeValue(collection_time_value);
if (collectionTimeSections.get(1) < collection_time / 3600.0 && collection_time / 3600.0 < collectionTimeSections.get(4)) {
qcResult.setCollectTimeStatus("Pass");
} else {
qcResult.setXe133MDCStatus("Failed");
qcResult.setCollectTimeStatus("Failed");
}
String acquisition_live_sec = String.format("%.2f", sampleSourceData.acquisition_live_time / 3600.0);
qcResult.setAcquisitionTimeValue(acquisition_live_sec);
if (acquisitionTimeSections.get(1) < sampleSourceData.acquisition_live_time / 3600.0 && sampleSourceData.acquisition_live_time / 3600.0 < acquisitionTimeSections.get(4)) {
qcResult.setAcquisitionTimeStatus("Pass");
} else {
qcResult.setAcquisitionTimeStatus("Failed");
}
String s_xe_stable_volume = String.valueOf(sampleSourceData.sample_volume_of_Xe);
qcResult.setXenonVolumeValue(s_xe_stable_volume);
if (xeVolumeSections.get(1) < sampleSourceData.sample_volume_of_Xe) {
qcResult.setXenonVolumeStatus("Pass");
} else {
qcResult.setXenonVolumeStatus("Failed");
}
//
String gasMeasurementID = gasSourceData.measurement_id;
if (gasMeasurementID.equals(sampleSourceData.gas_bk_measurement_id)) {
qcResult.setGasBgValue("Match");
qcResult.setGasBgEvaluationMetrics("Match");
qcResult.setGasBgValueAndStatus(true);
} else {
qcResult.setGasBgValue("");
qcResult.setGasBgEvaluationMetrics("");
qcResult.setGasBgValueAndStatus(false);
}
//
String detMeasurementID = detSourceData.measurement_id;
if (detMeasurementID.equals(sampleSourceData.detector_bk_measurement_id)) {
qcResult.setDetBgValue("Match");
qcResult.setDetBgEvaluationMetrics("Match");
qcResult.setDetBgValueAndStatus(true);
} else {
qcResult.setDetBgValue("");
qcResult.setDetBgEvaluationMetrics("");
qcResult.setDetBgValueAndStatus(false);
}
} else {
qcResult.setXe133MDCValue("None");
qcResult.setXe133MDCStatus("None");
}
} catch (ParseException e) {
throw new RuntimeException(e);
}
if (Objects.nonNull(gardsXeResults)) {
qcResult.setXe133MDCValue(String.valueOf(gardsXeResults.getMdc()));
if (0.001 < gardsXeResults.getMdc() && gardsXeResults.getMdc() < 5.0) {
qcResult.setXe133MDCStatus("Pass");
} else {
qcResult.setXe133MDCStatus("Failed");
}
} else {
qcResult.setXe133MDCValue("None");
qcResult.setXe133MDCStatus("None");
}
} catch (Exception e) {
e.printStackTrace();
}
result.setSuccess(true);
result.setResult(qcResult);
return result;
return qcResult;
}
private QCResult ProcessQCResultBranch(StationDetailType stationType, BetaDataFile betaDataFile) {
//region 参数信息
QCResult qcResult = new QCResult();
String pathname = parameterProperties.getFilePath() + File.separator + "parameter.xml";
//获取各数据的范围信息
Sections sections = new Sections(stationType, pathname);
List<Rule> collectionTimeRules = sections.getCollectionTimeRules();
if (CollectionUtils.isNotEmpty(collectionTimeRules)) {
String collectionMerits = collectionTimeRules.get(1).getMin() + "~" + collectionTimeRules.get(collectionTimeRules.size() - 1).getMin();
qcResult.setCollectTimeEvaluationMetrics(collectionMerits);
}
List<Rule> acquisitionTimeRules = sections.getAcquisitionTimeRules();
if (CollectionUtils.isNotEmpty(acquisitionTimeRules)) {
String acquisitionMerits = acquisitionTimeRules.get(1).getMin() + "~" + acquisitionTimeRules.get(acquisitionTimeRules.size() - 1).getMin();
qcResult.setAcquisitionTimeEvaluationMetrics(acquisitionMerits);
}
List<Rule> xeVolumeRules = sections.getXeVolumeRules();
if (CollectionUtils.isNotEmpty(xeVolumeRules)) {
String xeMerits = xeVolumeRules.get(1).getMin() + "~ ";
qcResult.setXenonVolumeEvaluationMetrics(xeMerits);
}
String xe133MDCEvaluationMetrics = "0.001 ~ 5";
qcResult.setXe133MDCEvaluationMetrics(xe133MDCEvaluationMetrics);
//endregion
//获取数据信息
GardsXeResultsSpectrum gardsXeResults = null;
List<GardsXeResultsSpectrum> xeDataList = new LinkedList<>();
try {
xeDataList = betaDataFile.getXeResultsSpectrumList();
if (CollectionUtils.isNotEmpty(xeDataList)) {
xeDataList = xeDataList.stream().filter(item -> item.getNuclideName().equals(XeNuclideName.XE_133.getType())).collect(Collectors.toList());
gardsXeResults = xeDataList.get(0);
}
//解析sample,gas,det文件并判断数据状态
EnergySpectrumStruct sampleSourceData = betaDataFile.getSampleStruct();
EnergySpectrumStruct gasSourceData = betaDataFile.getGasStruct();
EnergySpectrumStruct detSourceData = betaDataFile.getDetStruct();
try {
if (Objects.nonNull(sampleSourceData) && Objects.nonNull(gasSourceData) && Objects.nonNull(detSourceData)) {
Date collectStartDate = DateUtils.parseDate(sampleSourceData.collection_start_date + StringPool.SPACE + sampleSourceData.collection_start_time);
Date collectStopDate = DateUtils.parseDate(sampleSourceData.collection_stop_date + StringPool.SPACE + sampleSourceData.collection_stop_time);
double collection_time = ((double) ((collectStopDate.getTime() - collectStartDate.getTime()) / 1000)) / 3600.0;
String collection_time_value = String.format("%.4f", collection_time);
qcResult.setCollectTimeValue(collection_time_value);
if (collectionTimeRules.get(1).getMin() < collection_time && collection_time < collectionTimeRules.get(collectionTimeRules.size() - 1).getMin()) {
qcResult.setCollectTimeStatus("Pass");
} else {
qcResult.setCollectTimeStatus("Failed");
}
double acquisition_live_time = sampleSourceData.acquisition_live_time / 3600.0;
String acquisition_live_sec = String.format("%.2f", sampleSourceData.acquisition_live_time / 3600.0);
qcResult.setAcquisitionTimeValue(acquisition_live_sec);
if (acquisitionTimeRules.get(1).getMin() < acquisition_live_time && acquisition_live_time < acquisitionTimeRules.get(acquisitionTimeRules.size()-1).getMin()) {
qcResult.setAcquisitionTimeStatus("Pass");
} else {
qcResult.setAcquisitionTimeStatus("Failed");
}
String s_xe_stable_volume = String.valueOf(sampleSourceData.sample_volume_of_Xe);
qcResult.setXenonVolumeValue(s_xe_stable_volume);
if (xeVolumeRules.get(1).getMin() < sampleSourceData.sample_volume_of_Xe) {
qcResult.setXenonVolumeStatus("Pass");
} else {
qcResult.setXenonVolumeStatus("Failed");
}
//
String gasMeasurementID = gasSourceData.measurement_id;
if (gasMeasurementID.equals(sampleSourceData.gas_bk_measurement_id)) {
qcResult.setGasBgValue("Match");
qcResult.setGasBgEvaluationMetrics("Match");
qcResult.setGasBgValueAndStatus(true);
} else {
qcResult.setGasBgValue("");
qcResult.setGasBgEvaluationMetrics("");
qcResult.setGasBgValueAndStatus(false);
}
//
String detMeasurementID = detSourceData.measurement_id;
if (detMeasurementID.equals(sampleSourceData.detector_bk_measurement_id)) {
qcResult.setDetBgValue("Match");
qcResult.setDetBgEvaluationMetrics("Match");
qcResult.setDetBgValueAndStatus(true);
} else {
qcResult.setDetBgValue("");
qcResult.setDetBgEvaluationMetrics("");
qcResult.setDetBgValueAndStatus(false);
}
}
} catch (RuntimeException e) {
throw new RuntimeException(e);
}
if (Objects.nonNull(gardsXeResults)) {
qcResult.setXe133MDCValue(String.valueOf(gardsXeResults.getMdc()));
if (0.001 < gardsXeResults.getMdc() && gardsXeResults.getMdc() < 5.0) {
qcResult.setXe133MDCStatus("Pass");
} else {
qcResult.setXe133MDCStatus("Failed");
}
} else {
qcResult.setXe133MDCValue("None");
qcResult.setXe133MDCStatus("None");
}
} catch (Exception e) {
e.printStackTrace();
}
return qcResult;
}
@Override

View File

@ -1,4 +1,5 @@
<config>
<DAYSPAN>
<item dayspan="30"/>
</DAYSPAN>
@ -7,236 +8,326 @@
<item good="30"/>
</WARNING>
<PHDF>
<SAUNA1>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
<SAUNA1>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
<item number="8"/>
</SAUNA1>
<SAUNA2>
<item collect_low="5.4"/>
<item collect_high="6.6"/>
<item live_low="5.4"/>
<item live_high="6.6"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
</SAUNA1>
<SAUNA2>
<item collect_low="5.4"/>
<item collect_high="6.6"/>
<item live_low="4.2"/>
<item live_high="6.6"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
<item number="16"/>
</SAUNA2>
</SAUNA2>
<SPALAX>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10"/>
<item live_qc="600"/>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10"/>
<item live_qc="600"/>
<item number="2"/>
</SPALAX>
<SPALAX-PLC>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10"/>
<item live_high="11"/>
<item quantity="10"/>
<item live_qc="240"/>
</SPALAX>
<SPALAX-PLC>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10"/>
<item live_high="11"/>
<item quantity="10"/>
<item live_qc="240"/>
<item number="4"/>
</SPALAX-PLC>
<PARTICULATE>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
</SPALAX-PLC>
<PARTICULATE>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="1"/>
</PARTICULATE>
</PARTICULATE>
</PHDF>
<PHD>
<SAUNA1>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="1.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
<SAUNA1>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="1.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
<item number="28"/>
</SAUNA1>
<SAUNA2>
<item collect_low="5.4"/>
<item collect_high="6.6"/>
<item live_low="5.4"/>
<item live_high="6.6"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
</SAUNA1>
<SAUNA2>
<item collect_low="5.4"/>
<item collect_high="6.6"/>
<item live_low="4.2"/>
<item live_high="6.6"/>
<item quantity="10"/>
<item xe_volume="0.87"/>
<item mdc="1"/>
<item nuclide_name="Xe133"/>
<item live_qc="600"/>
<item number="36"/>
</SAUNA2>
<SPALAX>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10"/>
<item live_qc="600"/>
</SAUNA2>
<SPALAX>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10"/>
<item live_qc="600"/>
<item number="13"/>
</SPALAX>
<SPALAX-PLC>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10"/>
<item live_high="11"/>
<item quantity="10"/>
<item live_qc="240"/>
</SPALAX>
<SPALAX-PLC>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10"/>
<item live_high="11"/>
<item quantity="10"/>
<item live_qc="240"/>
<item number="14"/>
</SPALAX-PLC>
<PARTICULATE>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
</SPALAX-PLC>
<PARTICULATE>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="12"/>
</PARTICULATE>
</PARTICULATE>
</PHD>
<MET>
<item number = "144"/>
<item number="144"/>
</MET>
<SOH>
<item number = "144"/>
<item number="144"/>
</SOH>
<SPHD_MET_SOH>
<SAUNA>
<item number = "316"/>
</SAUNA>
<SPALAX>
<item number = "301"/>
</SPALAX>
<PARTICULATE>
<item number = "300"/>
</PARTICULATE>
<SAUNA>
<item number="316"/>
</SAUNA>
<SPALAX>
<item number="301"/>
</SPALAX>
<PARTICULATE>
<item number="300"/>
</PARTICULATE>
</SPHD_MET_SOH>
<SPECIAL>
<STATION name = "CMX13">
<PHDF>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item live_qc="600"/>
<item number="1"/>
</PHDF>
<PHD>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item live_qc="600"/>
<item number="12"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="300"/>
</SPHD_MET_SOH>
</STATION>
<STATION name = "CNP20">
<PHDF>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="2"/>
</PHDF>
<PHD>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="13"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="301"/>
</SPHD_MET_SOH>
</STATION>
<STATION name = "CNP21">
<PHDF>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="2"/>
</PHDF>
<PHD>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="13"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="301"/>
</SPHD_MET_SOH>
</STATION>
<STATION name = "CNP22">
<PHDF>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="2"/>
</PHDF>
<PHD>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="13"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="301"/>
</SPHD_MET_SOH>
</STATION>
<SPECIAL>
<STATION name="CMX13">
<PHDF>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item live_qc="600"/>
<item number="1"/>
</PHDF>
<PHD>
<item collect_low="10.8"/>
<item collect_high="13.2"/>
<item live_low="10.8"/>
<item live_high="13.2"/>
<item quantity="10"/>
<item live_qc="600"/>
<item number="12"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="300"/>
</SPHD_MET_SOH>
</STATION>
<STATION name="CNP20">
<PHDF>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="2"/>
</PHDF>
<PHD>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="13"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="301"/>
</SPHD_MET_SOH>
</STATION>
<STATION name="CNP21">
<PHDF>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="2"/>
</PHDF>
<PHD>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="13"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="301"/>
</SPHD_MET_SOH>
</STATION>
<STATION name="CNP22">
<PHDF>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="21.6"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="2"/>
</PHDF>
<PHD>
<item collect_low="21.6"/>
<item collect_high="26.4"/>
<item live_low="1.8"/>
<item live_high="26.4"/>
<item quantity="10800"/>
<item number="13"/>
</PHD>
<SOH>
<item number="144"/>
</SOH>
<MET>
<item number="144"/>
</MET>
<SPHD_MET_SOH>
<item number="301"/>
</SPHD_MET_SOH>
</STATION>
</SPECIAL>
<QCFlags-P>
<!-- 范围内显示绿色,否则显示红色 -->
<!-- "["表示大于等于,"]"表示小于等于,"("表示大于,")"表示小于 -->
<col_time green="[21.6,26.4]"/>
<!-- 21.6 <= col_time <= 26.4, units:hour -->
<acq_time green="(18.0,-)"/>
<!-- acq_time > 18, units:hour -->
<decay_time green="(-,26.4)"/>
<!-- decay_time < 26.4, units:hour -->
<samp_vol green="(10800,-)"/>
<!-- samp_vol > 10800, units:cube meter -->
<Be7-FWHM green="(-,1.7)"/>
<!-- Be7-FWHM < 1.7, units:keV -->
<Ba140-MDC green="(-,30)"/>
<!-- Ba140-MDC < 30, units:uBq/m3 -->
<airFlow green="(500,-)"/>
<!-- airFlow > 500, units:cube meter per hour -->
<Be7 energy="477.595001"/>
<Ba140 energy="537.260986" yield="0.24389999" halflife="12.752"/>
</QCFlags-P>
<QCFlags-SPALAX>
<col_time green="[5.4,6.6]"/>
<acq_time green="[16.0,24.0]"/>
<decay_time green="(-,10.0)"/>
<samp_vol green="(10,-)"/>
<Xe133-MDC green="(-,1000)"/>
<airFlow green="(0.4,-)"/>
<Xe133 energy="80.997002" yield="0.38" halflife="5.243"/>
</QCFlags-SPALAX>
<QCFlags-SPALAX-PLC>
<col_time green="[10.8,13.2]"/>
<acq_time green="[10.8,13.2]"/>
<decay_time green="(-,10.0)"/>
<samp_vol green="(10,-)"/>
<Xe133-MDC green="(-,1000)"/>
<airFlow green="(0.4,-)"/>
<Xe133 energy="80.997002" yield="0.38" halflife="5.243"/>
</QCFlags-SPALAX-PLC>
<sauna>
<collectionTime>
<Rule min="0.0" max="6.0" color="RedLight"/>
<Rule min="6.0" max="10.8" color="YellowLight"/>
<Rule min="10.8" max="13.2" color="GreenLight"/>
<Rule min="13.2" max="24.0" color="YellowLight"/>
<Rule min="24.0" color="RedLight"/>
</collectionTime>
<acquisitionTime>
<Rule min="0.0" max="6.0" color="RedLight"/>
<Rule min="6.0" max="10.8" color="YellowLight"/>
<Rule min="10.8" max="13.2" color="GreenLight"/>
<Rule min="13.2" max="24.0" color="YellowLight"/>
<Rule min="24.0" color="RedLight"/>
</acquisitionTime>
<xeVolume>
<Rule min="0.0" max="0.2" color="RedLight"/>
<Rule min="0.2" max="0.87" color="YellowLight"/>
<Rule min="0.87" color="GreenLight"/>
</xeVolume>
<airVolume>
<Rule min="0.0" max="2.3" color="RedLight"/>
<Rule min="2.3" max="10.0" color="YellowLight"/>
<Rule min="10.0" color="GreenLight"/>
</airVolume>
</sauna>
<sauna2>
<collectionTime>
<Rule min="0.0" max="3.0" color="RedLight"/>
<Rule min="3.0" max="5.4" color="YellowLight"/>
<Rule min="5.4" max="6.6" color="GreenLight"/>
<Rule min="6.6" max="12.0" color="RedLight"/>
<Rule min="12.0" color="RedLight"/>
</collectionTime>
<acquisitionTime>
<Rule min="0.0" max="3.0" color="RedLight"/>
<Rule min="3.0" max="5.4" color="YellowLight"/>
<Rule min="5.4" max="6.6" color="GreenLight"/>
<Rule min="6.6" max="12.0" color="RedLight"/>
<Rule min="12.0" color="RedLight"/>
</acquisitionTime>
<xeVolume>
<Rule min="0.0" max="0.2" color="RedLight"/>
<Rule min="0.2" max="0.87" color="YellowLight"/>
<Rule min="0.87" color="GreenLight"/>
</xeVolume>
<airVolume>
<Rule min="0.0" max="2.3" color="RedLight"/>
<Rule min="2.3" max="10.0" color="YellowLight"/>
<Rule min="10.0" color="GreenLight"/>
</airVolume>
</sauna2>
</config>