修改等级计算参数

This commit is contained in:
duwenyuan 2026-01-07 20:47:22 +08:00
parent 43d2aef0bb
commit d1683ca974
12 changed files with 318 additions and 72 deletions

View File

@ -1,5 +1,6 @@
package org.jeecg.modules.base.service; package org.jeecg.modules.base.service;
import org.jeecg.modules.base.dto.Info;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.util.List; import java.util.List;
@ -8,13 +9,13 @@ import java.util.Map;
public interface IThresholdCalculationService { public interface IThresholdCalculationService {
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
Map<String, Double> calculateSingleStationThreshold(String stationId); Map<String, Double> calculateSingleStationThreshold(Info info);
Map<String, Double> getStationThresholds(String stationId); Map<String, Double> getStationThresholds(String stationId);
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
void processBatchCalculation(List<String> stationIds); void processBatchCalculation(List<Info> infos);
} }

View File

@ -2,7 +2,9 @@ package org.jeecg.modules.base.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.dynamic.datasource.annotation.DS;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.NumberFormatUtil;
import org.jeecg.common.util.RadionuclideUtil; import org.jeecg.common.util.RadionuclideUtil;
import org.jeecg.modules.base.dto.Info;
import org.jeecg.modules.base.entity.StatisticsResult; import org.jeecg.modules.base.entity.StatisticsResult;
import org.jeecg.modules.base.entity.ThresholdMetric; import org.jeecg.modules.base.entity.ThresholdMetric;
import org.jeecg.modules.base.entity.rnauto.GardsThresholdResult; import org.jeecg.modules.base.entity.rnauto.GardsThresholdResult;
@ -28,6 +30,7 @@ public class RnAutoThresholdServiceImpl extends ThresholdCalculationBaseService<
@Autowired @Autowired
private RnAutoThresholdHisServiceImpl thresholdHisService; private RnAutoThresholdHisServiceImpl thresholdHisService;
/** /**
* 获取当前服务处理的数据类型 * 获取当前服务处理的数据类型
* *
@ -41,29 +44,31 @@ public class RnAutoThresholdServiceImpl extends ThresholdCalculationBaseService<
/** /**
* 保存RNAUTO类型阈值计算结果 * 保存RNAUTO类型阈值计算结果
* *
* @param stationId 台站ID * @param info 台站ID
* @param thresholds 阈值映射 * @param thresholds 阈值映射
* @param statistics 统计结果映射 * @param statistics 统计结果映射
*/ */
@Override @Override
protected void saveThresholdResults(String stationId, Map<String, Double> thresholds, protected void saveThresholdResults(Info info, Map<String, Double> thresholds,
Map<String, StatisticsResult> statistics) { Map<String, StatisticsResult> statistics) {
String stationId = info.getStationId();
validateSaveParams(stationId, thresholds, statistics); validateSaveParams(stationId, thresholds, statistics);
log.debug("开始保存RNAUTO阈值结果台站{},核素{}个", stationId, thresholds.size()); log.debug("开始保存RNAUTO阈值结果台站{},核素{}个", stationId, thresholds.size());
List<GardsThresholdResult> results = buildThresholdResultList(stationId, thresholds, statistics); List<GardsThresholdResult> results = buildThresholdResultList(info, thresholds, statistics);
if (!CollectionUtils.isEmpty(results)) { if (!CollectionUtils.isEmpty(results)) {
// 先删除旧数据 // 先删除旧数据
this.baseMapper.deleteByStationId(stationId); this.baseMapper.deleteByStationId(stationId);
// 批量保存新数据 // 批量保存新数据
boolean saveSuccess = this.saveBatch(results); boolean saveSuccess = this.saveBatch(results);
// saveBatch(results, DEFAULT_BATCH_SIZE); // saveBatch(results, DEFAULT_BATCH_SIZE);
if (saveSuccess) { if (saveSuccess) {
List<GardsThresholdResultHistory> resultHisList = results.stream() List<GardsThresholdResultHistory> resultHisList = results.stream()
.map(item -> { .map(item -> {
GardsThresholdResultHistory his = new GardsThresholdResultHistory(); GardsThresholdResultHistory his = new GardsThresholdResultHistory();
BeanUtils.copyProperties(item, his); BeanUtils.copyProperties(item, his);
return his; return his;
}) })
@ -112,8 +117,9 @@ public class RnAutoThresholdServiceImpl extends ThresholdCalculationBaseService<
/** /**
* 构建ThresholdResult列表 * 构建ThresholdResult列表
*/ */
private List<GardsThresholdResult> buildThresholdResultList(String stationId, Map<String, Double> thresholds, private List<GardsThresholdResult> buildThresholdResultList(Info info, Map<String, Double> thresholds,
Map<String, StatisticsResult> statistics) { Map<String, StatisticsResult> statistics) {
List<GardsThresholdResult> results = new ArrayList<>(thresholds.size()); List<GardsThresholdResult> results = new ArrayList<>(thresholds.size());
thresholds.forEach((nuclideName, thresholdValue) -> { thresholds.forEach((nuclideName, thresholdValue) -> {
@ -123,14 +129,30 @@ public class RnAutoThresholdServiceImpl extends ThresholdCalculationBaseService<
return; return;
} }
Map<String, String> nulides = info.getNuclides();
String category = "A"; // 默认无效
if (Objects.nonNull(nulides)) {
String concStr = info.getNuclides().get(nuclideName);
if (StringUtils.hasText(concStr)) {
try {
double concValue = Double.parseDouble(NumberFormatUtil.numberFormat(concStr));
category = concValue < thresholdValue ? "B" : "C";
} catch (Exception ignored) {
// 解析失败保持 A
}
}
}
GardsThresholdResult result = new GardsThresholdResult(); GardsThresholdResult result = new GardsThresholdResult();
result.setId(UUID.randomUUID().toString()); result.setId(UUID.randomUUID().toString());
result.setStationId(stationId); result.setStationId(info.getStationId());
result.setNuclideName(nuclideName); result.setNuclideName(nuclideName);
result.setCategory(category);
result.setThresholdValue(thresholdValue); result.setThresholdValue(thresholdValue);
result.setMedian(stats.getMedian()); result.setMedian(stats.getMedian());
result.setPercentile25(stats.getPercentile25()); result.setPercentile25(stats.getPercentile25());
result.setPercentile75(stats.getPercentile75()); result.setPercentile75(stats.getPercentile75());
result.setCollectStop(info.getCollectStop());
results.add(result); results.add(result);
@ -198,7 +220,8 @@ public class RnAutoThresholdServiceImpl extends ThresholdCalculationBaseService<
public List<String> getAllNuclides() { public List<String> getAllNuclides() {
return RadionuclideUtil.getAllNuclides(); return RadionuclideUtil.getAllNuclides();
} }
public Integer getDayValue(){
return RadionuclideUtil.getDayValue(); public Integer getDayValue() {
} return RadionuclideUtil.getDayValue();
}
} }

View File

@ -2,6 +2,7 @@ package org.jeecg.modules.base.service.impl;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.util.RadionuclideUtil; import org.jeecg.common.util.RadionuclideUtil;
import org.jeecg.modules.base.dto.Info;
import org.jeecg.modules.base.entity.StatisticsResult; import org.jeecg.modules.base.entity.StatisticsResult;
import org.jeecg.modules.base.entity.ThresholdMetric; import org.jeecg.modules.base.entity.ThresholdMetric;
import org.jeecg.modules.base.entity.rnman.GardsThresholdResult; import org.jeecg.modules.base.entity.rnman.GardsThresholdResult;
@ -44,12 +45,13 @@ public class RnManThresholdServiceImpl extends ThresholdCalculationBaseService<T
* @param statistics 统计结果映射 * @param statistics 统计结果映射
*/ */
protected void saveThresholdResults(String stationId, Map<String, Double> thresholds, protected void saveThresholdResults(Info info, Map<String, Double> thresholds,
Map<String, StatisticsResult> statistics) { Map<String, StatisticsResult> statistics) {
String stationId=info.getStationId();
validateSaveParams(stationId, thresholds, statistics); validateSaveParams(stationId, thresholds, statistics);
log.debug("开始保存RNMAN阈值结果台站{},核素{}个", stationId, thresholds.size()); log.debug("开始保存RNMAN阈值结果台站{},核素{}个", stationId, thresholds.size());
List<GardsThresholdResult> results = buildThresholdRnManResultList(stationId, thresholds, statistics); List<GardsThresholdResult> results = buildThresholdRnManResultList(info, thresholds, statistics);
if (!CollectionUtils.isEmpty(results)) { if (!CollectionUtils.isEmpty(results)) {
// 先删除旧数据 // 先删除旧数据
@ -109,7 +111,7 @@ public class RnManThresholdServiceImpl extends ThresholdCalculationBaseService<T
/** /**
* 构建ThresholdRnManResult列表 * 构建ThresholdRnManResult列表
*/ */
private List<GardsThresholdResult> buildThresholdRnManResultList(String stationId, Map<String, Double> thresholds, private List<GardsThresholdResult> buildThresholdRnManResultList(Info info, Map<String, Double> thresholds,
Map<String, StatisticsResult> statistics) { Map<String, StatisticsResult> statistics) {
List<GardsThresholdResult> results = new ArrayList<>(thresholds.size()); List<GardsThresholdResult> results = new ArrayList<>(thresholds.size());
@ -122,13 +124,13 @@ public class RnManThresholdServiceImpl extends ThresholdCalculationBaseService<T
GardsThresholdResult result = new GardsThresholdResult(); GardsThresholdResult result = new GardsThresholdResult();
result.setId(UUID.randomUUID().toString()); result.setId(UUID.randomUUID().toString());
result.setStationId(stationId); result.setStationId(info.getStationId());
result.setNuclideName(nuclideName); result.setNuclideName(nuclideName);
result.setThresholdValue(thresholdValue); result.setThresholdValue(thresholdValue);
result.setMedian(stats.getMedian()); result.setMedian(stats.getMedian());
result.setPercentile25(stats.getPercentile25()); result.setPercentile25(stats.getPercentile25());
result.setPercentile75(stats.getPercentile75()); result.setPercentile75(stats.getPercentile75());
result.setCollectStop(info.getCollectStop());
results.add(result); results.add(result);
}); });

View File

@ -9,8 +9,10 @@ import org.jeecg.common.properties.ParameterProperties;
import org.jeecg.common.util.DateUtils; import org.jeecg.common.util.DateUtils;
import org.jeecg.common.util.NumUtil; import org.jeecg.common.util.NumUtil;
import org.jeecg.common.util.RadionuclideUtil; import org.jeecg.common.util.RadionuclideUtil;
import org.jeecg.modules.base.dto.Info;
import org.jeecg.modules.base.entity.StatisticsResult; import org.jeecg.modules.base.entity.StatisticsResult;
import org.jeecg.modules.base.entity.ThresholdMetric; import org.jeecg.modules.base.entity.ThresholdMetric;
import org.jeecg.modules.base.entity.ThresholdMetricResults;
import org.jeecg.modules.base.service.IThresholdCalculationService; import org.jeecg.modules.base.service.IThresholdCalculationService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -79,11 +81,11 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
/** /**
* 保存阈值计算结果子类实现具体保存逻辑 * 保存阈值计算结果子类实现具体保存逻辑
* *
* @param stationId 台站ID * @param info 台站ID
* @param thresholds 阈值映射 * @param thresholds 阈值映射
* @param statistics 统计结果映射 * @param statistics 统计结果映射
*/ */
protected abstract void saveThresholdResults(String stationId, Map<String, Double> thresholds, Map<String, StatisticsResult> statistics); protected abstract void saveThresholdResults(Info info, Map<String, Double> thresholds, Map<String, StatisticsResult> statistics);
/** /**
* 从数据库查询台站阈值子类实现具体查询逻辑 * 从数据库查询台站阈值子类实现具体查询逻辑
@ -112,12 +114,13 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
/** /**
* 计算单个台站的阈值公共逻辑 * 计算单个台站的阈值公共逻辑
* *
* @param stationId 台站ID * @param info 台站ID
* @return 核素-阈值映射 * @return 核素-阈值映射
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public Map<String, Double> calculateSingleStationThreshold(String stationId) { public Map<String, Double> calculateSingleStationThreshold(Info info) {
String stationId = info.getStationId();
// 1. 参数校验 // 1. 参数校验
validateCalculateParams(stationId); validateCalculateParams(stationId);
log.info("开始计算单个台站阈值stationId={}", stationId); log.info("开始计算单个台站阈值stationId={}", stationId);
@ -125,7 +128,8 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
List<String> stationIds = Collections.singletonList(stationId); List<String> stationIds = Collections.singletonList(stationId);
Map<String, Map<String, List<Double>>> metricsMap = getMetricsForStations(stationIds); Map<String, Map<String, List<Double>>> metricsMap = getMetricsForStations(stationIds);
// 3. 检查是否有数据 // List<ThresholdMetric> metricsMap = getThresholdMetric(stationIds);
// 3. 检查是否有数据getConcentrationsByStation(metricsMap, stationId);//
Map<String, List<Double>> metrics = metricsMap.get(stationId); Map<String, List<Double>> metrics = metricsMap.get(stationId);
if (CollectionUtils.isEmpty(metrics)) { if (CollectionUtils.isEmpty(metrics)) {
log.warn("台站{}没有找到有效的度量数据", stationId); log.warn("台站{}没有找到有效的度量数据", stationId);
@ -138,12 +142,26 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
calculateThresholdAndStats(metrics, thresholds, statistics); calculateThresholdAndStats(metrics, thresholds, statistics);
// 5. 保存计算结果子类实现 // 5. 保存计算结果子类实现
saveThresholdResults(stationId, thresholds, statistics); saveThresholdResults(info, thresholds, statistics);
log.info("单个台站阈值计算完成stationId={}, 核素数量={}", stationId, thresholds.size()); log.info("单个台站阈值计算完成stationId={}, 核素数量={}", stationId, thresholds.size());
return thresholds; return thresholds;
} }
//根据台站ID筛选出核素对应的浓度
public Map<String, List<ThresholdMetric>> getConcentrationsByStation(List<ThresholdMetric> metrics, String stationId) {
return metrics.stream()
.filter(m -> Objects.equals(m.getStationId(), Integer.valueOf(stationId)))
.filter(m -> StringUtils.hasText(m.getNuclideName()) && StringUtils.hasText(m.getConcentration()))
.collect(Collectors.groupingBy(
ThresholdMetric::getNuclideName, // 按核素名称分组
Collectors.mapping(
m -> m, // 转换浓度为 double
Collectors.toList()
)
));
}
/** /**
* 查询单个台站的阈值优先缓存缓存未命中查库 * 查询单个台站的阈值优先缓存缓存未命中查库
* *
@ -181,7 +199,9 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
*/ */
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
@Override @Override
public void processBatchCalculation(List<String> stationIds) { public void processBatchCalculation(List<Info> infos) {
List<String> stationIds = infos.stream().map(info -> info.getStationId()).collect(Collectors.toList());
String currentDataType = getCurrentDataType(); String currentDataType = getCurrentDataType();
log.info("开始批量阈值计算dataType={}", currentDataType); log.info("开始批量阈值计算dataType={}", currentDataType);
@ -198,12 +218,12 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
Map<String, Map<String, List<Double>>> metricsMap = getMetricsForStations(stationIds); Map<String, Map<String, List<Double>>> metricsMap = getMetricsForStations(stationIds);
// 3. 处理每个台站 // 3. 处理每个台站
stationIds.forEach(stationId -> { infos.forEach(info -> {
Map<String, List<Double>> metrics = metricsMap.get(stationId); Map<String, List<Double>> metrics = metricsMap.get(info.getStationId());
if (metrics != null && !metrics.isEmpty()) { if (metrics != null && !metrics.isEmpty()) {
processSingleStation(stationId, metrics); processSingleStation(info, metrics);
} else { } else {
log.warn("台站 {} {} 没有度量数据,跳过处理", stationId, currentDataType); log.warn("台站 {} {} 没有度量数据,跳过处理", info.getStationId(), currentDataType);
} }
}); });
@ -269,26 +289,41 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
// 按数据类型查询度量数据 // 按数据类型查询度量数据
List<ThresholdMetric> queryMetrics = queryMetricsByDataType(stationIds, startDate); List<ThresholdMetric> queryMetrics = queryMetricsByDataType(stationIds, startDate);
List<ThresholdMetric> metrics = stationIds.stream() List<ThresholdMetric> metrics = new ArrayList<>();
.flatMap(stationId -> getAllNuclides().stream()
.map(nuclide -> {
// 查找匹配的查询结果
Optional<ThresholdMetric> matched = queryMetrics.stream()
.filter(Objects::nonNull)
.filter(qm -> qm.getStationId() == Integer.parseInt(stationId))
.filter(qm -> nuclide != null && nuclide.equals(qm.getNuclideName()))
.findFirst();
return matched.orElseGet(()->{ // 查询结果的快速索引 (StationId -> (NuclideName -> ThresholdMetric))
ThresholdMetric tm = new ThresholdMetric(); Map<Integer, Map<String, List<ThresholdMetric>>> metricIndex = queryMetrics.stream()
tm.setStationId(Integer.valueOf(stationId)); .collect(Collectors.groupingBy(
tm.setNuclideName(nuclide); ThresholdMetric::getStationId,
tm.setConcentration("0"); Collectors.groupingBy(ThresholdMetric::getNuclideName)
return tm; ));
});
}))
.collect(Collectors.toList());
// 2. 预先处理所有核素名称
List<String> allNuclides = RadionuclideUtil.getAllNuclides();
// 3. 遍历所有组合
for (String stationId : stationIds) {
Integer station = Integer.parseInt(stationId);
// 获取当前站点对应的核素Map若不存在则返回空Map
Map<String, List<ThresholdMetric>> nuclideMap = metricIndex.getOrDefault(station, Collections.emptyMap());
for (String nuclideName : allNuclides) {
// 直接从索引中获取该站点的该核素数据列表
List<ThresholdMetric> stationMetrics = nuclideMap.get(nuclideName);
if (stationMetrics == null || stationMetrics.isEmpty()) {
// 没有找到记录创建默认对象
ThresholdMetric tm = new ThresholdMetric();
tm.setStationId(station);
tm.setNuclideName(nuclideName);
tm.setConcentration("0");
metrics.add(tm);
} else {
// 找到了对应的记录直接添加
metrics.addAll(stationMetrics);
}
}
}
if (CollectionUtils.isEmpty(metrics)) { if (CollectionUtils.isEmpty(metrics)) {
log.debug("未查询到核素度量数据:台站{}", stationIds); log.debug("未查询到核素度量数据:台站{}", stationIds);
@ -303,6 +338,52 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
return result; return result;
} }
protected List<ThresholdMetric> getThresholdMetric(List<String> stationIds) {
// 参数校验
if (CollectionUtils.isEmpty(stationIds)) {
log.warn("获取核素度量数据失败台站ID列表为空");
throw new IllegalArgumentException("台站ID列表不可为空");
}
Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DAY_OF_YEAR, -getDayValue());
String startDate = DateUtils.formatDate(calendar.getTime(), "yyyy-MM-dd HH:mm:ss");
log.debug("查询核素度量数据:台站{}个,时间范围{}至今",
stationIds.size(), startDate);
// 按数据类型查询度量数据
List<ThresholdMetric> queryMetrics = queryMetricsByDataType(stationIds, startDate);
List<ThresholdMetric> metrics = stationIds.stream()
.flatMap(stationId -> getAllNuclides().stream()
.map(nuclide -> {
// 查找匹配的查询结果
Optional<ThresholdMetric> matched = queryMetrics.stream()
.filter(Objects::nonNull)
.filter(qm -> qm.getStationId() == Integer.parseInt(stationId))
.filter(qm -> nuclide != null && nuclide.equals(qm.getNuclideName()))
.findFirst();
return matched.orElseGet(() -> {
ThresholdMetric tm = new ThresholdMetric();
tm.setStationId(Integer.valueOf(stationId));
tm.setNuclideName(nuclide);
tm.setConcentration("0");
return tm;
});
}))
.collect(Collectors.toList());
if (CollectionUtils.isEmpty(metrics)) {
log.debug("未查询到核素度量数据:台站{}", stationIds);
return new ArrayList<>();
}
return metrics;
}
/** /**
* 按数据类型查询度量数据差异化查询逻辑 * 按数据类型查询度量数据差异化查询逻辑
* *
@ -385,13 +466,45 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
}); });
} }
// protected void calculateThresholdAndStats(Map<String, List<ThresholdMetric>> metrics,
// Map<String, Double> thresholds,
// Map<String, StatisticsResult> statistics) {
// if (metrics == null || metrics.isEmpty()) {
// log.warn("核素度量数据为空,跳过计算");
// return;
// }
// metrics.forEach((nuclideName, values) -> {
// if (values==null||values.isEmpty()) {
// log.trace("核素{}数据为空,跳过计算", nuclideName);
// return;
// }
//
// // 计算统计值中位数四分位数
// StatisticsResult stats = calculateStatistics( nuclideName);
// statistics.put(nuclideName, stats);
//
// // 计算阈值中位数 + 3 * IQR四分位距
// double median = stats.getMedian();
// double q1 = stats.getPercentile25();
// double q3 = stats.getPercentile75();
// double iqr = q3 - q1;
// double threshold = NumUtil.keep(median + (iqr * 3), 6);
//
// thresholds.put(nuclideName, threshold);
// });
//
//
// }
/** /**
* 处理单个台站批量计算时用 * 处理单个台站批量计算时用
* *
* @param stationId 台站ID * @param info 台站ID
* @param metrics 核素-浓度列表映射 * @param metrics 核素-浓度列表映射
*/ */
protected void processSingleStation(String stationId, Map<String, List<Double>> metrics) { protected void processSingleStation(Info info, Map<String, List<Double>> metrics) {
Map<String, Double> thresholds = new HashMap<>(); Map<String, Double> thresholds = new HashMap<>();
Map<String, StatisticsResult> statistics = new HashMap<>(); Map<String, StatisticsResult> statistics = new HashMap<>();
@ -399,10 +512,10 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
calculateThresholdAndStats(metrics, thresholds, statistics); calculateThresholdAndStats(metrics, thresholds, statistics);
// 保存结果子类实现 // 保存结果子类实现
saveThresholdResults(stationId, thresholds, statistics); saveThresholdResults(info, thresholds, statistics);
log.info("台站 {} 处理完成dataType={},生成 {} 个阈值结果", log.info("台站 {} 处理完成dataType={},生成 {} 个阈值结果",
stationId, getCurrentDataType(), thresholds.size()); info.getStationId(), getCurrentDataType(), thresholds.size());
} }
/** /**
@ -433,6 +546,7 @@ public abstract class ThresholdCalculationBaseService<M extends BaseMapper<T>, T
return result; return result;
} }
/** /**
* 计算分位数 * 计算分位数
*/ */

View File

@ -100,7 +100,7 @@ public class GradingConsumer implements StreamListener<String, ObjectRecord<Stri
//如果是全谱更新台站阈值 //如果是全谱更新台站阈值
if ("FULL".equals(info.getFullOrPrel())) { if ("FULL".equals(info.getFullOrPrel())) {
//更新台站阈值 //更新台站阈值
rnAutoService.calculateSingleStationThreshold(info.getStationId()); rnAutoService.calculateSingleStationThreshold(info);
} }
} }

View File

@ -14,10 +14,12 @@ import org.jeecg.modules.base.dto.Info;
import org.jeecg.modules.base.entity.original.GardsSampleData; import org.jeecg.modules.base.entity.original.GardsSampleData;
import org.jeecg.modules.base.entity.rnauto.GardsAnalyses; import org.jeecg.modules.base.entity.rnauto.GardsAnalyses;
import org.jeecg.modules.base.entity.rnauto.GardsThresholdResult; import org.jeecg.modules.base.entity.rnauto.GardsThresholdResult;
import org.jeecg.modules.base.entity.rnauto.GardsTransportStatus;
import org.jeecg.modules.base.enums.*; import org.jeecg.modules.base.enums.*;
import org.jeecg.modules.config.datasource.DataSourceSwitcher; import org.jeecg.modules.config.datasource.DataSourceSwitcher;
import org.jeecg.modules.eneity.event.SpectrumErrorEvent; import org.jeecg.modules.eneity.event.SpectrumErrorEvent;
import org.jeecg.modules.enums.ErrorType; import org.jeecg.modules.enums.ErrorType;
import org.jeecg.modules.base.enums.TransportTaskStatusEnum;
import org.jeecg.modules.exception.BAnalyseException; import org.jeecg.modules.exception.BAnalyseException;
import org.jeecg.modules.exception.FileNotExistException; import org.jeecg.modules.exception.FileNotExistException;
import org.jeecg.modules.file.FileOperation; import org.jeecg.modules.file.FileOperation;
@ -310,7 +312,19 @@ public class Sample_B_Analysis implements BlockConstant {
//样品分级 //样品分级
category = spectrumServiceQuotes.getSampleGradingService().processAutoTypeB(getSampleInfo(), thresholds); category = spectrumServiceQuotes.getSampleGradingService().processAutoTypeB(getSampleInfo(), thresholds);
if (category >= 3) {
GardsTransportStatus transportStatus = new GardsTransportStatus();
transportStatus.setSampleId(this.sampleData.getSampleId());
transportStatus.setDescription("");
transportStatus.setTransportStatus(0);
transportStatus.setCloseStatus(0);
transportStatus.setModdate(new Date());
boolean result = spectrumServiceQuotes.getGardsTransportStatusService().save(transportStatus);
}
} catch (Exception e) { } catch (Exception e) {
log.error("获取样品分级数据错误");
} }
@ -370,6 +384,7 @@ public class Sample_B_Analysis implements BlockConstant {
final Instant instant = this.sampleData.getCollectStart().toInstant(); final Instant instant = this.sampleData.getCollectStart().toInstant();
final LocalDateTime collectTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime(); final LocalDateTime collectTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
info.setCollectionDate(collectTime); info.setCollectionDate(collectTime);
info.setCollectStop(this.sampleData.getCollectStop());
info.setDatasource(DSType.ARMDARR.getType()); info.setDatasource(DSType.ARMDARR.getType());
info.setFullOrPrel(this.sampleData.getSpectralQualifie()); info.setFullOrPrel(this.sampleData.getSpectralQualifie());
info.setBetaOrGamma(SpectrumType.BETA.getType()); info.setBetaOrGamma(SpectrumType.BETA.getType());

View File

@ -24,9 +24,7 @@ import org.jeecg.modules.base.bizVo.AttributeItemVo;
import org.jeecg.modules.base.dto.*; import org.jeecg.modules.base.dto.*;
import org.jeecg.modules.base.entity.original.GardsSampleData; import org.jeecg.modules.base.entity.original.GardsSampleData;
import org.jeecg.modules.base.entity.rnauto.*; import org.jeecg.modules.base.entity.rnauto.*;
import org.jeecg.modules.base.enums.DSType; import org.jeecg.modules.base.enums.*;
import org.jeecg.modules.base.enums.MiddleDataType;
import org.jeecg.modules.base.enums.SpectrumType;
import org.jeecg.modules.config.datasource.DataSourceSwitcher; import org.jeecg.modules.config.datasource.DataSourceSwitcher;
import org.jeecg.modules.eneity.event.SpectrumErrorEvent; import org.jeecg.modules.eneity.event.SpectrumErrorEvent;
import org.jeecg.modules.entity.vo.*; import org.jeecg.modules.entity.vo.*;
@ -185,6 +183,16 @@ public class Sample_G_Analysis {
//样品分级 //样品分级
Integer category = serviceQuotes.getSampleGradingService().processAutoTypeP(info, thresholds); Integer category = serviceQuotes.getSampleGradingService().processAutoTypeP(info, thresholds);
middleData.setAnalyses_category(category); middleData.setAnalyses_category(category);
if (category >= 3) {
GardsTransportStatus transportStatus = new GardsTransportStatus();
transportStatus.setSampleId(this.sampleData.getSampleId());
transportStatus.setDescription("");
transportStatus.setTransportStatus(0);
transportStatus.setCloseStatus(0);
transportStatus.setModdate(new Date());
boolean result = serviceQuotes.getGardsTransportStatusService().save(transportStatus);
}
} catch (Exception e) { } catch (Exception e) {
} }
@ -233,6 +241,7 @@ public class Sample_G_Analysis {
final Instant instant = DateUtils.parseDate(middleData.sample_collection_start).toInstant(); final Instant instant = DateUtils.parseDate(middleData.sample_collection_start).toInstant();
final LocalDateTime collectTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime(); final LocalDateTime collectTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
info.setCollectionDate(collectTime); info.setCollectionDate(collectTime);
info.setCollectStop(this.sampleData.getCollectStop());
info.setDatasource(DSType.ARMDARR.getType()); info.setDatasource(DSType.ARMDARR.getType());
info.setFullOrPrel(this.sampleData.getSpectralQualifie()); info.setFullOrPrel(this.sampleData.getSpectralQualifie());
info.setBetaOrGamma(SpectrumType.GAMMA.getType()); info.setBetaOrGamma(SpectrumType.GAMMA.getType());
@ -1117,7 +1126,7 @@ public class Sample_G_Analysis {
gardsAnalyses.setScacPath(middleData.getAnalyses_scac_filePath()); gardsAnalyses.setScacPath(middleData.getAnalyses_scac_filePath());
gardsAnalyses.setLogPath(middleData.getAnalyses_LogPath()); gardsAnalyses.setLogPath(middleData.getAnalyses_LogPath());
gardsAnalyses.setReportPath(middleData.getAnalyses_ReportPath()); gardsAnalyses.setReportPath(middleData.getAnalyses_ReportPath());
gardsAnalyses.setCategory((int)middleData.analyses_category); gardsAnalyses.setCategory((int) middleData.analyses_category);
return gardsAnalyses; return gardsAnalyses;
} }

View File

@ -94,7 +94,7 @@ public class RnManGradingConsumer implements StreamListener<String, ObjectRecord
private void consume(Info info) { private void consume(Info info) {
if ("FULL".equals(info.getFullOrPrel())) { if ("FULL".equals(info.getFullOrPrel())) {
//更新台站阈值 //更新台站阈值
rnManService.calculateSingleStationThreshold(info.getStationId()); rnManService.calculateSingleStationThreshold(info);
} }
} }

View File

@ -0,0 +1,82 @@
package org.jeecg.modules.service;
import java.util.List;
import java.util.Map;
public interface IGenerateHtmlReport {
/**
* 生成基础HTML报告
* @param data 报告数据
* @return 生成的HTML字符串
*/
String generateBasicHtmlReport(Map<String, Object> data);
/**
* 生成带样式的HTML报告
* @param data 报告数据
* @param style 自定义CSS样式
* @return 生成的HTML字符串
*/
String generateStyledHtmlReport(Map<String, Object> data, String style);
/**
* 生成HTML报告并保存到文件
* @param data 报告数据
* @param filePath 文件保存路径
* @return 是否保存成功
*/
boolean generateHtmlReportToFile(Map<String, Object> data, String filePath);
/**
* 生成带模板的HTML报告
* @param data 报告数据
* @param templatePath HTML模板路径
* @return 生成的HTML字符串
*/
String generateHtmlReportWithTemplate(Map<String, Object> data, String templatePath);
/**
* 生成带图表和交互功能的HTML报告
* @param data 报告数据
* @param includeCharts 是否包含图表
* @param interactive 是否包含交互功能
* @return 生成的HTML字符串
*/
String generateAdvancedHtmlReport(Map<String, Object> data, boolean includeCharts, boolean interactive);
/**
* 生成多页HTML报告
* @param pagesData 多页数据key为页面名称value为页面数据
* @return 生成的HTML字符串
*/
String generateMultiPageHtmlReport(Map<String, Map<String, Object>> pagesData);
/**
* 生成HTML报告并返回字节数组便于网络传输
* @param data 报告数据
* @return HTML字节数组
*/
byte[] generateHtmlReportAsBytes(Map<String, Object> data);
/**
* 生成带分页功能的HTML报告
* @param data 报告数据
* @param itemsPerPage 每页项目数
* @return 生成的HTML字符串
*/
String generatePaginatedHtmlReport(List<Map<String, Object>> data, int itemsPerPage);
/**
* 生成响应式HTML报告适配不同设备
* @param data 报告数据
* @return 生成的HTML字符串
*/
String generateResponsiveHtmlReport(Map<String, Object> data);
/**
* 生成HTML报告并返回Base64编码便于嵌入
* @param data 报告数据
* @return Base64编码的HTML字符串
*/
String generateHtmlReportAsBase64(Map<String, Object> data);
}

View File

@ -25,7 +25,7 @@ public class RnManGardsThresholdServiceImpl extends ServiceImpl<RnManGardsThresh
* @return List<GardsThresholdResult> GardsThresholdResult * @return List<GardsThresholdResult> GardsThresholdResult
*/ */
@Override @Override
public List<GardsThresholdResult> findThresholdResults(String stationId) { public List<GardsThresholdResult> findThresholdResults(String stationId) {
// 获取未分级样品 // 获取未分级样品
LambdaQueryWrapper<GardsThresholdResult> queryWrapper = new LambdaQueryWrapper<GardsThresholdResult>(); LambdaQueryWrapper<GardsThresholdResult> queryWrapper = new LambdaQueryWrapper<GardsThresholdResult>();
queryWrapper.eq(GardsThresholdResult::getStationId, stationId); queryWrapper.eq(GardsThresholdResult::getStationId, stationId);

View File

@ -9,8 +9,8 @@ import org.jeecg.common.properties.SpectrumPathProperties;
import org.jeecg.common.properties.TaskProperties; import org.jeecg.common.properties.TaskProperties;
import org.jeecg.common.util.oConvertUtils; import org.jeecg.common.util.oConvertUtils;
import org.jeecg.modules.*; import org.jeecg.modules.*;
import org.jeecg.modules.service.IGardsNuclLibService;
import org.jeecg.modules.email.EmailReceivePolicy; import org.jeecg.modules.email.EmailReceivePolicy;
import org.jeecg.modules.service.IGardsNuclLibService;
import org.springframework.boot.CommandLineRunner; import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
@ -76,12 +76,12 @@ public class JeecgAutoProcessApplication extends SpringBootServletInitializer im
} else { } else {
//Linux版本加载dll工具库 //Linux版本加载dll工具库
System.load("/usr/local/jdk/lib/libReadPHDFile.so"); System.load("/usr/local/jdk/lib/libReadPHDFile.so");
System.load("/usr/local/jdk/lib/libGammaAnaly.so"); System.load("/usr/local/jdk/lib/libGammaAnalyALG.so");
} }
nuclLibService.getNuclideMap(); nuclLibService.getNuclideMap();
//根据配置文件配置邮件获取策略定义时间条件默认EmailReceivePolicy.HISTORY_ORDER_RECEIVE.getPolicy() //根据配置文件配置邮件获取策略定义时间条件默认EmailReceivePolicy.HISTORY_ORDER_RECEIVE.getPolicy()
Date systemStartupTime = null; Date systemStartupTime = null;
if(EmailReceivePolicy.CURR_DATE_ORDER_RECEIVE.getPolicy().equals(taskProperties.getReceivePolicy())){ if (EmailReceivePolicy.CURR_DATE_ORDER_RECEIVE.getPolicy().equals(taskProperties.getReceivePolicy())) {
systemStartupTime = new Date(); systemStartupTime = new Date();
} }
//校验临时存储目录是否存在不存在则创建 //校验临时存储目录是否存在不存在则创建
@ -106,13 +106,13 @@ public class JeecgAutoProcessApplication extends SpringBootServletInitializer im
*/ */
private void checkTempStorageDirectory() throws IOException { private void checkTempStorageDirectory() throws IOException {
ApplicationHome home = new ApplicationHome(getClass()); ApplicationHome home = new ApplicationHome(getClass());
File tempStorageDirectory = new File(home.getSource().getParentFile().getAbsolutePath()+File.separator+taskProperties.getTemporaryStoragePath()); File tempStorageDirectory = new File(home.getSource().getParentFile().getAbsolutePath() + File.separator + taskProperties.getTemporaryStoragePath());
if(!tempStorageDirectory.exists() || !tempStorageDirectory.isDirectory()){ if (!tempStorageDirectory.exists() || !tempStorageDirectory.isDirectory()) {
tempStorageDirectory.setReadable(true); tempStorageDirectory.setReadable(true);
tempStorageDirectory.setWritable(true); tempStorageDirectory.setWritable(true);
tempStorageDirectory.mkdir(); tempStorageDirectory.mkdir();
taskProperties.setTemporaryStoragePath(tempStorageDirectory.getAbsolutePath()); taskProperties.setTemporaryStoragePath(tempStorageDirectory.getAbsolutePath());
}else{ } else {
FileUtils.deleteDirectory(tempStorageDirectory); FileUtils.deleteDirectory(tempStorageDirectory);
checkTempStorageDirectory(); checkTempStorageDirectory();
} }
@ -122,12 +122,12 @@ public class JeecgAutoProcessApplication extends SpringBootServletInitializer im
* 校验存储目录是否存在不存在则创建存在无操作 * 校验存储目录是否存在不存在则创建存在无操作
*/ */
private void checkStorageDirectory() { private void checkStorageDirectory() {
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getSaveFilePath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getSaveFilePath());
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getLogPath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getLogPath());
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getUndealPath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getUndealPath());
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getFilesourcePath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getFilesourcePath());
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getEmlPath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getEmlPath());
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getEmlErrorPath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getEmlErrorPath());
FileUtil.mkdir(spectrumPathProperties.getRootPath()+File.separator+spectrumPathProperties.getErrorFilePath()); FileUtil.mkdir(spectrumPathProperties.getRootPath() + File.separator + spectrumPathProperties.getErrorFilePath());
} }
} }

View File

@ -78,6 +78,6 @@ public class JeecgSpectrumAnalysisApplication extends SpringBootServletInitializ
gammaService.readMDCParameter(); gammaService.readMDCParameter();
nuclLibService.getNuclideMap(); nuclLibService.getNuclideMap();
nuclCoincidenceSumSpectrumService.getNuclCoincidenceMap(); nuclCoincidenceSumSpectrumService.getNuclCoincidenceMap();
// dataService.viewStations(); dataService.viewStations();
} }
} }