diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/config/SchemaMappingConfig.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/config/SchemaMappingConfig.java new file mode 100644 index 0000000..e83cf4c --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/config/SchemaMappingConfig.java @@ -0,0 +1,40 @@ +package org.jeecg.config; + +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +@Component +public class SchemaMappingConfig { + + private static final Map SOURCE_SCHEMA_MAP = new HashMap() { + { + put(1, "RNAUTO"); + put(2, "RNMAN"); + put(3, "RMSAUTO"); + put(4, "RMSMAN"); + } + }; + + + /** + * 获取数据库 + * + * @param source 标识 + * @return 数据库名 + */ + public String getSourceSchema(Integer source) { + return SOURCE_SCHEMA_MAP.get(source); + } + + public boolean isValid(Integer source) { + return SOURCE_SCHEMA_MAP.containsKey(source); + } + + public Set getAllSources() { + return SOURCE_SCHEMA_MAP.keySet(); + } + +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java index 2b4ae68..6da7de5 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/controller/DataAnalysisController.java @@ -1,187 +1,148 @@ package org.jeecg.controller; -import com.fasterxml.jackson.core.JsonProcessingException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; +import jakarta.servlet.http.HttpServletResponse; +import jakarta.validation.Valid; +import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.dto.SampleQueryRequestDTO; import org.jeecg.entity.GardsStations; import org.jeecg.entity.SysDefaultNuclide; import org.jeecg.service.ISampleStatAnalysisService; +import org.jeecg.service.impl.ExcelExportService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; + import java.util.Date; import java.util.List; +@Slf4j @RestController @RequestMapping("dataAnalysis") @Api(value = "数据分析", tags = "数据分析") public class DataAnalysisController { @Autowired private ISampleStatAnalysisService sampleStatAnalysisService; + @Autowired + private ExcelExportService excelExportService; /*** 样品监测结果回放 * - * @param sampleType - * @param dataSource - * @param startDate - * @param endDate * @return */ + @AutoLog(value = "样品监测结果回放") @GetMapping("/getSampleMonitorResult") @ApiOperation(value = "样品监测结果回放", notes = "样品监测结果回放") - public Result getSampleMonitorResult(String sampleType, Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, - @RequestParam("endDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { - return sampleStatAnalysisService.getSampleMonitorResult(sampleType, dataSource, startDate, - endDate); + public Result getSampleMonitorResult(@Valid SampleQueryRequestDTO reqDTO) { + return Result.OK( + sampleStatAnalysisService.getSampleMonitorResult(reqDTO)); } /*** 样品统计分析 * - * @param station - * @param dataSource - * @param startDate - * @param endDate * @return */ + @AutoLog(value = "样品统计分析") @GetMapping("/getSampleStatAnalysis") @ApiOperation(value = "样品统计分析", notes = "样品统计分析") - public Result getSampleStatAnalysis(String station, Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, - @RequestParam("endDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { - return sampleStatAnalysisService.getSampleStatAnalysis(station, dataSource, startDate, - endDate); + public Result getSampleStatAnalysis(@Valid SampleQueryRequestDTO reqDTO) { + return Result.OK( + sampleStatAnalysisService.getSampleStatAnalysis(reqDTO)); + //return sampleStatAnalysisService.getSampleStatAnalysis(station, dataSource, startDate, + // endDate); } - + @AutoLog(value = "样品统计分析-核素等级时序分析") @GetMapping("/getNuclideActConcChartData") @ApiOperation(value = "样品统计分析-核素等级时序分析", notes = "样品统计分析-核素等级时序分析") - public Result getNuclideActConcChartData( - @RequestParam(value = "sampleType") String sampleType, - @RequestParam("station") String station, - @RequestParam("nuclideName") String nuclideName, - @RequestParam("dataSource") Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, - @RequestParam("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) - throws JsonProcessingException { - return sampleStatAnalysisService.getNuclideActConcChartData(sampleType, station, - nuclideName, dataSource, startDate, endDate); + public Result getNuclideActConcChartData(@Valid SampleQueryRequestDTO reqDTO) { + + + return Result.OK(sampleStatAnalysisService.getNuclideActConcChartData(reqDTO)); + } /*** 样品等级时序分析 * 样品等级时序分析 - * @param sampleType 样品类型 - * @param station 台站编码 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回样品等级信息 */ + @AutoLog(value = "样品等级时序分析") @GetMapping("/getSampleGradeAnalysis") @ApiOperation(value = "样品等级时序分析", notes = "样品等级时序分析") - public Result getSampleGradeAnalysis(String sampleType, String station, Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate, - @RequestParam("endDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate) { - return sampleStatAnalysisService.getSampleGradeAnalysis(sampleType, station, startDate, - endDate, dataSource); + public Result getSampleGradeAnalysis(@Valid SampleQueryRequestDTO reqDTO) { + return Result.OK( + sampleStatAnalysisService.getSampleGradeAnalysis(reqDTO)); } + /*** 样品活度浓度区间频率分析 * - * @param sampleType 样品类型-颗粒物、气体 - * @param station 台站编码 - * @param nuclideName 核素名称 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回样品获取浓度区间信息 */ + @AutoLog(value = "样品活度浓度区间频率分析") @GetMapping("/getActConcIntvlAnalysis") @ApiOperation(value = "样品活度浓度区间频率分析", notes = "样品活度浓度区间频率分析") - public Result getSampleActConcIntvlAnalysis(String sampleType, String station, - String nuclideName, Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") - Date startDate, - @RequestParam("endDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") - Date endDate) { - return sampleStatAnalysisService.getSampleActConcIntvlAnalysis(sampleType, station, - nuclideName, dataSource, startDate, endDate); + public Result getSampleActConcIntvlAnalysis(@Valid SampleQueryRequestDTO reqDTO) { + return Result.OK( + sampleStatAnalysisService.getSampleActConcIntvlAnalysis(reqDTO)); + } /*** 样品活度浓度时序分析 * - * @param sampleType 样品类型-颗粒物、气体 - * @param station 台站编码 - * @param nuclideName 核素名称 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回样品获取浓度时序信息 */ + @AutoLog(value = "样品活度浓度时序分析") @GetMapping("/getActConcTimeSeqAnalysis") @ApiOperation(value = "样品活度浓度时序分析", notes = "样品活度浓度时序分析") - public Result getSampleActConcTimeSeqAnalysis(String sampleType, String station, - String nuclideName, Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") - Date startDate, - @RequestParam("endDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") - Date endDate) throws JsonProcessingException { - return sampleStatAnalysisService.getNuclideActConcChartData(sampleType, station, - nuclideName, dataSource, startDate, endDate); + public Result getSampleActConcTimeSeqAnalysis(@Valid SampleQueryRequestDTO reqDTO) { + return Result.OK(sampleStatAnalysisService.getNuclideActConcChartData(reqDTO)); } + /*** 核素活度浓度对比分析 * - * @param sampleType - * @param stationIds - * @param nuclideName - * @param dataSource - * @param startDate - * @param endDate * @return */ + @AutoLog(value = "样品活度浓度时序分析") @GetMapping("/getNuclideActivityConcAnalyze") @ApiOperation(value = "核素活度浓度对比分析", notes = "核素活度浓度对比分析") - public Result getNuclideActivityConcAnalyze(String sampleType, Integer[] stationIds, - String nuclideName, Integer dataSource, - @RequestParam("startDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") - Date startDate, - @RequestParam("endDate") - @DateTimeFormat(pattern = "yyyy-MM-dd") - Date endDate) { - return sampleStatAnalysisService.getNuclideActivityConcAnalyze(sampleType, stationIds, - nuclideName, dataSource, startDate, endDate); + public Result getNuclideActivityConcAnalyze(@Valid SampleQueryRequestDTO reqDTO) { + return Result.OK( + sampleStatAnalysisService.getNuclideActivityConcAnalyze(reqDTO)); } + @AutoLog(value = "导出数据") + @GetMapping("/exportData") + public void exportData(@RequestParam("type") String type, @Valid SampleQueryRequestDTO reqDTO,HttpServletResponse response) { + try { + excelExportService.exportSingle(type, reqDTO, response); + } catch (Exception e) { + log.error("导出失败, type={}", type, e); + } + } + + @AutoLog(value = "获取台站信息") @GetMapping("/findStationList") - public Result findStationList(String systemType) { + public Result findStationList(@RequestParam("systemType") String systemType, @RequestParam("dataSource") Integer dataSource) { List gardsStations = - sampleStatAnalysisService.findStationListByMenuName(systemType); + sampleStatAnalysisService.findStationListByMenuName(systemType, dataSource); return Result.OK(gardsStations); } + @AutoLog(value = "获取核素信息") @GetMapping("/findNuclideList") - public Result findNuclideList(String systemType) { + public Result findNuclideList(@RequestParam("systemType") String systemType) { List defaultNuclides = sampleStatAnalysisService.findNuclideList(systemType); return Result.OK(defaultNuclides); diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/dto/SampleQueryRequestDTO.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/dto/SampleQueryRequestDTO.java new file mode 100644 index 0000000..3b3a199 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/dto/SampleQueryRequestDTO.java @@ -0,0 +1,22 @@ +package org.jeecg.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +@Data +public class SampleQueryRequestDTO { + private String sampleType; + private List stationIds; + private String nuclideName; + private Integer dataSource; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date startDate; + @DateTimeFormat(pattern = "yyyy-MM-dd") + private Date endDate; +} \ No newline at end of file diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/ExportType.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/ExportType.java new file mode 100644 index 0000000..c9a637e --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/ExportType.java @@ -0,0 +1,24 @@ +package org.jeecg.entity; + +public final class ExportType { + + private ExportType() {} + + /** 样品等级时序分析 */ + public static final String SAMPLE_LEVEL_TIME = "sampleLevelTime"; + + /** 样品统计分析 */ + public static final String SAMPLE_STAT = "sampleStat"; + + /** 样品活度浓度区间频率分析 */ + public static final String SAMPLE_RANGE_FREQ = "sampleRangeFreq"; + + /** 核素活度浓度时序分析 */ + public static final String NUCLIDE_TIME = "nuclideTime"; + + /** 核素活度浓度对比分析 */ + public static final String NUCLIDE_COMPARE = "nuclideCompare"; + + /** 全部类型 */ + public static final String ALL = "all"; +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java index fc71412..cb5f7be 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/entity/SampleLevelData.java @@ -13,6 +13,9 @@ public class SampleLevelData { * 样品ID */ private Integer sampleId; + + + private String stationId; /** 收集停止时间 * */ diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java index b3be03f..99d609e 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/GardsSampleStatAnalysisMapper.java @@ -5,281 +5,150 @@ import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.jeecg.entity.*; import org.jeecg.modules.base.entity.original.GardsSampleData; +import org.jeecg.vo.NuclideActConcRawVO; +import org.jeecg.vo.SampleStatExcelVO; +import java.util.Date; import java.util.List; @Mapper public interface GardsSampleStatAnalysisMapper extends BaseMapper { - List getSampleStatAnalysis(String station, String startDate, String endDate); - - List selectByStationIds(@Param("stationIds") List stationIds, - @Param("startTime") String startTime, - @Param("endTime") String endTime); //region 样品等级时序分析 - - - List getSampleGradeAnalysis(String sampleType, String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime, - Integer dataSource); - - List getRnAutoSampleGradeAnalysis(String sampleType, String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - List getRnManSampleGradeAnalysis(String sampleType, String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - + List getSampleGradeAnalysis( + @Param("sampleType") String sampleType, + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime, + @Param("dsType") String dsType); List getIdentifiedNuclides(@Param("schemaName") String schemaName, @Param("nuclideName") String nuclideName, - String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); - - //endregion - - /*** 获取样品类型P中元素的浓度活度、MDC信息 - * 获取样品中元素的浓度活度、MDC信息 - * @param station 台站编码 - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return 返回List - */ - List getSamplePNuclideActConcIntvl(String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - //region 获取样品的级别和阈值 - - List getRnAutoSampleLevel(String station, @Param("startTime") String startTime, - @Param("endTime") String endTime); - - List getRnManSampleLevel(String station, @Param("startTime") String startTime, - @Param("endTime") String endTime); - - - List getNuclideTimeSeriesAnalysis(@Param("schemaName") String schemaName, - @Param("station") String station, + List getRMSIdentifiedNuclides(@Param("schemaName") String schemaName, @Param("nuclideName") String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); //endregion - + List getNuclideTimeSeriesAnalysis(@Param("schemaName") String schemaName, + @Param("stations") List stations, + @Param("nuclideName") String nuclideName, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + //endregion //region RNAUTO 获取样品中元素的浓度活度、MDC信息 - /*** 获取样品中元素的浓度活度、MDC信息 - * 查询RNAUTO.GARDS_NUCL_IDED中的活度浓度、MDC信息 - * @param station 台站编码 - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return 返回List - */ - List getRnautoPNuclideActConcIntvl(String sampleType, String station, - String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - /*** 获取样品中元素的浓度活度、MDC信息 - * 查询RNAUTO.GARDS_XE_RESULTS中的活度浓度、MDC信息 - * @param station - * @param startTime - * @param endTime - * @return - */ - List getRnautoNuclideActConcIntvl(String sampleType, String station, - String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - /** + * 样品活度浓度区间频率分析 + * 获取样品中元素的浓度活度、MDC信息 * - * @param schemaName - * @return + * @param schemaName 模式名” + * @param sampleType 样品类型 + * @param stations 台站 + * @param nuclideName 核素名称 + * @param startTime 开始时间 + * @param endTime 结束时间 + * @return List */ - ListgetNuclideActConcIntvl(@Param("schemaName") String schemaName); - - + List getNuclideActConcIntvl(@Param("schemaName") String schemaName, + @Param("sampleType") String sampleType, + @Param("stations") List stations, + @Param("nuclideName") String nuclideName, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + List getRMSNuclideActConcIntvl(@Param("schemaName") String schemaName, + @Param("sampleType") String sampleType, + @Param("stations") List stations, + @Param("nuclideName") String nuclideName, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); //endregion - - //region RNMAN 获取样品中元素的浓度活度、MDC信息 - - /*** 获取样品中元素的浓度活度、MDC信息 - * 查询RNAUTO.GARDS_NUCL_IDED中的活度浓度、MDC信息 - * @param station 台站编码 - * @param startTime 开始时间 - * @param endTime 结束时间 - * @return 返回List - */ - List getRnmanPNuclideActConcIntvl(String sampleType, String station, - String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - /*** 获取样品中元素的浓度活度、MDC信息 - * 查询RNAUTO.GARDS_XE_RESULTS中的活度浓度、MDC信息 - * @param station - * @param startTime - * @param endTime - * @return - */ - List getRnmanNuclideActConcIntvl(String sampleType, String station, - String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - //endregion - //region 样品统计分析 /** * RnAuto--获取样品中识别到的核素集合 */ - - List getRnAutoIdentifiedNuclides(String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - /** - * RnAuto-- 核素等级时序分析 - */ - - List getRnAutoNuclideTimeSeriesAnalysis(String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - /** - * RnMan--获取样品中识别到的核素集合 - */ - List getRnManIdentifiedNuclides(String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - /** - * RnMan--核素等级时序分析 - * - * @return List - */ - List getRnManNuclideTimeSeriesAnalysis(String station, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - - /** - * 精确查询(单个站点 + 单个核素) - * - * @param stationId 站点ID (必填) - * @param nuclideName 核素名称 (必填) - * @return 匹配的记录列表 - */ - List selectByStationAndNuclide( + List getSampleNuclides( + @Param("dbType") String dbType, @Param("schemaName") String schemaName, - @Param("stationId") Integer stationId, + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + + List getSampleStatPData(@Param("schemaName") String schemaName, + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + + List getSampleStatBData(@Param("schemaName") String schemaName, + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + + + List getIdentifiedNuclidesBatch( + @Param("schema") String schema, @Param("nuclideName") String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime - ); - - /** - * 多站点 + 多核素查询 - * - * @param stationIds 站点ID集合 (非空) - * @param nuclideNames 核素名称集合 (非空) - * @return 匹配的记录列表 - */ - List selectByStationsAndNuclides( - @Param("schemaName") String schemaName, - @Param("stationIds") List stationIds, - @Param("nuclideNames") List nuclideNames, - @Param("startTime") String startTime, - @Param("endTime") String endTime - ); - - /** - * 多站点 + 单核素查询 - * - * @param stationIds 站点ID集合 (非空) - * @param nuclideName 单个核素名称 (必填) - * @return 匹配的记录列表 - */ - List selectByStationsAndNuclide( - @Param("schemaName") String schemaName, - @Param("stationIds") List stationIds, - @Param("nuclideName") String nuclideName, - @Param("startTime") String startTime, - @Param("endTime") String endTime - ); - - /** - * 单站点 + 多核素查询 - * - * @param stationId 单个站点ID (必填) - * @param nuclideNames 核素名称集合 (非空) - * @return 匹配的记录列表 - */ - List selectByStationAndNuclides( - @Param("schemaName") String schemaName, - @Param("stationId") Integer stationId, - @Param("nuclideNames") List nuclideNames, - @Param("startTime") String startTime, - @Param("endTime") String endTime - - ); - - /** - * 动态条件查询(所有参数均可为空) - * - * @param stationIds 站点ID集合 (可选) - * @param nuclideNames 核素名称集合 (可选) - * @param startTime 开始时间 (可选) - * @param endTime 结束时间 (可选) - * @return 匹配的记录列表 - */ - List selectByCondition( - @Param("schemaName") String schemaName, - @Param("stationIds") List stationIds, - @Param("nuclideNames") List nuclideNames, - @Param("startTime") String startTime, - @Param("endTime") String endTime - ); + @Param("stations") List stations, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); //endregion - //region 核素活度浓度对比分析 List getRnAutoAnalyzeNuclideActivityConc( @Param("sampleType") String sampleType, @Param("nuclideName") String nuclideName, - @Param("stationIds") Integer[] stationIds, @Param("startTime") String startTime, - @Param("endTime") String endTime); + @Param("stations") List stations, @Param("startTime") Date startTime, + @Param("endTime") Date endTime); List getRnManAnalyzeNuclideActivityConc( @Param("sampleType") String sampleType, @Param("nuclideName") String nuclideName, - @Param("stationIds") Integer[] stationIds, @Param("startTime") String startTime, - @Param("endTime") String endTime); + @Param("stations") List stations, @Param("startTime") Date startTime, + @Param("endTime") Date endTime); + + List getRnAnalyzeNuclideActivityConc( + @Param("schemaName") String schemaName, @Param("sampleType") String sampleType, + @Param("nuclideName") String nuclideName, @Param("stations") List stations, + @Param("startTime") Date startTime,@Param("endTime") Date endTime); + + List getRMSAnalyzeNuclideActivityConc( + @Param("schemaName") String schemaName, @Param("sampleType") String sampleType, + @Param("nuclideName") String nuclideName,@Param("stations") List stations, + @Param("startTime") Date startTime, @Param("endTime") Date endTime); //endregion //region 样品监测结果 List getRnAutoSampleResult(String sampleType, - @Param("startTime") String startTime, - @Param("endTime") String endTime); + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); List getRnManSampleResult(String sampleType, - @Param("startTime") String startTime, - @Param("endTime") String endTime); - - + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); //endregion //region 查询台站信息 List findStationListByMenuName(@Param("systemType") String systemType); + List findRMSStationListByMenuName(@Param("systemType") String systemType); //endregion + + + /** + * 查询各站点核素的活度浓度(用于区间频率分析) + */ + List getNuclideActConcList( + @Param("schema") String schema, + @Param("stations") List stations, + @Param("sampleType") String sampleType, + @Param("startTime") Date startTime, + @Param("endTime") Date endTime); } diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml index c8e6f1e..4982908 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/mapper/xml/GardsSampleStatAnalysisMapper.xml @@ -8,10 +8,11 @@ GRADING FROM ORIGINAL.GARDS_SAMPLE_DATA WHERE STATION_CODE = #{ stationCode } - AND ACQUISITION_START BETWEEN TO_DATE(#{ startTime }, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{ endTime }, 'YYYY-MM-DD HH24:MI:SS') + AND ACQUISITION_START BETWEEN #{ startTime } + AND #{ endTime } ORDER BY ACQUISITION_START + - SELECT t1.SAMPLE_ID, - t1.COLLECT_STOP, - t1.STATION_ID, - t2.CATEGORY - FROM ORIGINAL.GARDS_SAMPLE_DATA t1 - LEFT JOIN RNAUTO.GARDS_ANALYSES t2 - ON t1.SAMPLE_ID = t2.SAMPLE_ID - WHERE t1.STATION_ID = #{station} - AND t1.SAMPLE_TYPE = #{sampleType} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') - - - - - - - - @@ -134,10 +122,128 @@ WHERE a.SAMPLE_TYPE = #{sampleType} AND a.STATION_ID = #{station} AND b.NUCLIDE_NAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + AND a.COLLECT_START BETWEEN #{startTime} + AND #{endTime} + + + @@ -158,8 +264,8 @@ WHERE a.SAMPLE_TYPE = #{sampleType} AND a.STATION_ID = #{station} AND b.NUCLIDE_NAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + AND a.COLLECT_START BETWEEN #{startTime} + AND #{endTime} @@ -177,11 +283,11 @@ INNER JOIN RNMAN.GARDS_XE_RESULTS b ON a.SAMPLE_ID = b.SAMPLE_ID - WHERE a.SAMPLE_TYPE = '#{sampleType}' + WHERE a.SAMPLE_TYPE = #{sampleType} AND a.STATION_ID = #{station} AND b.NUCLIDENAME = #{nuclideName} - AND a.COLLECT_START BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + AND a.COLLECT_START BETWEEN #{startTime} + AND #{endTime} @@ -189,115 +295,341 @@ - + SELECT * + FROM (SELECT t1.SAMPLE_ID AS sampleId, + t1.COLLECT_STOP AS collectStop, + t1.SAMPLE_TYPE AS sampleType, + t1.STATION_ID AS stationId, + t1.STATUS AS status, + COALESCE(s1.category, 0) AS category, + t2.NUCLIDENAME AS nuclideName, + CAST(REGEXP_REPLACE(t2.CONCENTRATION, '[^0-9.Ee-]', '') AS BINARY_DOUBLE) AS conc, + 0 as concErr, + CAST(REGEXP_REPLACE(t2.MDC, '[^0-9.Ee-]', '') AS BINARY_DOUBLE) AS mdc + FROM ORIGINAL.GARDS_SAMPLE_DATA t1 + LEFT JOIN ${schemaName}.GARDS_ANALYSES s1 ON t1.SAMPLE_ID = s1.SAMPLE_ID + INNER JOIN ${schemaName}.GARDS_NUCL_IDED t2 ON t1.SAMPLE_ID = t2.SAMPLE_ID + WHERE t1.STATION_ID = #{station} + AND t1.STATUS != 'F' + AND t1.COLLECT_STOP >= #{startTime} + AND t1.COLLECT_STOP + < #{endTime} - UNION ALL + UNION ALL - - SELECT - t1.SAMPLE_ID AS sampleId, - t1.COLLECT_STOP AS collectStop, - t1.SAMPLE_TYPE AS sampleType, - t1.STATION_ID AS stationId, - t1.STATUS AS status, - COALESCE(s1.category, 0) AS category, - t3.NUCLIDE_NAME AS nuclideName, - t3.CONC AS conc, - t3.CONC_ERR as concErr, - t3.MDC AS mdc - FROM ORIGINAL.GARDS_SAMPLE_DATA t1 - LEFT JOIN RNAUTO.GARDS_ANALYSES s1 ON t1.SAMPLE_ID = s1.SAMPLE_ID - INNER JOIN RNAUTO.GARDS_XE_RESULTS t3 ON t1.SAMPLE_ID = t3.SAMPLE_ID - WHERE t1.STATION_ID = #{station} - AND t1.STATUS != 'F' - AND t1.COLLECT_STOP >= TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND t1.COLLECT_STOP < TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') - AND t1.SAMPLE_TYPE = 'B' - ) t + SELECT + t1.SAMPLE_ID AS sampleId, t1.COLLECT_STOP AS collectStop, t1.SAMPLE_TYPE AS sampleType, t1.STATION_ID AS stationId, t1.STATUS AS status, COALESCE (s1.category, 0) AS category, t3.NUCLIDE_NAME AS nuclideName, t3.CONC AS conc, t3.CONC_ERR as concErr, t3.MDC AS mdc + FROM ORIGINAL.GARDS_SAMPLE_DATA t1 + LEFT JOIN ${schemaName}.GARDS_ANALYSES s1 + ON t1.SAMPLE_ID = s1.SAMPLE_ID + INNER JOIN ${schemaName}.GARDS_XE_RESULTS t3 ON t1.SAMPLE_ID = t3.SAMPLE_ID + WHERE t1.STATION_ID = #{station} + AND t1.STATUS != 'F' + AND t1.COLLECT_STOP >=#{startTime} + AND t1.COLLECT_STOP + < #{endTime}) t ORDER BY collectStop DESC + + + + + + + + + + + + + + + + @@ -310,17 +642,17 @@ RNAUTO.GARDS_ANALYSES B ON A.SAMPLE_ID = B.SAMPLE_ID WHERE A.STATION_ID = #{station} - AND A.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + AND A.COLLECT_STOP BETWEEN #{startTime} + AND #{endTime} @@ -384,10 +716,8 @@ AND t1.SAMPLE_ID = t3.SAMPLE_ID WHERE t1.STATION_ID = #{station} AND t1.STATUS != 'F' - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime} - , 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime} - , 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{startTime} + AND #{endTime} @@ -468,10 +797,10 @@ - AND CALCULATION_TIME > TO_DATE(#{ startTime }, 'YYYY-MM-DD HH24:MI:SS') + AND CALCULATION_TIME > #{ startTime } - AND CALCULATION_TIME < TO_DATE(#{ endTime }, 'YYYY-MM-DD HH24:MI:SS') + AND CALCULATION_TIME < #{ endTime } ORDER BY CALCULATION_TIME DESC @@ -506,8 +835,8 @@ AND t1.SAMPLE_TYPE=#{sampleType} AND t2.NUCLIDENAME = #{nuclideName} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{ startTime }, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{ endTime }, 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{ startTime } + AND #{ endTime } @@ -535,8 +864,8 @@ AND t1.SAMPLE_TYPE=#{sampleType} AND t3.NUCLIDE_NAME = #{nuclideName} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{ startTime }, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{ endTime }, 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{ startTime } + AND #{ endTime } @@ -571,8 +900,8 @@ AND t1.SAMPLE_TYPE=#{sampleType} AND t2.NUCLIDENAME = #{nuclideName} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{ startTime }, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{ endTime }, 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{ startTime } + AND #{ endTime } @@ -600,13 +929,123 @@ AND t1.SAMPLE_TYPE=#{sampleType} AND t3.NUCLIDE_NAME = #{nuclideName} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{ startTime }, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{ endTime }, 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{ startTime } + AND #{ endTime } + + + + + + + + @@ -629,8 +1068,8 @@ LEFT JOIN CONFIGURATION.GARDS_STATIONS c1 ON t1.STATION_ID = c1.STATION_ID WHERE t1.SAMPLE_TYPE = #{sampleType} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{startTime} + AND #{endTime} ORDER BY t1.COLLECT_STOP ASC @@ -653,8 +1092,8 @@ LEFT JOIN CONFIGURATION.GARDS_STATIONS c1 ON t1.STATION_ID = c1.STATION_ID WHERE t1.SAMPLE_TYPE = #{sampleType} - AND t1.COLLECT_STOP BETWEEN TO_DATE(#{startTime}, 'YYYY-MM-DD HH24:MI:SS') - AND TO_DATE(#{endTime}, 'YYYY-MM-DD HH24:MI:SS') + AND t1.COLLECT_STOP BETWEEN #{startTime} + AND #{endTime} ORDER BY t1.COLLECT_STOP ASC @@ -669,6 +1108,42 @@ ('SAUNA', 'ARIX-4', 'ARIX-2', 'SPALAX') - + + + + + + + + \ No newline at end of file diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ExportHandler.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ExportHandler.java new file mode 100644 index 0000000..6b2c681 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ExportHandler.java @@ -0,0 +1,23 @@ +package org.jeecg.service; + +import org.jeecg.dto.SampleQueryRequestDTO; + +import java.util.List; + +/** + * 导出处理器接口 —— 每种数据类型实现一个 + */ +public interface ExportHandler { + + /** 数据类型标识 */ + String getType(); + + /** Sheet 名称 */ + String getSheetName(); + + /** 查询数据 */ + List queryData(SampleQueryRequestDTO reqDTO); + + /** 返回 VO 的 Class */ + Class getExcelClass(); +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java index f871cdb..adf282b 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/ISampleStatAnalysisService.java @@ -3,40 +3,35 @@ package org.jeecg.service; import com.baomidou.mybatisplus.extension.service.IService; import com.fasterxml.jackson.core.JsonProcessingException; import org.jeecg.common.api.vo.Result; +import org.jeecg.dto.SampleQueryRequestDTO; import org.jeecg.entity.GardsStations; +import org.jeecg.entity.SampleLevelData; import org.jeecg.entity.SysDefaultNuclide; import org.jeecg.modules.base.entity.original.GardsSampleData; +import org.jeecg.vo.SampleStatExcelVO; import org.springframework.format.annotation.DateTimeFormat; import org.springframework.web.bind.annotation.RequestParam; import java.util.Date; import java.util.List; +import java.util.Map; public interface ISampleStatAnalysisService extends IService { - Result getSampleMonitorResult(String sampleType, Integer dataSource, Date startDate, Date endDate); + Map getSampleMonitorResult(SampleQueryRequestDTO reqDTO); /*** 样品统计分析 * 样品统计分析 - * @param station - * @param startDate - * @param endDate * @return */ - Result getSampleStatAnalysis(String station, Integer dataSource, Date startDate, Date endDate); - + Map getSampleStatAnalysis(SampleQueryRequestDTO reqDTO); + List getSampleStatData(SampleQueryRequestDTO reqDTO); /** * 样品统计分析--核素浓度时序分析 - * @param sampleType - * @param stationCode - * @param nuclideName - * @param dataSource - * @param startDate - * @param endDate + * * @return */ - Result getNuclideActConcChartData (String sampleType,String stationCode, String nuclideName,Integer dataSource, Date startDate, Date endDate) throws JsonProcessingException; - + Map getNuclideActConcChartData(SampleQueryRequestDTO reqDTO); /** @@ -44,54 +39,40 @@ public interface ISampleStatAnalysisService extends IService { * * */ - Result getSampleGradeAnalysis(String sampleType, String station, Date startDate, Date endDate, Integer dataSource); + Map getSampleGradeAnalysis(SampleQueryRequestDTO reqDTO); + + List getSampleGradeAnalysisData(SampleQueryRequestDTO reqDTO); /*** 样品活度浓度区间频率分析 * 样品活度浓度区间频率分析 - * @param sampleType 样品类型 - * @param station 台站编码 - * @param nuclideName 核素名称 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回样品活度浓度区间信息 */ - Result getSampleActConcIntvlAnalysis(String sampleType, String station, String nuclideName, Integer dataSource, Date startDate, Date endDate); + Map getSampleActConcIntvlAnalysis(SampleQueryRequestDTO reqDTO); /*** 核素活度浓度时序分析 * 核素活度浓度时序分析 - * @param sampleType 样品类型 - * @param station 台站编码 - * @param nuclideName 核素名 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回核素活度浓度信息 */ - Result getSampleActConcTimeSeqAnalysis(String sampleType, String station, String nuclideName, Integer dataSource, Date startDate, Date endDate); + Result getSampleActConcTimeSeqAnalysis(SampleQueryRequestDTO reqDTO); /*** 核素活度浓度对比分析 * 核素活度浓度对比分析 - * @param sampleType 样品类型 - * @param stationIds 台站ID集合 - * @param nuclideName 核素名 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return */ - Result getNuclideActivityConcAnalyze(String sampleType, Integer[] stationIds, String nuclideName, Integer dataSource, Date startDate, Date endDate); + Map getNuclideActivityConcAnalyze(SampleQueryRequestDTO reqDTO); /** * 查询台站信息 + * * @param systemType * @return */ - List findStationListByMenuName(String systemType); + List findStationListByMenuName(String systemType,Integer dataSource); /** * 查询核素信息 + * * @param systemType * @return */ diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/ExcelExportService.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/ExcelExportService.java new file mode 100644 index 0000000..9ed4b1d --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/ExcelExportService.java @@ -0,0 +1,58 @@ +package org.jeecg.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import jakarta.servlet.http.HttpServletResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Workbook; +import org.jeecg.dto.SampleQueryRequestDTO; +import org.jeecg.service.ExportHandler; +import org.jeecgframework.poi.excel.ExcelExportUtil; +import org.jeecgframework.poi.excel.entity.ExportParams; +import org.jeecgframework.poi.excel.entity.enmus.ExcelType; +import org.springframework.stereotype.Service; + +import java.io.IOException; +import java.net.URLEncoder; +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ExcelExportService { + private final ExportHandlerRegistry registry; + + /** + * 单类型导出 + * + * @param type 导出类型 + * @param reqDTO 请求实体 + * @param response 响应 + */ + public void exportSingle(String type, SampleQueryRequestDTO reqDTO, HttpServletResponse response) throws + IOException { + ExportHandler handler = registry.getHandler(type); + + List data = handler.queryData(reqDTO); + if (CollectionUtils.isEmpty(data)) { + throw new IOException("暂无导出数据"); + } + ExportParams params = new ExportParams(handler.getSheetName(), handler.getSheetName(), ExcelType.XSSF); + + Workbook workbook = ExcelExportUtil.exportExcel(params,handler.getExcelClass(), data); + + download(workbook, handler.getSheetName(), response); + } + + private void download(Workbook workbook, + String fileName, + HttpServletResponse response) throws IOException { + response.setContentType( + "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); + response.setCharacterEncoding("UTF-8"); + response.setHeader("Content-Disposition", + "attachment;filename*=utf-8''" + + URLEncoder.encode(fileName, "UTF-8").replaceAll("\\+", "%20") + ".xlsx"); + workbook.write(response.getOutputStream()); + } +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/ExportHandlerRegistry.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/ExportHandlerRegistry.java new file mode 100644 index 0000000..60cd68e --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/ExportHandlerRegistry.java @@ -0,0 +1,43 @@ +package org.jeecg.service.impl; + +import org.jeecg.service.ExportHandler; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class ExportHandlerRegistry { + private final Map handlerMap = new HashMap(); + + @Autowired + public ExportHandlerRegistry(List handlers) { + handlers.forEach(handler -> { + handlerMap.put(handler.getType(), handler); + }); + } + + /** + * 获取指定类型的处理类 + */ + public ExportHandler getHandler(String type) { + ExportHandler exportHandler = handlerMap.get(type); + if (exportHandler == null) { + throw new IllegalArgumentException("不支持的导出类型: " + type); + } + return exportHandler; + } + + /** + * 获取全部处理类 + * @return ExportHandler集合 + */ + public Collection getHandlers() { + return handlerMap.values(); + } + + +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/NuclideCompareExportHandler.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/NuclideCompareExportHandler.java new file mode 100644 index 0000000..9a07434 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/NuclideCompareExportHandler.java @@ -0,0 +1,37 @@ +package org.jeecg.service.impl; + +import org.jeecg.dto.SampleQueryRequestDTO; +import org.jeecg.entity.ExportType; +import org.jeecg.service.ExportHandler; +import org.jeecg.vo.NuclideCompareExcelVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class NuclideCompareExportHandler implements ExportHandler { + + @Autowired + private SampleStatAnalysisService sampleStatAnalysisService; + + @Override + public String getType() { + return ExportType.NUCLIDE_COMPARE; + } + + @Override + public String getSheetName() { + return "核素对比分析"; + } + + @Override + public Class getExcelClass() { + return NuclideCompareExcelVO.class; + } + + @Override + public List queryData(SampleQueryRequestDTO reqDTO) { + return sampleStatAnalysisService.getNuclideCompareExportData(reqDTO); + } +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/NuclideTimeExportHandler.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/NuclideTimeExportHandler.java new file mode 100644 index 0000000..98abf88 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/NuclideTimeExportHandler.java @@ -0,0 +1,37 @@ +package org.jeecg.service.impl; + +import org.jeecg.dto.SampleQueryRequestDTO; +import org.jeecg.entity.ExportType; +import org.jeecg.service.ExportHandler; +import org.jeecg.vo.NuclideTimeExcelVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class NuclideTimeExportHandler implements ExportHandler { + + @Autowired + private SampleStatAnalysisService sampleStatAnalysisService; + + @Override + public String getType() { + return ExportType.NUCLIDE_TIME; + } + + @Override + public String getSheetName() { + return "核素时序分析"; + } + + @Override + public Class getExcelClass() { + return NuclideTimeExcelVO.class; + } + + @Override + public List queryData(SampleQueryRequestDTO reqDTO) { + return sampleStatAnalysisService.getNuclideActConcExportData(reqDTO); + } +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleAnalysisExportHandler.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleAnalysisExportHandler.java new file mode 100644 index 0000000..105ec99 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleAnalysisExportHandler.java @@ -0,0 +1,52 @@ +package org.jeecg.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.jeecg.dto.SampleQueryRequestDTO; +import org.jeecg.entity.ExportType; +import org.jeecg.entity.SampleLevelData; +import org.jeecg.service.ExportHandler; +import org.jeecg.service.ISampleStatAnalysisService; +import org.jeecg.vo.SampleAnalysisExcelVO; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; +import java.util.stream.Collectors; + +@Component +public class SampleAnalysisExportHandler implements ExportHandler { + @Autowired + private ISampleStatAnalysisService sampleStatAnalysisService; + + @Override + public String getType() { + return ExportType.SAMPLE_LEVEL_TIME; + } + + @Override + public String getSheetName() { + return "样品等级时序分析"; + } + + @Override + public List queryData(SampleQueryRequestDTO reqDTO) { + List dataList = + sampleStatAnalysisService.getSampleGradeAnalysisData(reqDTO); + if (CollectionUtils.isEmpty(dataList)) { + return Collections.emptyList(); + } + + return dataList.stream().map(data -> { + SampleAnalysisExcelVO vo = new SampleAnalysisExcelVO(); + BeanUtils.copyProperties(data, vo); + return vo; + }).collect(Collectors.toList()); + } + + @Override + public Class getExcelClass() { + return SampleAnalysisExcelVO.class; + } +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleRangeFreqExportHandler.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleRangeFreqExportHandler.java new file mode 100644 index 0000000..70245bc --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleRangeFreqExportHandler.java @@ -0,0 +1,39 @@ +package org.jeecg.service.impl; + +import org.jeecg.dto.SampleQueryRequestDTO; +import org.jeecg.entity.ExportType; +import org.jeecg.service.ExportHandler; +import org.jeecg.vo.SampleRangeFreqExcelVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.List; + +@Component +public class SampleRangeFreqExportHandler implements ExportHandler { + + @Autowired + private SampleStatAnalysisService sampleStatAnalysisService; + + @Override + public String getType() { + return ExportType.SAMPLE_RANGE_FREQ; + } + + @Override + public String getSheetName() { + return "浓度区间频率"; + } + + @Override + public Class getExcelClass() { + return SampleRangeFreqExcelVO.class; + } + + @Override + public List queryData(SampleQueryRequestDTO reqDTO) { + return sampleStatAnalysisService.getSampleRangeFreqExportData(reqDTO, + null // 区间宽度,默认 10 + ); + } +} diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java index d75736e..ddcd664 100644 --- a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatAnalysisService.java @@ -1,34 +1,32 @@ package org.jeecg.service.impl; import com.baomidou.dynamic.datasource.annotation.DS; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.core.type.TypeReference; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.api.vo.Result; import org.jeecg.common.constant.CommonConstant; import org.jeecg.common.util.DateUtils; -import org.jeecg.common.util.RedisUtil; +import org.jeecg.config.SchemaMappingConfig; +import org.jeecg.dto.SampleQueryRequestDTO; import org.jeecg.entity.*; import org.jeecg.mapper.SysDefaultNuclideMapper; import org.jeecg.modules.base.entity.original.GardsSampleData; import org.jeecg.mapper.GardsSampleStatAnalysisMapper; import org.jeecg.service.ISampleStatAnalysisService; import org.jeecg.util.DistributionAnalysisToolkit; -import org.jeecg.vo.NuclideActConcIntvlVO; -import org.jeecg.vo.NuclideDynamicChartDTO; -import org.jeecg.vo.StationInfoVO; +import org.jeecg.vo.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.text.SimpleDateFormat; +import java.time.LocalDateTime; import java.time.ZoneId; import java.time.format.DateTimeFormatter; import java.util.*; -import java.util.stream.Collector; import java.util.stream.Collectors; @Slf4j @@ -38,6 +36,8 @@ public class SampleStatAnalysisService extends ServiceImpl implements ISampleStatAnalysisService { private static final SimpleDateFormat SDF = new SimpleDateFormat("yyyy-MM-dd"); + private static final String UNIT_PARTICULATE = "μBq/m³"; + private static final String UNIT_GAS = "mBq/m³"; // 动态颜色调色板(台站动态时自动循环) private static final String[] DETECTION_COLORS = { "#0066ff", "#ff0000", "#ff00ff", "#00ffff", "#ffff00", "#ff9900", "#99ff00", "#9900ff" @@ -46,50 +46,29 @@ public class SampleStatAnalysisService "#aaaa00", "#ff6666", "#ff99ff", "#66ffff", "#cccc00", "#ffcc66", "#ccff66", "#cc99ff" }; - @Autowired - private RedisUtil redisUtil; @Autowired private SysDefaultNuclideMapper defaultNuclideMapper; + @Autowired + private SchemaMappingConfig _schemaMap; - public Result getSampleMonitorResult(String sampleType, Integer dataSource, Date startDate, - Date endDate) { - Result result = new Result(); + public Map getSampleMonitorResult(SampleQueryRequestDTO reqDTO) { try { - result.setCode(CommonConstant.SC_OK_200); //声明返回用的结果map Map resultMap = new HashMap<>(); - List stationInfoDataList = new ArrayList<>(); - + List stationInfoDataList; //region 局部变量 - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; + //endregion - - switch (dataSource) { - case 1: - stationInfoDataList = - this.baseMapper.getRnAutoSampleResult(sampleType, startTime, endTime); - break; - case 2: - stationInfoDataList = - this.baseMapper.getRnManSampleResult(sampleType, startTime, endTime); - - break; - default: - stationInfoDataList = new ArrayList<>(); - } + stationInfoDataList = switch (reqDTO.getDataSource()) { + case 1 -> this.baseMapper.getRnAutoSampleResult(reqDTO.getSampleType(), startTime, + endTime); + case 2 -> this.baseMapper.getRnManSampleResult(reqDTO.getSampleType(), startTime, + endTime); + default -> new ArrayList<>(); + }; //获取台站信息 Set stationInfoSet = stationInfoDataList.stream() .map(station -> new StationInfoVO( @@ -98,15 +77,13 @@ public class SampleStatAnalysisService station.getLat() )) .collect(Collectors.toSet()); - - List sortedList = stationInfoDataList.stream() .sorted(Comparator.comparing(station -> station.getCollectStop().toInstant() - .atZone(ZoneId.of("UTC")) + .atZone(ZoneId.systemDefault()) .toLocalDate() )) - .collect(Collectors.toList()); + .toList(); //时间段内有多少台站 Map>> groupedByMonth = sortedList.stream() @@ -118,7 +95,7 @@ public class SampleStatAnalysisService != null) // 过滤 category 为 null 的数据 .collect(Collectors.groupingBy( station -> station.getCollectStop().toInstant() - .atZone(ZoneId.of("UTC")) + .atZone(ZoneId.systemDefault()) .format(DateTimeFormatter.ofPattern("yyyy-MM-dd")), TreeMap::new, Collectors.collectingAndThen( @@ -168,78 +145,37 @@ public class SampleStatAnalysisService )); resultMap.put("stationInfo", stationInfoSet); resultMap.put("sampleMonitorResultList", groupedByMonth); - result.setSuccess(true); - result.setResult(resultMap); - return result; + return resultMap; } catch (Exception e) { - result.error500("样品监测回放错误:" + e.getMessage()); - return result; + throw new RuntimeException(e); } } /*** 样品统计分析 * 样品统计分析 - * @param stationCode - * @param startDate - * @param endDate - * @return + * @return Map */ @Override - public Result getSampleStatAnalysis(String stationCode, Integer dataSource, Date startDate, - Date endDate) { + public Map getSampleStatAnalysis(SampleQueryRequestDTO reqDTO) { //声明返回用的结果map Map resultMap = new HashMap<>(); - List nuclideActConcIntvlList = new ArrayList<>(); - List sampleLevelDataList = new ArrayList<>(); - List thresholdResultHisDataList = new ArrayList<>(); + List nuclideActConcIntvlList; - String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String dbType = schemaName.startsWith("RN") ? "RN" : "RMS"; //region 局部变量 - Result result = new Result(); try { - result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(stationCode)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; //endregion - switch (dataSource) { - //RNAUTO - case 1: - //获取样品中识别到的核素集合 - nuclideActConcIntvlList = - this.baseMapper.getRnAutoIdentifiedNuclides(stationCode, startTime, - endTime); + //获取样品中识别到的核素集合 + nuclideActConcIntvlList = + this.baseMapper.getSampleNuclides(dbType, schemaName, reqDTO.getStationIds(), + startTime, + endTime); - //核素等级时序分析 - sampleLevelDataList = - this.baseMapper.getRnAutoNuclideTimeSeriesAnalysis(stationCode, - startTime, endTime); - break; - //RNMAN - case 2: - //获取样品中识别到的核素集合 - nuclideActConcIntvlList = - this.baseMapper.getRnManIdentifiedNuclides(stationCode, startTime, - endTime); - - //核素等级时序分析 - sampleLevelDataList = - this.baseMapper.getRnManNuclideTimeSeriesAnalysis(stationCode, - startTime, endTime); - break; - } //key=核素名称,value=获取样品中识别到的核素集合 Map> groupedByNuclideName = nuclideActConcIntvlList.stream() @@ -257,2982 +193,122 @@ public class SampleStatAnalysisService LinkedHashMap::new // 使用 LinkedHashMap )); resultMap.put("nuclideActConcIntvlList", sortedByCount); - result.setSuccess(true); - result.setResult(resultMap); - return result; + return resultMap; } catch (Exception e) { - result.error500("样品统计分析错误:" + e.getMessage()); - return result; + throw new RuntimeException(e); } - } - // 安全获取时间戳 - private long safeGetTime(Date date) { - return date != null ? date.getTime() : 0L; + /** + * 导出数据 + * + * @param reqDTO 请求实体 + * @return List + */ + @Override + public List getSampleStatData(SampleQueryRequestDTO reqDTO) { + //region 局部变量 + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; + //声明返回用的结果map + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String dbType = schemaName.startsWith("RN") ? "RN" : "RMS"; + // endregion + try { + List nuclideActConcIntvlList = + this.baseMapper.getSampleNuclides(dbType, schemaName, reqDTO.getStationIds(), + startTime, + endTime); + //key=核素名称,value=获取样品中识别到的核素集合数量 + List sampleStatList = nuclideActConcIntvlList.stream() + .filter(p -> p.getNuclideName() != null) + .collect(Collectors.groupingBy( + NuclideActConcIntvl::getNuclideName, + Collectors.summingInt(e -> 1))) + .entrySet().stream() + .map(e -> { + SampleStatExcelVO vo = new SampleStatExcelVO(); + vo.setNuclideName(e.getKey()); + vo.setCount(e.getValue()); + return vo; + }) + .toList(); + + return sampleStatList; + } catch (Exception e) { + throw new RuntimeException(e); + } } + /** * 样品统计分析--核素浓度时序分析 * - * @param sampleType - * @param stationCode - * @param nuclideName - * @param dataSource - * @param startDate - * @param endDate - * @return + * @return Map */ @Override - public Result getNuclideActConcChartData(String sampleType, String stationCode, - String nuclideName, Integer dataSource, Date startDate, - Date endDate) throws JsonProcessingException { - Result result = new Result(); - result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(stationCode)) { - result.error500("Station Code cannot be null"); - return result; - } - if (StringUtils.isBlank(nuclideName)) { - result.error500("nuclideName cannot be null"); - return result; - } - - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + public Map getNuclideActConcChartData(SampleQueryRequestDTO reqDTO) { + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; Map dataMap = new LinkedHashMap<>(); - String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String nuclideName = reqDTO.getNuclideName(); + String sampleType = reqDTO.getSampleType(); // 1. 模拟从数据库获取该核素的原始数据 - List rawList = - this.baseMapper.getIdentifiedNuclides(schemaName, nuclideName, stationCode, - startTime, endTime); + List rawList; + if (schemaName.startsWith("RN")) { + rawList = this.baseMapper.getIdentifiedNuclides(schemaName, nuclideName, + reqDTO.getStationIds(), + startTime, endTime); + } else { + rawList = this.baseMapper.getRMSIdentifiedNuclides(schemaName, nuclideName, + reqDTO.getStationIds(), + startTime, endTime); + } // 2. 排序(关键:X轴是时间轴,数据必须按时间升序) rawList.sort(Comparator.comparing(NuclideActConcIntvl::getCollectStop)); - NuclideDynamicChartDTO vo = new NuclideDynamicChartDTO(); - vo.setNuclideName(nuclideName); dataMap.put("nuclideName", nuclideName); - String unit = "P".equals(sampleType) ? "μBq/m³" : "mBq/m³"; - vo.setUnit(unit); - dataMap.put("unit", unit); + Map> levelGroup = new HashMap<>(); + if ("P".equals(sampleType)) { + levelGroup.put("category3", new ArrayList<>()); + levelGroup.put("category4", new ArrayList<>()); + } else { + levelGroup.put("category1", new ArrayList<>()); + levelGroup.put("category2", new ArrayList<>()); + levelGroup.put("category3", new ArrayList<>()); + } + dataMap.put("unit", getUnit(sampleType)); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List mdcList = new ArrayList<>(); List thresholdList = new ArrayList<>(); - Map> levelGroup = new HashMap<>(); - - levelGroup.put("category1", new ArrayList<>()); - levelGroup.put("category2", new ArrayList<>()); - levelGroup.put("category3", new ArrayList<>()); - //levelGroup.put("category4", new ArrayList<>()); - for (NuclideActConcIntvl item : rawList) { - String timeStr = sdf.format(item.getCollectStop()); + Date collectStop = item.getCollectStop(); + if (collectStop == null) { + continue; // 或记录日志,或使用默认值 + } + String timeStr = sdf.format(collectStop); mdcList.add(new Object[] {timeStr, item.getMdc()}); thresholdList.add(new Object[] {timeStr, item.getThresholdValue()}); // 动态处理级别 - int cat = item.getCategory(); + int cat = item.getCategory() != null ? item.getCategory() : 0; String categoryStr = "category" + cat; levelGroup.putIfAbsent(categoryStr, new ArrayList<>()); double err = item.getConcErr() != null ? item.getConcErr() : 0; - //TODO 测试数据 - //double err = 15; levelGroup.get(categoryStr).add(new Object[] {timeStr, item.getConc(), err, err}); -// if (cat == 3) { -// // 3级: 携带误差维度 [时间, 活度, ConcErr , $Conc+ConcErr] -// double err = item.getConcErr() != null ? item.getConcErr() : 0; -// levelGroup.get(categoryStr).add(new Object[]{timeStr, item.getConc(), item.getConc() - err, item.getConc() + err}); -// } else { -// // 1, 2, 4,5 级等: [时间, 活度] -// levelGroup.get(categoryStr).add(new Object[]{timeStr, item.getConc()}); -// } - } - vo.setMdc(mdcList); dataMap.put("mdc", mdcList); - vo.setThreshold(thresholdList); dataMap.put("threshold", thresholdList); // 组装 levels -// List levels = new ArrayList<>(); - levelGroup.forEach((cat, data) -> { - dataMap.put(cat, data); -// NuclideDynamicChartDTO.LevelSeriesDTO dto = new NuclideDynamicChartDTO.LevelSeriesDTO(); -// dto.setCategory(cat); -// //dto.setSeriesName("级别 " + cat); -// dto.setData(data); -// levels.add(dto); - }); - vo.setLevels(levelGroup); - //TODO 测试待删除 - ObjectMapper objectMapper = new ObjectMapper(); - //region 数据 - String DataResult = "{\n" + - "\t\"success\": true,\n" + - "\t\"message\": \"\",\n" + - "\t\"code\": 200,\n" + - "\t\"result\": {\n" + - "\t\t\"nuclideName\": \"Be7\",\n" + - "\t\t\"unit\": \"μBq/m³\",\n" + - "\t\t\"mdc\": [\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-02 23:03:24\",\n" + - "\t\t\t\t61.91509\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t26.56998\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t22.79071\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t23.27234\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t24.98008\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-04 23:02:47\",\n" + - "\t\t\t\t42.27896\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-04 23:02:47\",\n" + - "\t\t\t\t50.94231\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t44.11457\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t22.52611\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t21.83302\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t23.8359\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t28.35252\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t25.92995\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t101.8935\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t29.60599\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t28.73916\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t109.3997\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t26.88591\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t34.39485\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t30.10983\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t24.52033\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t37.5884\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t25.20782\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t62.42749\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t54.22814\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t46.1163\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t41.14393\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t27.61078\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t26.88908\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t37.00129\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t31.19899\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t29.07644\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t34.14514\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t76.38019\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t56.78895\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t47.77348\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t42.49071\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t38.003\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t26.47496\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t34.61946\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t31.70538\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t29.31711\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t117.4508\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t28.01304\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t25.73598\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t31.86585\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t95.0321\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t54.38299\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t49.62949\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t32.84921\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t40.91378\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t37.85191\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t144.4801\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t35.15303\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t44.64273\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-11 23:02:45\",\n" + - "\t\t\t\t53.5887\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-11 23:02:45\",\n" + - "\t\t\t\t60.7981\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-12 23:33:51\",\n" + - "\t\t\t\t32.04906\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-12 23:33:51\",\n" + - "\t\t\t\t35.45809\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t40.43557\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t37.24021\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t34.81576\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t31.4237\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t32.42358\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t46.14036\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t42.57378\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t101.1884\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t84.86036\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t42.94119\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t65.95372\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t59.33494\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t54.07977\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t49.81413\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t74.36587\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t94.18287\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t83.44501\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t126.959\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t64.22414\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t72.40825\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t85.28339\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t52.74204\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t110.1959\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t95.44238\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t76.76607\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t69.85533\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t63.71053\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t242.2873\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t58.56366\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t54.541\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t40.62775\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t48.08861\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t36.42156\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t37.65919\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t44.06318\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t57.59127\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t52.55568\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t36.59317\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t30.7557\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t31.84306\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t34.2864\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t113.524\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t64.7676\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t76.33092\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t57.78949\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t52.27939\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t36.90019\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t40.89447\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t161.294\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t44.12354\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t47.90935\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-21 23:17:48\",\n" + - "\t\t\t\t27.5692\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-21 23:17:48\",\n" + - "\t\t\t\t52.52116\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t45.52769\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t28.23106\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t80.0038\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t64.71919\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t51.90665\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t27.28338\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t40.10243\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t28.08179\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t50.67627\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t65.3955\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t36.31402\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t28.27642\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t32.51787\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t41.76238\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t22.37459\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t21.66372\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-25 23:02:31\",\n" + - "\t\t\t\t78.37254\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-26 23:20:15\",\n" + - "\t\t\t\t55.33615\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-27 23:15:35\",\n" + - "\t\t\t\t36.60039\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-27 23:15:35\",\n" + - "\t\t\t\t46.98761\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-28 23:14:03\",\n" + - "\t\t\t\t48.20852\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-29 23:24:03\",\n" + - "\t\t\t\t24.11663\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-04 23:21:38\",\n" + - "\t\t\t\t25.01251\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-06 23:02:52\",\n" + - "\t\t\t\t32.0358\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-08 23:02:50\",\n" + - "\t\t\t\t27.0982\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t39.99299\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t22.77897\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t10.90643\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t11.772\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t16.62961\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t18.61766\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t23.39705\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t28.05016\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t34.70796\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-14 23:04:05\",\n" + - "\t\t\t\t45.48599\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-14 23:04:05\",\n" + - "\t\t\t\t83.58986\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t22.51977\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t64.25653\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t48.72474\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t38.48078\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t25.41351\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t30.45334\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t34.06748\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t27.664\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t21.35096\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t23.59349\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t30.84564\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t33.4631\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t28.60814\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t26.70624\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t25.04749\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t24.23821\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-18 23:25:07\",\n" + - "\t\t\t\t44.01791\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-18 23:25:07\",\n" + - "\t\t\t\t83.22016\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-19 23:11:56\",\n" + - "\t\t\t\t42.7378\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-19 23:11:56\",\n" + - "\t\t\t\t37.40251\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t47.92963\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t42.80255\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t54.93473\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t35.68823\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t38.9247\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t32.65817\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t30.94616\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t28.93256\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t28.03454\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t22.5831\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t45.54195\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t19.66634\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t21.0617\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t24.44526\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t27.56654\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t35.52772\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t17.95022\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t35.36686\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t26.76219\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t30.29888\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-24 23:15:50\",\n" + - "\t\t\t\t49.95772\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-26 23:24:37\",\n" + - "\t\t\t\t74.16786\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-26 23:24:37\",\n" + - "\t\t\t\t29.93817\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t25.83932\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t78.06914\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t61.1058\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t53.45915\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t46.6713\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t26.82564\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t35.67928\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t32.96032\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t30.82313\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t28.64149\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t38.42561\n" + - "\t\t\t]\n" + - "\t\t],\n" + - "\t\t\"threshold\": [\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-02 23:03:24\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-04 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-04 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-11 23:02:45\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-11 23:02:45\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-12 23:33:51\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-12 23:33:51\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-21 23:17:48\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-21 23:17:48\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-25 23:02:31\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-26 23:20:15\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-27 23:15:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-27 23:15:35\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-28 23:14:03\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-29 23:24:03\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-04 23:21:38\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-06 23:02:52\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-08 23:02:50\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-14 23:04:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-14 23:04:05\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-18 23:25:07\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-18 23:25:07\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-19 23:11:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-19 23:11:56\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-24 23:15:50\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-26 23:24:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-26 23:24:37\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t0\n" + - "\t\t\t]\n" + - "\t\t],\n" + - "\t\t\"category3\": [\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t2938.155,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t2927.84,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t2928.506,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-04 23:02:47\",\n" + - "\t\t\t\t1663.672,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3213.891,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3218.834,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3212.166,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3216.12,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3203.93,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3213.854,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3229.941,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3741.09,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3769.351,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3761.737,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3763.809,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3765.302,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6127.72,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6126.847,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6122.405,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6139.97,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6112.527,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6121.338,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6129.159,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6122.965,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6135.427,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8125.462,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8123.146,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8129.056,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8125.663,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t5473.638,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t5466.153,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t5475.228,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t5463.992,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-13 23:31:35\",\n" + - "\t\t\t\t5468.525,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5295.286,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t6423.566,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5119.148,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5112.172,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5107.187,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5106.218,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t4719.428,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t4705.322,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t4704.088,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-18 23:02:42\",\n" + - "\t\t\t\t4711.83,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-21 23:17:48\",\n" + - "\t\t\t\t6913.619,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5704.544,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5737.608,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5705.445,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2857.824,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2879.081,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2836.19,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2876.017,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2882.378,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2864.488,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2879.945,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2866.591,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-24 23:04:30\",\n" + - "\t\t\t\t2856.856,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-27 23:15:35\",\n" + - "\t\t\t\t2468.387,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-29 23:24:03\",\n" + - "\t\t\t\t1451.009,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-06 23:02:52\",\n" + - "\t\t\t\t293.7175,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-08 23:02:50\",\n" + - "\t\t\t\t1979.285,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t698.3243,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t706.1566,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-14 23:04:05\",\n" + - "\t\t\t\t2916.203,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4724.769,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4782.955,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4730.384,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4715.34,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4704.651,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4701.742,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4692.822,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4705.073,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4730.947,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-15 23:02:57\",\n" + - "\t\t\t\t4716.26,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t7010.811,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t7054.959,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t7014.839,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t7010.355,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t7029.997,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-16 23:01:37\",\n" + - "\t\t\t\t7039.358,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-19 23:11:56\",\n" + - "\t\t\t\t6629.359,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-19 23:11:56\",\n" + - "\t\t\t\t6635.202,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7902.035,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7914.474,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7962.658,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7918.484,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7913.099,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7913.676,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7885.258,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7878.805,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-20 23:02:47\",\n" + - "\t\t\t\t7883.055,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5528.107,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5466.347,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5527.045,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5521.66,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5513.799,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-26 23:24:37\",\n" + - "\t\t\t\t4700.748,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3550.77,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3568.29,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3556.913,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3542.005,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3553.595,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3558.268,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3571.437,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t]\n" + - "\t\t],\n" + - "\t\t\"category4\": [\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-02 23:03:24\",\n" + - "\t\t\t\t3790.991,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-03 23:03:05\",\n" + - "\t\t\t\t2928.388,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-04 23:02:47\",\n" + - "\t\t\t\t1654.931,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-05 23:01:15\",\n" + - "\t\t\t\t3221.112,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4450.895,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4373.396,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4463.283,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4460.842,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4456.041,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4461.941,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4460.086,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-06 23:11:39\",\n" + - "\t\t\t\t4460.924,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3777.935,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3766.5,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3763.034,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3766.998,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-07 23:09:15\",\n" + - "\t\t\t\t3758.742,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6223.97,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6147.146,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-08 23:13:28\",\n" + - "\t\t\t\t6110.633,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8146.502,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8172.349,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8132.821,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8130.475,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8147.735,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-09 23:02:43\",\n" + - "\t\t\t\t8133.273,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-11 23:02:45\",\n" + - "\t\t\t\t7750.712,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-11 23:02:45\",\n" + - "\t\t\t\t7730.019,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-12 23:33:51\",\n" + - "\t\t\t\t6396.785,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-12 23:33:51\",\n" + - "\t\t\t\t6388.327,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5291.808,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5267.645,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5198.592,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5199.663,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5263.738,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5284.403,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5278.981,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5287.571,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-14 23:02:42\",\n" + - "\t\t\t\t5247.584,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t6486.789,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t6408.022,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t6408.27,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-15 23:21:37\",\n" + - "\t\t\t\t6367.534,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6619.181,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6668.683,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6589.906,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6591.49,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6627.506,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6738.236,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6704.38,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6571.425,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6678.811,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-16 23:02:54\",\n" + - "\t\t\t\t6673.78,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5119.857,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5122.394,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-17 23:02:41\",\n" + - "\t\t\t\t5084.332,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6295.746,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6196.644,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6276.19,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6189.012,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6168.655,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6177.994,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6170.427,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6306.553,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6182.721,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-19 22:57:56\",\n" + - "\t\t\t\t6178.403,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-21 23:17:48\",\n" + - "\t\t\t\t6873.638,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5743.7,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5692.55,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5715.635,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-22 23:09:05\",\n" + - "\t\t\t\t5717.883,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-25 23:02:31\",\n" + - "\t\t\t\t5511.786,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-26 23:20:15\",\n" + - "\t\t\t\t4005.531,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-27 23:15:35\",\n" + - "\t\t\t\t2480.105,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-01-28 23:14:03\",\n" + - "\t\t\t\t2943.962,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-04 23:21:38\",\n" + - "\t\t\t\t1686.132,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t752.2901,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-10 23:24:57\",\n" + - "\t\t\t\t719.6925,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t678.6485,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t684.3658,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t674.4982,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t677.1769,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-11 23:09:26\",\n" + - "\t\t\t\t654.6798,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-14 23:04:05\",\n" + - "\t\t\t\t2956.216,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-18 23:25:07\",\n" + - "\t\t\t\t7406.622,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-18 23:25:07\",\n" + - "\t\t\t\t7504.437,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5518.636,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5518.518,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-21 23:03:06\",\n" + - "\t\t\t\t5513.985,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t2359.421,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t2330.999,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-22 23:02:55\",\n" + - "\t\t\t\t2354.63,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-24 23:15:50\",\n" + - "\t\t\t\t3685.151,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-26 23:24:37\",\n" + - "\t\t\t\t4631.992,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3589.453,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3560.519,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3567.389,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t],\n" + - "\t\t\t[\n" + - "\t\t\t\t\"2025-02-27 23:02:53\",\n" + - "\t\t\t\t3568.176,\n" + - "\t\t\t\t0,\n" + - "\t\t\t\t0\n" + - "\t\t\t]\n" + - "\t\t]\n" + - "\t},\n" + - "\t\"timestamp\": 1766671165792\n" + - "}"; - //endregion - Result> resultData = - objectMapper.readValue(DataResult, new TypeReference<>() { - }); + dataMap.putAll(levelGroup); + return dataMap; - result.setSuccess(true); - //result.setResult(resultData); - //return resultData; - result.setResult(dataMap); - return result; } @@ -3242,156 +318,89 @@ public class SampleStatAnalysisService * */ @Override - public Result getSampleGradeAnalysis(String sampleType, String station, Date startDate, - Date endDate, Integer dataSource) { - + public Map getSampleGradeAnalysis(SampleQueryRequestDTO reqDTO) { //声明返回用的结果map - Map resultMap = new HashMap<>(); - List sampleDataList = new ArrayList<>(); - - Result result = new Result(); + List sampleDataList; try { //region 局部变量 - result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); - return result; - } - if (StringUtils.isBlank(station)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; + + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); //endregion - - switch (dataSource) { - case 1: - sampleDataList = - this.baseMapper.getRnAutoSampleGradeAnalysis(sampleType, station, - startTime, endTime); - - break; - case 2: - sampleDataList = - this.baseMapper.getRnManSampleGradeAnalysis(sampleType, station, - startTime, endTime); - break; - - } - - - resultMap.put("sampleDataList", sampleDataList); - result.setSuccess(true); - result.setResult(resultMap); - return result; + sampleDataList = + this.baseMapper.getSampleGradeAnalysis(reqDTO.getSampleType(), + reqDTO.getStationIds(), startTime, + endTime, schemaName); + return Collections.singletonMap("sampleDataList", sampleDataList); } catch (Exception e) { - result.error500("样品统计分析错误:" + e.getMessage()); - return result; + throw new RuntimeException("样品统计分析错误" + e); } } + @Override + public List getSampleGradeAnalysisData(SampleQueryRequestDTO reqDTO) { + try { + //region 局部变量 + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; + //endregion + // 根据数据来源决定 schema + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + return this.baseMapper.getSampleGradeAnalysis( + reqDTO.getSampleType(), reqDTO.getStationIds(), startTime, endTime, schemaName); + } catch (Exception e) { + log.error("导出样品统计分析错误{}", e); + return Collections.emptyList(); + } + } /*** 样品活度浓度区间频率分析 * 样品活度浓度区间频率分析 - * @param sampleType 样品类型 - * @param station 台站编码 - * @param nuclideName 核素名称 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回样品活度浓度区间信息 */ @Override - public Result getSampleActConcIntvlAnalysis(String sampleType, String station, - String nuclideName, Integer dataSource, - Date startDate, Date endDate) { + public Map getSampleActConcIntvlAnalysis(SampleQueryRequestDTO reqDTO) { //声明返回用的结果map Map resultMap = new HashMap<>(); - List nuclideActConcIntvls = new ArrayList<>(); - //region 局部变量 - Result result = new Result(); + List nuclideActConcIntvls; try { - result.setCode(CommonConstant.SC_OK_200); - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); - return result; - } - if (StringUtils.isBlank(nuclideName)) { - result.error500("nuclideName Code cannot be null"); - return result; - } - if (StringUtils.isBlank(station)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; - - String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; + //region 校验 + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; //endregion - - //根据数据源、样品类型查询样品的浓度 - switch (sampleType) { - case "P": - //RNAUTO - if (dataSource == 1) { - nuclideActConcIntvls = - this.baseMapper.getRnautoPNuclideActConcIntvl(sampleType, - station, nuclideName, startTime, endTime); - //RNMAN - } else if (dataSource == 2) { - nuclideActConcIntvls = - this.baseMapper.getRnmanPNuclideActConcIntvl(sampleType, - station, nuclideName, startTime, endTime); - } - break; - case "B": - if (dataSource == 1) { - nuclideActConcIntvls = - this.baseMapper.getRnautoNuclideActConcIntvl(sampleType, - station, nuclideName, startTime, endTime); - } else if (dataSource == 2) { - nuclideActConcIntvls = - this.baseMapper.getRnmanNuclideActConcIntvl(sampleType, station, - nuclideName, startTime, endTime); - } - break; - + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String sampleType = reqDTO.getSampleType(); + String nuclideName = reqDTO.getNuclideName(); + List stationIds = reqDTO.getStationIds(); + //查询数据 + if (schemaName.startsWith("RN")) { + nuclideActConcIntvls = + this.baseMapper.getNuclideActConcIntvl(schemaName, sampleType, stationIds, + nuclideName, startTime, endTime); + } else { + nuclideActConcIntvls = + this.baseMapper.getRMSNuclideActConcIntvl(schemaName, sampleType, + stationIds, + nuclideName, startTime, endTime); } + //根据数据源、样品类型查询样品的浓度 + //获取浓度出现的次数 if (nuclideActConcIntvls.isEmpty()) { - result.error500("查询数据为空"); - return result; + throw new Exception("查询数据为空"); } //获取浓度值集合 List data = DistributionAnalysisToolkit.convertConcToDoubleList(nuclideActConcIntvls); - // 设置区间参数 - double start = 0; // 区间起始值 - double step = 200; // 区间步长(宽度) - // 1. 区间统计 List stats = - DistributionAnalysisToolkit.calculateIntervalStats(nuclideActConcIntvls, start, - step); + DistributionAnalysisToolkit.calculateIntervalStats(nuclideActConcIntvls); // 3. 累积分布函数 List cdfPoints = DistributionAnalysisToolkit.calculateCDF(data); @@ -3409,31 +418,19 @@ public class SampleStatAnalysisService resultMap.put("kdePoints", kdePoints); resultMap.put("cumulative", cumulative); resultMap.put("percentile95", percentile95); - result.setSuccess(true); - result.setResult(resultMap); - return result; + return resultMap; } catch (Exception e) { - log.error("样品活度浓度区间频率分析错误:" + e.getMessage(), e); - result.error500("样品活度浓度区间频率分析错误"); - return result; + log.error("样品活度浓度区间频率分析错误:{}", e); + throw new RuntimeException(e.getMessage()); } - } /*** 核素活度浓度时序分析 * 核素活度浓度时序分析 - * @param sampleType 样品类型 - * @param station 台站编码 - * @param nuclideName 核素名 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 * @return 返回核素活度浓度信息 */ @Override - public Result getSampleActConcTimeSeqAnalysis(String sampleType, String station, - String nuclideName, Integer dataSource, - Date startDate, Date endDate) { + public Result getSampleActConcTimeSeqAnalysis(SampleQueryRequestDTO reqDTO) { Result result = new Result(); //声明返回用的结果map Map resultMap = new HashMap<>(); @@ -3441,81 +438,24 @@ public class SampleStatAnalysisService result.setCode(CommonConstant.SC_OK_200); //region 局部变量 - - if (StringUtils.isBlank(sampleType)) { - result.error500("SampleType Code cannot be null"); - return result; - } - if (StringUtils.isBlank(nuclideName)) { - result.error500("nuclideName Code cannot be null"); - return result; - } - if (StringUtils.isBlank(station)) { - result.error500("Station Code cannot be null"); - return result; - } - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; //endregion //获取样品阈值级别和阈值 - List sampleDatas = new ArrayList<>(); - //核素的阈值 - List thresholdResultHisList = new ArrayList<>(); - List nuclideActConcIntvls = new ArrayList<>(); - //region -// nuclideActConcIntvls = switch (sampleType) { -// case "P" -> { -// sampleDatas = this.baseMapper.getRnAutoSampleLevel(station, startTime, endTime); -// yield switch (dataSource) { -// //RNAUTO -// case 1 -> -// this.baseMapper.getRnautoPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); -// //RNMAN -// case 2 -> -// this.baseMapper.getRnautoNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); -// default -> nuclideActConcIntvls; -// }; -// } -// case "B" -> { -// sampleDatas = this.baseMapper.getRnManSampleLevel(station, startTime, endTime); -// yield switch (dataSource) { -// case 1 -> -// this.baseMapper.getRnmanPNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); -// case 2 -> -// this.baseMapper.getRnmanNuclideActConcIntvl(sampleType, station, nuclideName, startTime, endTime); -// default -> nuclideActConcIntvls; -// }; -// } -// default -> nuclideActConcIntvls; -// }; - //endregion - String schemaName = dataSource == 1 ? "RNAUTO" : "RNMAN"; - - - List sampleDatass = - this.baseMapper.getNuclideTimeSeriesAnalysis(schemaName, station, nuclideName, + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String nuclideName = reqDTO.getNuclideName(); + List stationIds = reqDTO.getStationIds(); + List sampleDatas = + this.baseMapper.getNuclideTimeSeriesAnalysis(schemaName, stationIds, + nuclideName, startTime, endTime); - - -// thresholdResultHisList = this.baseMapper.selectByCondition(schemaName, Arrays.asList(Integer.valueOf(station)) -// , Arrays.asList(nuclideName), startTime, endTime); resultMap.put("sampleDataList", sampleDatas); -// resultMap.put("nuclideInfoList", nuclideActConcIntvls); -// resultMap.put("thresholdResultHisList", thresholdResultHisList); - result.setSuccess(true); result.setResult(resultMap); return result; } catch (Exception e) { - log.error("核素活度浓度时序分析错误:" + e.getMessage(), e); + log.error("核素活度浓度时序分析错误:", e); result.error500("核素活度浓度时序分析错误"); return result; } @@ -3525,67 +465,40 @@ public class SampleStatAnalysisService /*** 核素活度浓度对比分析 * 核素活度浓度对比分析 - * @param sampleType 样品类型 - * @param stationIds 台站ID集合 - * @param nuclideName 核素名 - * @param dataSource 数据源 - * @param startDate 开始时间 - * @param endDate 结束时间 - * @return + * @return Map */ - public Result getNuclideActivityConcAnalyze(String sampleType, Integer[] stationIds, - String nuclideName, Integer dataSource, - Date startDate, Date endDate) { + public Map getNuclideActivityConcAnalyze(SampleQueryRequestDTO reqDTO) { Map resultMap = new HashMap<>(); - List nuclideActConcIntvls = new ArrayList<>(); - - Result result = new Result(); - String unit = "P".equals(sampleType) ? "μBq/m³" : "mBq/m³"; + List nuclideActConcIntvls; try { - result.setCode(CommonConstant.SC_OK_200); - //region 局部变量 - if (Objects.isNull(startDate)) { - result.error500("The start time cannot be empty"); - return result; - } - String startTime = DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00"; - if (Objects.isNull(endDate)) { - result.error500("The end time cannot be empty"); - return result; - } - String endTime = DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59"; + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; - if (Objects.isNull(stationIds)) { - result.setSuccess(true); - result.setResult(Collections.emptyList()); - return result; + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String nuclideName = reqDTO.getNuclideName(); + String sampleType = reqDTO.getSampleType(); + List stationIds = reqDTO.getStationIds(); + + + if (schemaName.startsWith("RN")) { + nuclideActConcIntvls = + this.baseMapper.getRnAnalyzeNuclideActivityConc(schemaName, sampleType, + nuclideName, stationIds, startTime, endTime); + } else { + nuclideActConcIntvls = + this.baseMapper.getRMSAnalyzeNuclideActivityConc(schemaName, sampleType, + nuclideName, stationIds, startTime, endTime); } //endregion - switch (dataSource) { - case 1: - nuclideActConcIntvls = - this.baseMapper.getRnAutoAnalyzeNuclideActivityConc(sampleType, - nuclideName, stationIds, startTime, endTime); - break; - case 2: - nuclideActConcIntvls = - this.baseMapper.getRnManAnalyzeNuclideActivityConc(sampleType, - nuclideName, stationIds, startTime, endTime); - break; - } - - - //resultMap.put("nuclideInfoList", nuclideActConcIntvls); resultMap.put("nuclideInfoList", - convertToChartVO(nuclideActConcIntvls, startDate, endDate, unit)); - result.setSuccess(true); - result.setResult(resultMap); - return result; + convertToChartVO(nuclideActConcIntvls, startTime, endTime, + getUnit(reqDTO.getSampleType()))); + return resultMap; } catch (Exception e) { - result.error500("核素活度浓度对比分析错误:" + e.getMessage()); - return result; + throw new RuntimeException(e); } } @@ -3605,11 +518,6 @@ public class SampleStatAnalysisService .collect(Collectors.groupingBy(NuclideActConcIntvl::getStationCode)); int colorIndex = 0; - //TODO - Random rand = new Random(); - - double min = 100.0; - double max = 2000.0; for (Map.Entry> entry : groupByStation.entrySet()) { String displayCode = entry.getKey(); @@ -3624,7 +532,6 @@ public class SampleStatAnalysisService .orElse("UNKNOWN"); series.setStationCode(stationCode); series.setStationName(displayCode); // 可后续扩展 - series.setSampleCount(records.size()); // 动态分配颜色 @@ -3644,16 +551,11 @@ public class SampleStatAnalysisService mdcPoint.put("y", r.getMdc()); series.getMdcData().add(mdcPoint); - //series.getMdcData().add(new Object[]{timeStr, r.getMdc()}); - // 检测值 + 误差条 Double conc = r.getConc(); Double err = r.getConcErr(); - //TODO - //Double err =Math.round(min + (max - min) * rand.nextDouble() * 1000000.0) / 1000000.0; + if (conc != null && err != null) { - double low = Math.max(conc - err, 0.01); - double high = conc + err; Map detectionPoint = new LinkedHashMap<>(); detectionPoint.put("x", timeStr); @@ -3661,27 +563,26 @@ public class SampleStatAnalysisService detectionPoint.put("low", err); // 下限(可选,方便前端) detectionPoint.put("high", err); // 上限(可选) - // 或者用: value + error 结构(ECharts 某些系列支持) - //detectionPoint.put("value", new double[]{conc, low, high}); - series.getDetectionDataWithError().add(detectionPoint); } // 无有效检测时不添加点(保持图表干净) } - vo.getStations().add(series); } - return vo; - } @Override - public List findStationListByMenuName(String systemType) { - List gardsStations = new LinkedList<>(); - //获取台站信息 - gardsStations = this.baseMapper.findStationListByMenuName(systemType); + public List findStationListByMenuName(String systemType, Integer dataSource) { + List gardsStations; + String schemaName = _schemaMap.getSourceSchema(dataSource); + if (schemaName.startsWith("RN")) { + //获取台站信息 + gardsStations = this.baseMapper.findStationListByMenuName(systemType); + } else { + gardsStations = this.baseMapper.findRMSStationListByMenuName(systemType); + } return gardsStations; } @@ -3691,45 +592,308 @@ public class SampleStatAnalysisService LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(SysDefaultNuclide::getUseType, 4); - if (systemType.equals("B")) { - queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.BETA.getType()); - } else if (systemType.equals("G")) { - queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.GAMMA.getType()); - } else if (systemType.equals("P")) { - queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.PARTICULATE.getType()); + switch (systemType) { + case "B" -> + queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.BETA.getType()); + case "G" -> + queryWrapper.eq(SysDefaultNuclide::getNuclideType, SystemType.GAMMA.getType()); + case "P" -> queryWrapper.eq(SysDefaultNuclide::getNuclideType, + SystemType.PARTICULATE.getType()); } - List defaultNuclides = defaultNuclideMapper.selectList(queryWrapper); - return defaultNuclides; + return defaultNuclideMapper.selectList(queryWrapper); } - public static double findMaxValue(List list) { - if (list == null || list.isEmpty()) { - // 处理空集合情况,返回一个默认值 - return 0; + //region 导出Excel + + /** + * 核素活度浓度时序分析(导出用,多站点) + */ + public List getNuclideActConcExportData(SampleQueryRequestDTO reqDTO) { + try { + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; + + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String nuclideName = reqDTO.getNuclideName(); + String sampleType = reqDTO.getSampleType(); + List stationIds = reqDTO.getStationIds(); + String unit = "P".equals(sampleType) ? "μBq/m³" : "mBq/m³"; + // 1. 模拟从数据库获取该核素的原始数据 + List rawList; + if (schemaName.startsWith("RN")) { + rawList = this.baseMapper.getIdentifiedNuclides(schemaName, nuclideName, + reqDTO.getStationIds(), + startTime, endTime); + } else { + rawList = this.baseMapper.getRMSIdentifiedNuclides(schemaName, nuclideName, + reqDTO.getStationIds(), + startTime, endTime); + } + + if (CollectionUtils.isEmpty(rawList)) { + return Collections.emptyList(); + } + + // 按时间排序 + rawList.sort(Comparator.comparing(NuclideActConcIntvl::getCollectStop)); + + // 转 ExcelVO + return rawList.stream().map(item -> { + NuclideTimeExcelVO vo = new NuclideTimeExcelVO(); + vo.setStationId(item.getStationId()); + vo.setNuclideName(nuclideName); + vo.setCollectStop(item.getCollectStop()); + vo.setConc(item.getConc()); + vo.setConcErr(item.getConcErr()); + vo.setMdc(item.getMdc()); + vo.setThresholdValue(item.getThresholdValue()); + vo.setCategory(item.getCategory()); + vo.setUnit(unit); + return vo; + }).collect(Collectors.toList()); + + } catch (Exception e) { + throw new RuntimeException("核素时序分析导出错误:" + e); } - // 初始值设为第一个对象的三个字段中的最大值 - double maxValue = Math.max(list.get(0).getMdc(), - Math.max(list.get(0).getConc(), list.get(0).getThresholdValue())); - for (NuclideActConcIntvl item : list) { + } - Double mdc = item.getMdc(); - Double conc = item.getConc(); - Double thresholdValue = item.getThresholdValue(); - // 分别比较每个字段,更新最大值 - if (mdc != null && mdc > maxValue) { - maxValue = mdc; + /** + * 核素活度浓度对比分析 + */ + public List getNuclideCompareExportData(SampleQueryRequestDTO reqDTO) { + try { + // 1. 计算时间区间 + Date[] dates = parseRequestDates(reqDTO); + Date startDate = dates[0]; + Date endDate = dates[1]; + + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String nuclideName = reqDTO.getNuclideName(); + String sampleType = reqDTO.getSampleType(); + List stationIds = reqDTO.getStationIds(); + + if (stationIds == null || stationIds.size() < 2) { + throw new RuntimeException("请至少选择两个台站进行对比"); } - if (conc != null && conc > maxValue) { - maxValue = conc; + + String unit = "P".equals(sampleType) ? "μBq/m³" : "mBq/m³"; + + // 2. 查询同一时间段内多个台站的原始明细数据 + List rawList; + if (schemaName.startsWith("RN")) { + rawList = this.baseMapper.getRnAnalyzeNuclideActivityConc(schemaName, sampleType, + nuclideName, stationIds, startDate, endDate); + } else { + rawList = this.baseMapper.getRMSAnalyzeNuclideActivityConc(schemaName, sampleType, + nuclideName, stationIds, startDate, endDate); } - if (thresholdValue != null && thresholdValue > maxValue) { - maxValue = thresholdValue; + + if (rawList == null || rawList.isEmpty()) { + return new ArrayList<>(); + } + + // 3. 将原始数据按 "核素名称" 分组 + Map> groupByNuclide = rawList.stream() + .collect(Collectors.groupingBy(NuclideActConcIntvl::getNuclideName)); + + List result = new ArrayList<>(); + + // 4. 遍历每种核素,进行台站间的两两对比 + for (Map.Entry> entry : groupByNuclide.entrySet()) { + List nuclideDataList = entry.getValue(); + String currentNuclide = entry.getKey(); + + // 台站两两组合对比 (例如3个台站:A-B, A-C, B-C) + for (int i = 0; i < nuclideDataList.size(); i++) { + for (int j = i + 1; j < nuclideDataList.size(); j++) { + NuclideActConcIntvl dataA = nuclideDataList.get(i); + NuclideActConcIntvl dataB = nuclideDataList.get(j); + + NuclideCompareExcelVO vo = new NuclideCompareExcelVO(); + vo.setNuclideName(currentNuclide); + vo.setUnit(unit); + + // 组装台站A数据 + vo.setStationAId(dataA.getStationId()); + vo.setValueA(dataA.getConc()); + vo.setCollectStopA(dataA.getCollectStop()); + + // 组装台站B数据 + vo.setStationBId(dataB.getStationId()); + vo.setValueB(dataB.getConc()); + vo.setCollectStopB(dataB.getCollectStop()); + + // 计算差值和变化率 + if (dataA.getConc() != null && dataB.getConc() != null) { + double diff = dataA.getConc() - dataB.getConc(); + vo.setDiffValue(diff); + + if (dataB.getConc() != 0) { + double rate = + (dataA.getConc() - dataB.getConc()) / dataB.getConc() * 100; + // 保留两位小数 + vo.setChangeRate(Math.round(rate * 100.0) / 100.0); + } else { + vo.setChangeRate(null); + } + } else { + vo.setDiffValue(null); + vo.setChangeRate(null); + } + + result.add(vo); + } + } + } + return result; + + } catch (Exception e) { + throw new RuntimeException("核素对比分析导出错误:" + e); + } + } + + + /** + * 样品活度浓度区间频率分析(导出用) + */ + public List getSampleRangeFreqExportData(SampleQueryRequestDTO reqDTO, + BigDecimal intervalWidth) { + try { + Date[] dates = parseRequestDates(reqDTO); + Date startTime = dates[0]; + Date endTime = dates[1]; + String schemaName = _schemaMap.getSourceSchema(reqDTO.getDataSource()); + String sampleType = reqDTO.getSampleType(); + List stationIds = reqDTO.getStationIds(); + String nuclideName = reqDTO.getNuclideName(); + String unit = "P".equals(sampleType) ? "μBq/m³" : "mBq/m³"; + + if (intervalWidth == null || intervalWidth.compareTo(BigDecimal.ZERO) <= 0) { + intervalWidth = new BigDecimal("10"); + } + List nuclideActConcIntvls; + //查询数据 + if (schemaName.startsWith("RN")) { + nuclideActConcIntvls = + this.baseMapper.getNuclideActConcIntvl(schemaName, sampleType, stationIds, + nuclideName, startTime, endTime); + } else { + nuclideActConcIntvls = + this.baseMapper.getRMSNuclideActConcIntvl(schemaName, sampleType, + stationIds, + nuclideName, startTime, endTime); + } + + if (CollectionUtils.isEmpty(nuclideActConcIntvls)) { + return Collections.emptyList(); + } + + // 2. 计算区间频率 + return buildRangeFreqResult(nuclideActConcIntvls, intervalWidth, unit); + + } catch (Exception e) { + throw new RuntimeException("区间频率分析错误:" + e); + } + } + + /** + * 按 站点+核素 分组,计算区间频率 + */ + private List buildRangeFreqResult( + List rawList, + BigDecimal intervalWidth, + String unit) { + + List result = new ArrayList<>(); + + // 按 站点+核素 分组 + Map> grouped = rawList.stream() + .collect(Collectors.groupingBy( + v -> v.getStationId() + "_" + v.getNuclideName(), + LinkedHashMap::new, + Collectors.toList() + )); + + for (Map.Entry> entry : grouped.entrySet()) { + List items = entry.getValue(); + + String stationId = String.valueOf(items.get(0).getStationId()); + String nuclideName = items.get(0).getNuclideName(); + int totalCount = items.size(); + + // 按区间分组:conc / intervalWidth 取整 + double width = intervalWidth.doubleValue(); + Map rangeCountMap = items.stream() + .filter(v -> v.getConc() != null) + .collect(Collectors.groupingBy( + v -> (int) Math.floor(v.getConc() / width), // 相除并向下取整,转为区间索引 + TreeMap::new, + Collectors.counting() + )); + + // 计算频率和累计频率 + BigDecimal cumulativeRate = BigDecimal.ZERO; + + for (Map.Entry rangeEntry : rangeCountMap.entrySet()) { + int rangeIndex = rangeEntry.getKey(); + int count = rangeEntry.getValue().intValue(); + + BigDecimal rangeMin = intervalWidth.multiply(new BigDecimal(rangeIndex)); + BigDecimal rangeMax = rangeMin.add(intervalWidth); + + SampleRangeFreqExcelVO vo = new SampleRangeFreqExcelVO(); + vo.setStationId(stationId); + vo.setNuclideName(nuclideName); + vo.setRangeLabel("[" + rangeMin.stripTrailingZeros().toPlainString() + + ", " + rangeMax.stripTrailingZeros().toPlainString() + ")"); + vo.setFrequency(count); + vo.setTotalCount(totalCount); + vo.setUnit(unit); + + // 频率 = 频数 / 总数 * 100 + BigDecimal rate = new BigDecimal(count) + .divide(new BigDecimal(totalCount), 6, RoundingMode.HALF_UP) + .multiply(new BigDecimal(100)) + .setScale(2, RoundingMode.HALF_UP); + vo.setFrequencyRate(rate); + + // 累计频率 + cumulativeRate = cumulativeRate.add(rate); + vo.setCumulativeRate(cumulativeRate); + + result.add(vo); } } - return maxValue; + return result; + } + + + //endregion + + + /** + * 统一处理请求日期,将 Date 转换为当天的 00:00:00 和 23:59:59 + */ + private Date[] parseRequestDates(SampleQueryRequestDTO reqDTO) { + LocalDateTime startDt = + LocalDateTime.ofInstant(reqDTO.getStartDate().toInstant(), ZoneId.systemDefault()) + .withHour(0).withMinute(0).withSecond(0); + LocalDateTime endDt = + LocalDateTime.ofInstant(reqDTO.getEndDate().toInstant(), ZoneId.systemDefault()) + .withHour(23).withMinute(59).withSecond(59); + + return new Date[] { + Date.from(startDt.atZone(ZoneId.systemDefault()).toInstant()), + Date.from(endDt.atZone(ZoneId.systemDefault()).toInstant()) + }; + } + + private String getUnit(String sampleType) { + return "P".equals(sampleType) ? UNIT_PARTICULATE : UNIT_GAS; } } diff --git a/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatExportHandler.java b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatExportHandler.java new file mode 100644 index 0000000..4499ae7 --- /dev/null +++ b/jeecg-module-data-analyze/src/main/java/org/jeecg/service/impl/SampleStatExportHandler.java @@ -0,0 +1,45 @@ +package org.jeecg.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import org.jeecg.dto.SampleQueryRequestDTO; +import org.jeecg.entity.ExportType; +import org.jeecg.service.ExportHandler; +import org.jeecg.service.ISampleStatAnalysisService; +import org.jeecg.vo.SampleStatExcelVO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Collections; +import java.util.List; + +@Component +public class SampleStatExportHandler implements ExportHandler { + @Autowired + private ISampleStatAnalysisService sampleStatAnalysisService; + + @Override + public String getType() { + return ExportType.SAMPLE_STAT; + } + + @Override + public String getSheetName() { + return "样品统计分析"; + } + + @Override + public List queryData(SampleQueryRequestDTO reqDTO) { + List dataList = + sampleStatAnalysisService.getSampleStatData(reqDTO); + + if (CollectionUtils.isEmpty(dataList)) { + return Collections.emptyList(); + } + return dataList; + } + + @Override + public Class getExcelClass() { + return SampleStatExcelVO.class; + } +}