From 5420bd91f2473b1b34afd09ba85783104d9833b7 Mon Sep 17 00:00:00 2001 From: panbaolin <13071138970@163.com> Date: Fri, 12 Dec 2025 14:21:17 +0800 Subject: [PATCH] =?UTF-8?q?1.=E6=B7=BB=E5=8A=A0=E5=A4=A7=E5=B1=8F=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jeecg/common/constant/CommonConstant.java | 22 +- .../enums/TransportTaskCloseStatusEnum.java | 26 + .../enums/TransportTaskStatusEnum.java | 6 +- .../PrometheusServerProperties.java | 5 +- .../common/util/CoordinateTransformUtil.java | 36 + .../GardsNuclearTestingPlant.java | 6 +- .../base/entity/rnauto/GardsAnalyses.java | 157 ++ .../entity/rnauto/GardsTransportStatus.java | 30 + .../mapper/GardsTransportStatusMapper.java | 8 + .../MapSituationDisplayController.java | 59 + .../jeecg/gis/enums/GlobalSiteTypeEnum.java | 42 + .../service/MapSituationDisplayService.java | 53 + .../jeecg/gis/service/StationJsonData.java | 2121 +++++++++++++++++ .../impl/MapSituationDisplayServiceImpl.java | 303 +++ .../jeecg/gis/vo/DataProvisionEfficiency.java | 49 + .../org/jeecg/gis/vo/GlobalSiteInfoVO.java | 20 + .../ServiceClusterMonitorController.java | 79 + .../feign/ServiceMonitorFeignClient.java | 77 + .../IMSSampleAnalysesController.java | 49 + .../mapper/IMSSampleAnalysesMapper.java | 27 + .../mapper/xml/IMSSampleAnalysesMapper.xml | 45 + .../service/IMSSampleAnalysesService.java | 33 + .../impl/IMSSampleAnalysesServiceImpl.java | 64 + .../GardsNuclearTestingPlantController.java | 2 +- .../GardsNuclearTestingPlantServiceImpl.java | 2 +- .../controller/ServiceMonitorController.java | 42 +- .../monitor/service/HostMonitorService.java | 25 +- .../service/impl/HostMonitorServiceImpl.java | 65 +- .../service/impl/StationDataServiceImpl.java | 40 +- .../impl/TransportTaskServiceImpl.java | 4 +- .../java/org/jeecg/task/ProgressMonitor.java | 5 + .../org/jeecg/task/TransportTaskExec.java | 8 + 32 files changed, 3421 insertions(+), 89 deletions(-) create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskCloseStatusEnum.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CoordinateTransformUtil.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsAnalyses.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsTransportStatus.java create mode 100644 jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/GardsTransportStatusMapper.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/controller/MapSituationDisplayController.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/enums/GlobalSiteTypeEnum.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/MapSituationDisplayService.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/StationJsonData.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/impl/MapSituationDisplayServiceImpl.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/DataProvisionEfficiency.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/GlobalSiteInfoVO.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/monitor/controller/ServiceClusterMonitorController.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/monitor/feign/ServiceMonitorFeignClient.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/sample/controller/IMSSampleAnalysesController.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/IMSSampleAnalysesMapper.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/xml/IMSSampleAnalysesMapper.xml create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/IMSSampleAnalysesService.java create mode 100644 jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/impl/IMSSampleAnalysesServiceImpl.java diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index 8441c60..7ecd802 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -285,7 +285,27 @@ public interface CommonConstant { /** * 缓存所有核设施key */ - String ALL_NUCLEARFACILITY = "nuclearfacility"; + String ALL_NUCLEARFACILITY = "nuclearFacility"; + + /** + * 缓存所有核反应堆key GardsResearchReactors + */ + String ALL_RESEARCH_REACTORS = "researchReactors"; + + /** + * 缓存所有后处理厂key + */ + String ALL_NUCLEAR_FUEL_FACILITIES = "nuclearFuelFacilities"; + + /** + * 缓存核试验厂key + */ + String ALL_NUCLEAR_TEST_PLANT = "nuclearTestingPlant"; + + /** + * 缓存加速器key + */ + String ALL_ACCELERATOR = "accelerator"; /** * 输运模拟贡献分析数据KEY diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskCloseStatusEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskCloseStatusEnum.java new file mode 100644 index 0000000..4e42ef1 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskCloseStatusEnum.java @@ -0,0 +1,26 @@ +package org.jeecg.common.constant.enums; + +/** + * 输运模拟任务状态说明枚举 + */ +public enum TransportTaskCloseStatusEnum { + + /** + * 未关闭 + */ + NOT_CLOSED(0), + /** + * 已关闭 + */ + CLOSE(1); + + private Integer value; + + TransportTaskCloseStatusEnum(Integer value) { + this.value = value; + } + + public Integer getValue(){ + return this.value; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskStatusEnum.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskStatusEnum.java index 48421e2..ff25736 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskStatusEnum.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/enums/TransportTaskStatusEnum.java @@ -20,7 +20,11 @@ public enum TransportTaskStatusEnum { /** * 已完成 */ - COMPLETED(2); + COMPLETED(2), + /** + * 缺少气象数据 + */ + LACK_MET_DATA(3); private Integer value; diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java index c848a15..ace765f 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/properties/PrometheusServerProperties.java @@ -4,6 +4,9 @@ import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; +import java.util.LinkedHashMap; +import java.util.Map; + @Data @Component @ConfigurationProperties(prefix = "prometheus") @@ -17,7 +20,7 @@ public class PrometheusServerProperties { /** * node-exporter实例地址 */ - private String instance; + private Map instances = new LinkedHashMap<>(); /** * 监测的网卡名称 diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CoordinateTransformUtil.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CoordinateTransformUtil.java new file mode 100644 index 0000000..e875510 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/util/CoordinateTransformUtil.java @@ -0,0 +1,36 @@ +package org.jeecg.common.util; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class CoordinateTransformUtil { + + + /** + * 29°46’04”N + * 经纬度转换29°37′50″N -> 29.xxxxx + * @param lonOrLatStr + * @return + */ + public static Double lonAndLatConversion(String lonOrLatStr) { + if(lonOrLatStr.contains("°") && lonOrLatStr.contains("′") && lonOrLatStr.contains("″")){ + String cleanStr = lonOrLatStr.replaceAll("[NSEW\\s]", ""); + String[] parts = cleanStr.split("[°′″:\\s]+"); + String deg = parts[0]; + String min = parts.length > 1 && !parts[1].isEmpty() ? parts[1] : "0"; + String sec = parts.length > 2 && !parts[2].isEmpty() ? parts[2] : "0"; + BigDecimal degBigDecimal = new BigDecimal(deg); + BigDecimal minBigDecimal = new BigDecimal(min); + BigDecimal secBigDecimal = new BigDecimal(sec); + minBigDecimal = minBigDecimal.divide(new BigDecimal("60"), 6, RoundingMode.HALF_UP); + secBigDecimal = secBigDecimal.divide(new BigDecimal("3600"), 6, RoundingMode.HALF_UP); + return degBigDecimal.doubleValue() + minBigDecimal.doubleValue() + secBigDecimal.doubleValue(); + }else { + if(lonOrLatStr.contains("°") && !lonOrLatStr.contains("′") && !lonOrLatStr.contains("″")){ + String cleanStr = lonOrLatStr.replaceAll("[NSEW°\\s]", ""); + return Double.parseDouble(cleanStr); + } + } + return 0D; + } +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/configuration/GardsNuclearTestingPlant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/configuration/GardsNuclearTestingPlant.java index 54db86c..5ff2275 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/configuration/GardsNuclearTestingPlant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/configuration/GardsNuclearTestingPlant.java @@ -52,9 +52,9 @@ public class GardsNuclearTestingPlant implements Serializable { /** * 类型 */ - @Excel(name = "类型", width = 20,height = 20,orderNum="3") - @TableField(value = "TYPE") - private String type; + @Excel(name = "国家", width = 20,height = 20,orderNum="3") + @TableField(value = "COUNTRY") + private String country; /** * 详细信息(大文本字段) diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsAnalyses.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsAnalyses.java new file mode 100644 index 0000000..c2e3b10 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsAnalyses.java @@ -0,0 +1,157 @@ +package org.jeecg.modules.base.entity.rnauto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; +import java.io.Serializable; +import java.util.Date; + +/** + * gards_analyses数据表存储谱数据分析的基本信息,包括: + * 谱数据到达的时间、分析开始和结束时间、分析员姓名、使用的软件、谱分析使用的参数(基线类型、寻峰方式、核素识别方法)等 + */ +@Data +@TableName("RNAUTO.GARDS_ANALYSES") +public class GardsAnalyses implements Serializable { + + /** + * 分析ID号 + */ + @TableId(value = "idanalysis",type = IdType.AUTO) + private Integer idAnalysis; + /** + * 样品id + */ + @TableField(value = "SAMPLE_ID") + private Integer sampleId; + /** + * 分析开始时间 + */ + @TableField(value = "ANALYSISBEGIN") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date analysisBegin; + /** + * 分析结束时间 + */ + @TableField(value = "ANALYSISEND") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date analysisEnd; + /** + * Reviewed:交互,auto:自动 + */ + @TableField(value = "TYPE") + private String type; + /** + * 使用的软件名称 + */ + @TableField(value = "SOFTWARE") + private String software; + /** + * 软件版本号 + */ + @TableField(value = "SWVERSION") + private String swVersion; + /** + * 分析员名称 + */ + @TableField(value = "ANALYST") + private String analyst; + /** + * 基线计数方法描述 + */ + @TableField(value = "BASELINEMETHOD") + private String baselineMethod; + /** + * 寻峰方法描述 + */ + @TableField(value = "PEAKSMETHOD") + private String peaksMethod; + /** + * 核素识别方法描述 + */ + @TableField(value = "NUCLIDEMETHOD") + private String nuclideMethod; + /** + * 不确定度计算描述 + */ + @TableField(value = "UNCCALCMETHOD") + private String uncCalcMethod; + /** + * Lc计算方法描述 + */ + @TableField(value = "LCMETHOD") + private String lcMethod; + /** + * 寻峰起始道 + */ + @TableField(value = "SEARCHSTARTCHANNEL") + private Integer searchStartChannel; + /** + * 寻峰结束道 + */ + @TableField(value = "SEARCHENDCHANNEL") + private Integer searchEndChannel; + /** + * 寻峰阈值 + */ + @TableField(value = "SEARCHTHRESHOLD") + private Double searchThreshold; + /** + * 峰数目 + */ + @TableField(value = "NUMBEROFPEAKS") + private Integer numberOfPeaks; + /** + * 总计数 + */ + @TableField(value = "TOTALCOUNTS") + private Float totalCounts; + /** + * 分级结果 + */ + @TableField(value = "CATEGORY") + private Integer category; + /** + * 注释 + */ + @TableField(value = "COMMENTS") + private String comments; + + @TableField(value = "MODDATE") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date moddate; + + @TableField(value = "USEDGASPHD") + private String usedgasphd; + + @TableField(value = "USEDDETPHD") + private String useddetphd; + + @TableField(value = "USEDGASPHD_ID") + private Integer usedgasphdId; + + @TableField(value = "USEDDETPHD_ID") + private Integer useddetphdId; + + @TableField(value = "BASELINE_PATH") + private String baselinePath; + + @TableField(value = "LC_PATH") + private String lcPath; + + @TableField(value = "SCAC_PATH") + private String scacPath; + + @TableField(value = "LOG_PATH") + private String logPath; + + @TableField(value = "REPORT_PAHT") + private String reportPath; +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsTransportStatus.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsTransportStatus.java new file mode 100644 index 0000000..f051d3f --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/entity/rnauto/GardsTransportStatus.java @@ -0,0 +1,30 @@ +package org.jeecg.modules.base.entity.rnauto; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import java.util.Date; + +@Data +@TableName("RNAUTO.GARDS_TRANSPORT_STATUS") +public class GardsTransportStatus { + + + @TableId(value = "SAMPLE_ID",type = IdType.INPUT) + private Integer sampleId; + + @TableField(value = "TRANSPORT_STATUS") + private Integer transportStatus; + + @TableField(value = "DESCRIPTION") + private String description; + + @TableField(value = "CLOSE_STATUS") + private Integer closeStatus; + + @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") + private Date moddate; +} diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/GardsTransportStatusMapper.java b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/GardsTransportStatusMapper.java new file mode 100644 index 0000000..ed7e8d7 --- /dev/null +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/modules/base/mapper/GardsTransportStatusMapper.java @@ -0,0 +1,8 @@ +package org.jeecg.modules.base.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.jeecg.modules.base.entity.rnauto.GardsTransportStatus; + +public interface GardsTransportStatusMapper extends BaseMapper { + +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/controller/MapSituationDisplayController.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/controller/MapSituationDisplayController.java new file mode 100644 index 0000000..8adda9d --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/controller/MapSituationDisplayController.java @@ -0,0 +1,59 @@ +package org.jeecg.gis.controller; + +import lombok.RequiredArgsConstructor; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.gis.service.MapSituationDisplayService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("gis") +@RequiredArgsConstructor +public class MapSituationDisplayController { + + private final MapSituationDisplayService mapSituationDisplayService; + + @AutoLog(value = "查询全球站点信息") + @GetMapping("getGlobalSiteInfo") + public Result getGlobalSiteInfo() { + return Result.OK(mapSituationDisplayService.getGlobalSiteInfo()); + } + + @AutoLog(value = "查询IMS台站数据有效率信息") + @GetMapping("getDataProvisionEfficiency") + public Result getDataProvisionEfficiency() { + return Result.OK(mapSituationDisplayService.getDataProvisionEfficiency()); + } + + @AutoLog(value = "查询H设施站点信息") + @GetMapping("getAllNuclearfacility") + public Result getAllNuclearfacility() { + return Result.OK(mapSituationDisplayService.getAllNuclearfacility()); + } + + @AutoLog(value = "查询反应堆站点信息") + @GetMapping("getAllResearchReactors") + public Result getAllResearchReactors() { + return Result.OK(mapSituationDisplayService.getAllResearchReactors()); + } + + @AutoLog(value = "查询后处理厂站点信息") + @GetMapping("getAllNuclearFuelFacilitiy") + public Result getAllNuclearFuelFacilitiy() { + return Result.OK(mapSituationDisplayService.getAllNuclearFuelFacilitiy()); + } + + @AutoLog(value = "查询核试验厂站点信息") + @GetMapping("getAllNuclearTestPlant") + public Result getAllNuclearTestPlant() { + return Result.OK(mapSituationDisplayService.getAllNuclearTestPlant()); + } + + @AutoLog(value = "查询加速器站点信息") + @GetMapping("getAllAccelerator") + public Result getAllAccelerator() { + return Result.OK(mapSituationDisplayService.getAllAccelerator()); + } +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/enums/GlobalSiteTypeEnum.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/enums/GlobalSiteTypeEnum.java new file mode 100644 index 0000000..c5b890a --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/enums/GlobalSiteTypeEnum.java @@ -0,0 +1,42 @@ +package org.jeecg.gis.enums; + +/** + * 全球站点信息分类枚举 + */ +public enum GlobalSiteTypeEnum { + + /** + * 台站 + */ + STATION(1), + /** + * 核设施 + */ + NUCLEAR_FACILITY(2), + /** + * 反应堆 + */ + NUCLEAR_REACTOR(3), + /** + * 后处理厂 + */ + POST_PROCESSING_PLANT(4), + /** + * 核试验场 + */ + NUCLEAR_TESTING_PLANT(5), + /** + * 加速器 + */ + ACCELERATOR(6); + + private Integer value; + + GlobalSiteTypeEnum(int value) { + this.value = value; + } + + public Integer getValue() { + return value; + } +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/MapSituationDisplayService.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/MapSituationDisplayService.java new file mode 100644 index 0000000..8596efd --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/MapSituationDisplayService.java @@ -0,0 +1,53 @@ +package org.jeecg.gis.service; + +import org.jeecg.gis.vo.DataProvisionEfficiency; +import org.jeecg.gis.vo.GlobalSiteInfoVO; +import org.jeecg.modules.base.entity.configuration.*; +import java.util.List; + +/** + * 地图大屏态势展示 + */ +public interface MapSituationDisplayService { + + /** + * 获取全球站点信息包括:台站、核设施、反应堆、后处理厂、加速器核试验厂 + */ + List getGlobalSiteInfo(); + + /** + * 查询核设施站点信息 + * @return + */ + List getAllNuclearfacility(); + + /** + * 查询反应堆站点信息 + * @return + */ + List getAllResearchReactors(); + + /** + * 查询后处理厂站点信息 + * @return + */ + List getAllNuclearFuelFacilitiy(); + + /** + * 查询核试验地点信息 + * @return + */ + List getAllNuclearTestPlant(); + + /** + * 查询加速器站点信息 + * @return + */ + List getAllAccelerator(); + + /** + * 查询IMS台站数据有效率信息 + * @return + */ + List getDataProvisionEfficiency(); +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/StationJsonData.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/StationJsonData.java new file mode 100644 index 0000000..c4a1117 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/StationJsonData.java @@ -0,0 +1,2121 @@ +package org.jeecg.gis.service; + +public class StationJsonData { + + public static String getJson(){ + return "{\n" + + " \"success\": true,\n" + + " \"message\": \"\",\n" + + " \"code\": 200,\n" + + " \"result\": [\n" + + " {\n" + + " \"id\": \"110\",\n" + + " \"stationCode\": \"AUP10\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"115.981944\",\n" + + " \"lat\": \"-31.928888\",\n" + + " \"description\": \"Perth, WA, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/83.87\",\n" + + " \"phd\": \"91.67/91.67\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.67\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"179\",\n" + + " \"stationCode\": \"USP79\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-157.994972\",\n" + + " \"lat\": \"21.522444\",\n" + + " \"description\": \"Oahu, Hawaii, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"96.77/87.1\",\n" + + " \"phd\": \"90.32/89.78\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.61\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"164\",\n" + + " \"stationCode\": \"TZP64\",\n" + + " \"countryCode\": \"TZ\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"39.2\",\n" + + " \"lat\": \"-6.78\",\n" + + " \"description\": \"Dar Es Salaam, Tanzania.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"88.17/88.17\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.53\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"274\",\n" + + " \"stationCode\": \"USX74\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-99.769167\",\n" + + " \"lat\": \"37.166944\",\n" + + " \"description\": \"Ashland, KS, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"97.5/94.35\",\n" + + " \"phd\": \"94.24/84.45\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"93.26\",\n" + + " \"phdMetSoh\": \"68.09\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"149\",\n" + + " \"stationCode\": \"NOP49\",\n" + + " \"countryCode\": \"NO\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"15.39\",\n" + + " \"lat\": \"78.23\",\n" + + " \"description\": \"Spitsbergen, Norway\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"87.1/83.87\",\n" + + " \"phd\": \"87.1/86.29\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.48\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"213\",\n" + + " \"stationCode\": \"CMX13\",\n" + + " \"countryCode\": \"CM\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"10.15\",\n" + + " \"lat\": \"3.78\",\n" + + " \"description\": \"Cameroon\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"87.1/0.0\",\n" + + " \"phd\": \"86.29/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"108.45\",\n" + + " \"phdMetSoh\": \"55.51\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"175\",\n" + + " \"stationCode\": \"USP75\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-78.399167\",\n" + + " \"lat\": \"37.995556\",\n" + + " \"description\": \"Charlottesville, VA, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"95.16/95.16\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.81\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"176\",\n" + + " \"stationCode\": \"USP76\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-147.1\",\n" + + " \"lat\": \"64.67\",\n" + + " \"description\": \"Salchaket, Alaska, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"96.77/61.29\",\n" + + " \"phd\": \"93.82/90.86\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.75\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"177\",\n" + + " \"stationCode\": \"USP77\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"166.610861\",\n" + + " \"lat\": \"19.292278\",\n" + + " \"description\": \"Wake Island\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.35/94.35\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.77\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"178\",\n" + + " \"stationCode\": \"USP78\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-177.37\",\n" + + " \"lat\": \"28.22\",\n" + + " \"description\": \"Midway Islanda, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.35/94.35\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.77\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"279\",\n" + + " \"stationCode\": \"USX79\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-157.994972\",\n" + + " \"lat\": \"21.522444\",\n" + + " \"description\": \"Oahu, HI, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"98.33/92.34\",\n" + + " \"phd\": \"95.62/82.49\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.5\",\n" + + " \"phdMetSoh\": \"69.11\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"308\",\n" + + " \"stationCode\": \"FRL08\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"2.12\",\n" + + " \"lat\": \"48.35\",\n" + + " \"description\": \"Atomic Energy Commision(CEA/DASE),France\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"249\",\n" + + " \"stationCode\": \"NOX49\",\n" + + " \"countryCode\": \"NO\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"15.39\",\n" + + " \"lat\": \"78.23\",\n" + + " \"description\": \"Noble Gas Experi. Stn. Spitsbergen\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"78.13/75.6\",\n" + + " \"phd\": \"75.18/41.85\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.12\",\n" + + " \"phdMetSoh\": \"68.94\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA2\"\n" + + " },\n" + + " {\n" + + " \"id\": \"275\",\n" + + " \"stationCode\": \"USX75\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-78.399167\",\n" + + " \"lat\": \"37.995556\",\n" + + " \"description\": \"NG Charlottesville, VA, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"96.67/77.42\",\n" + + " \"phd\": \"92.51/69.7\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.7\",\n" + + " \"phdMetSoh\": \"69.2\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"277\",\n" + + " \"stationCode\": \"USX77\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"166.610861\",\n" + + " \"lat\": \"19.292278\",\n" + + " \"description\": \"Wake Island, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"98.33/81.85\",\n" + + " \"phd\": \"95.62/70.39\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"93.64\",\n" + + " \"phdMetSoh\": \"68.26\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"204\",\n" + + " \"stationCode\": \"AUX04\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"145.1\",\n" + + " \"lat\": \"-37.73\",\n" + + " \"description\": \"Victoria, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"197.5/95.97\",\n" + + " \"phd\": \"122.7/68.2\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.68\",\n" + + " \"phdMetSoh\": \"69.19\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"209\",\n" + + " \"stationCode\": \"AUX09\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"130.89\",\n" + + " \"lat\": \"-12.43\",\n" + + " \"description\": \"Darwin, NT, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"161.25/78.63\",\n" + + " \"phd\": \"99.19/55.99\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"94.65\",\n" + + " \"phdMetSoh\": \"68.72\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"171\",\n" + + " \"stationCode\": \"USP71\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-160.491367\",\n" + + " \"lat\": \"55.337133\",\n" + + " \"description\": \"Sand Point, Alaska, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"80.65/74.19\",\n" + + " \"phd\": \"81.45/80.65\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.26\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"107\",\n" + + " \"stationCode\": \"AUP07\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"158.95\",\n" + + " \"lat\": \"-54.5\",\n" + + " \"description\": \"Macquarie Island, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/90.32\",\n" + + " \"phd\": \"94.09/94.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"106\",\n" + + " \"stationCode\": \"AUP06\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"146.766111\",\n" + + " \"lat\": \"-19.249444\",\n" + + " \"description\": \"Townsville, QLD, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.89/94.89\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.8\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"172\",\n" + + " \"stationCode\": \"USP72\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-80.645306\",\n" + + " \"lat\": \"28.09925\",\n" + + " \"description\": \"Melbourne, FL, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"93.01/93.01\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.72\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"105\",\n" + + " \"stationCode\": \"AUP05\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"62.87\",\n" + + " \"lat\": \"-67.6\",\n" + + " \"description\": \"Mawson, Antarctica, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/90.32\",\n" + + " \"phd\": \"94.09/94.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"173\",\n" + + " \"stationCode\": \"USP73\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-64.050972\",\n" + + " \"lat\": \"-64.774528\",\n" + + " \"description\": \"Palmer Station, Antarctica, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"95.16/95.16\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.81\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"104\",\n" + + " \"stationCode\": \"AUP04\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"145.1\",\n" + + " \"lat\": \"-37.73\",\n" + + " \"description\": \"Melbourne, VIC, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.01/93.01\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.72\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"174\",\n" + + " \"stationCode\": \"USP74\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-99.769167\",\n" + + " \"lat\": \"37.166944\",\n" + + " \"description\": \"Ashland, KS, USA.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"95.16/95.16\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.81\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"113\",\n" + + " \"stationCode\": \"CMP13\",\n" + + " \"countryCode\": \"CM\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"10.15\",\n" + + " \"lat\": \"3.78\",\n" + + " \"description\": \"Edea, Cameroon\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.82/93.82\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.75\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"151\",\n" + + " \"stationCode\": \"PGP51\",\n" + + " \"countryCode\": \"PG\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"150.806611\",\n" + + " \"lat\": \"-2.581528\",\n" + + " \"description\": \"New Hanover,Papua New Guinea,Philippines\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"58.06/45.16\",\n" + + " \"phd\": \"57.8/48.12\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"2.31\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"109\",\n" + + " \"stationCode\": \"AUP09\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"130.89\",\n" + + " \"lat\": \"-12.43\",\n" + + " \"description\": \"Darwin, NT, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"87.1/80.65\",\n" + + " \"phd\": \"84.95/84.41\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.4\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"108\",\n" + + " \"stationCode\": \"AUP08\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"96.834472\",\n" + + " \"lat\": \"-12.188222\",\n" + + " \"description\": \"Cocos Islands, Australia.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.62/94.62\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.78\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"170\",\n" + + " \"stationCode\": \"USP70\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"-121.3625\",\n" + + " \"lat\": \"38.673333\",\n" + + " \"description\": \"Sacramento, CA, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/77.42\",\n" + + " \"phd\": \"88.98/82.53\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.56\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"302\",\n" + + " \"stationCode\": \"AUL02\",\n" + + " \"countryCode\": \"AU\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"145.1\",\n" + + " \"lat\": \"-37.7\",\n" + + " \"description\": \"Australian Radiation Laboratory, Melbourne, VIC, Australia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"144\",\n" + + " \"stationCode\": \"MXP44\",\n" + + " \"countryCode\": \"MX\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-114.06261\",\n" + + " \"lat\": \"27.957117\",\n" + + " \"description\": \"Guerrero Negro, Baja California\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"194\",\n" + + " \"stationCode\": \"MDP94\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"113.3\",\n" + + " \"lat\": \"23.1\",\n" + + " \"description\": \"Lanzhou, China.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"244\",\n" + + " \"stationCode\": \"MXX44\",\n" + + " \"countryCode\": \"MX\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-114.0\",\n" + + " \"lat\": \"28.0\",\n" + + " \"description\": \"Guerrero Negro, Baja California\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.33/74.19\",\n" + + " \"phd\": \"90.67/61.41\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"90.37\",\n" + + " \"phdMetSoh\": \"66.77\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"263\",\n" + + " \"stationCode\": \"SEX63\",\n" + + " \"countryCode\": \"SE\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"17.946389\",\n" + + " \"lat\": \"59.405\",\n" + + " \"description\": \"Stockholm, Sweden\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"98.75/95.56\",\n" + + " \"phd\": \"95.25/53.05\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.43\",\n" + + " \"phdMetSoh\": \"69.08\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA2\"\n" + + " },\n" + + " {\n" + + " \"id\": \"201\",\n" + + " \"stationCode\": \"ARX01\",\n" + + " \"countryCode\": \"AR\",\n" + + " \"type\": \"ARIX-2\",\n" + + " \"lon\": \"-58.465278\",\n" + + " \"lat\": \"-34.539861\",\n" + + " \"description\": \"Nobel Gas Experim. Stn.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"103\",\n" + + " \"stationCode\": \"ARP03\",\n" + + " \"countryCode\": \"AR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-71.157611\",\n" + + " \"lat\": \"-41.146472\",\n" + + " \"description\": \"Bariloche, Argentina.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/83.87\",\n" + + " \"phd\": \"92.74/92.74\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.71\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"101\",\n" + + " \"stationCode\": \"ARP01\",\n" + + " \"countryCode\": \"AR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-58.4653\",\n" + + " \"lat\": \"-34.5399\",\n" + + " \"description\": \"Buenos Aires, Argentina\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.74/92.47\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.71\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"180\",\n" + + " \"stationCode\": \"USP80\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"144.92825\",\n" + + " \"lat\": \"13.569917\",\n" + + " \"description\": \"Upi, Guam, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.09/94.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"161\",\n" + + " \"stationCode\": \"RUP61\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"37.251667\",\n" + + " \"lat\": \"56.740556\",\n" + + " \"description\": \"Dubna, Russian Federation.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.09/94.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"260\",\n" + + " \"stationCode\": \"RUX60\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"ARIX-4\",\n" + + " \"lon\": \"153.78\",\n" + + " \"lat\": \"53.1\",\n" + + " \"description\": \"Petropavlovsk, Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"25.59\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"127\",\n" + + " \"stationCode\": \"FRP27\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-149.57\",\n" + + " \"lat\": \"-17.57\",\n" + + " \"description\": \"Papeete, Tahiti, France\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"89.25/89.25\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.57\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"233\",\n" + + " \"stationCode\": \"DEX33\",\n" + + " \"countryCode\": \"DE\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"7.908056\",\n" + + " \"lat\": \"47.915833\",\n" + + " \"description\": \"Noble Gas Experim. stn.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"46.77/46.77\",\n" + + " \"phd\": \"86.6/7.2\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"107.77\",\n" + + " \"phdMetSoh\": \"55.3\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"128\",\n" + + " \"stationCode\": \"FRP28\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-61.533778\",\n" + + " \"lat\": \"16.263389\",\n" + + " \"description\": \"Pointe-a-Pitre, Guadeloupe, France.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/90.32\",\n" + + " \"phd\": \"88.44/88.17\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.54\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"129\",\n" + + " \"stationCode\": \"FRP29\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"55.586917\",\n" + + " \"lat\": \"-20.909\",\n" + + " \"description\": \"Runion, France.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/80.65\",\n" + + " \"phd\": \"81.18/78.49\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.25\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"160\",\n" + + " \"stationCode\": \"RUP60\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"158.78\",\n" + + " \"lat\": \"53.05\",\n" + + " \"description\": \"Petropavlovsk, Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"89.52/89.52\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.58\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"307\",\n" + + " \"stationCode\": \"FIL07\",\n" + + " \"countryCode\": \"FI\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"25.1\",\n" + + " \"lat\": \"60.2\",\n" + + " \"description\": \"STUK, Helsinki, Finland\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"310\",\n" + + " \"stationCode\": \"ITL10\",\n" + + " \"countryCode\": \"IT\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"41.9028\",\n" + + " \"lat\": \"12.49637\",\n" + + " \"description\": \"Labortory of the National Agency for the Protection of the Enivironment,Rome,Italy\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"227\",\n" + + " \"stationCode\": \"FRX27\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-149.57\",\n" + + " \"lat\": \"-17.57\",\n" + + " \"description\": \"Noble Gas Experim. stn. Papeete, Tahiti\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"45.16/45.16\",\n" + + " \"phd\": \"85.61/6.95\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"107.37\",\n" + + " \"phdMetSoh\": \"55.06\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"168\",\n" + + " \"stationCode\": \"GBP68\",\n" + + " \"countryCode\": \"GB\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-12.314639\",\n" + + " \"lat\": \"-37.068583\",\n" + + " \"description\": \"Tristan da Cunha, United Kingdom.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"93.28/93.01\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.73\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"133\",\n" + + " \"stationCode\": \"DEP33\",\n" + + " \"countryCode\": \"DE\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"7.9\",\n" + + " \"lat\": \"47.9\",\n" + + " \"description\": \"Schauinsland/Freiburg, Germany \",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.55/93.55\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.74\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"167\",\n" + + " \"stationCode\": \"GBP67\",\n" + + " \"countryCode\": \"GB\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-5.668056\",\n" + + " \"lat\": \"-15.942389\",\n" + + " \"description\": \"St. Helena, United Kingdom.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.74/92.47\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.71\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"229\",\n" + + " \"stationCode\": \"FRX29\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"55.586917\",\n" + + " \"lat\": \"-20.909\",\n" + + " \"description\": \"Noble Gas Experim. Stn. Reunion, France.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"46.77/40.32\",\n" + + " \"phd\": \"81.39/7.2\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"103.49\",\n" + + " \"phdMetSoh\": \"53.03\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"166\",\n" + + " \"stationCode\": \"GBP66\",\n" + + " \"countryCode\": \"GB\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"72.400556\",\n" + + " \"lat\": \"-7.303889\",\n" + + " \"description\": \"BIOT/Chagos Archipelago, United Kingdom.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.82/93.82\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.75\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"312\",\n" + + " \"stationCode\": \"NZL12\",\n" + + " \"countryCode\": \"NZ\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"172.6\",\n" + + " \"lat\": \"-43.5\",\n" + + " \"description\": \"National Radiation Laboratory,Christchurch, New Zealand.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"268\",\n" + + " \"stationCode\": \"GBX68\",\n" + + " \"countryCode\": \"GB\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-12.314639\",\n" + + " \"lat\": \"-37.068583\",\n" + + " \"description\": \"Tristan da Cunha, UK\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"95.0/90.32\",\n" + + " \"phd\": \"91.36/79.26\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"93.55\",\n" + + " \"phdMetSoh\": \"68.22\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"266\",\n" + + " \"stationCode\": \"GBX66\",\n" + + " \"countryCode\": \"GB\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"72.400556\",\n" + + " \"lat\": \"-7.303889\",\n" + + " \"description\": \"BIOT/Chagos Archipelago, United Kingdom.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"98.33/92.74\",\n" + + " \"phd\": \"95.28/79.38\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.65\",\n" + + " \"phdMetSoh\": \"69.18\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"261\",\n" + + " \"stationCode\": \"RUX61\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"ARIX-2\",\n" + + " \"lon\": \"37.251667\",\n" + + " \"lat\": \"56.740556\",\n" + + " \"description\": \"Exp. Nobel Gas, Russian Federation.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"25.59\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"311\",\n" + + " \"stationCode\": \"JPL11\",\n" + + " \"countryCode\": \"JP\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"140.6\",\n" + + " \"lat\": \"36.43\",\n" + + " \"description\": \"Japan Atomic Energy Research Institute, Tokai, Ibaraki, Japan\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"130\",\n" + + " \"stationCode\": \"FRP30\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"70.256444\",\n" + + " \"lat\": \"-49.350722\",\n" + + " \"description\": \"Port-aux-Francais, Kerguelen, France\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"131\",\n" + + " \"stationCode\": \"FRP31\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-52.689667\",\n" + + " \"lat\": \"5.171333\",\n" + + " \"description\": \"Kourou, French Guiana, Fench.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"83.6/83.6\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.34\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"156\",\n" + + " \"stationCode\": \"RUP56\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"112.641028\",\n" + + " \"lat\": \"59.615889\",\n" + + " \"description\": \"Peleduy, Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/90.32\",\n" + + " \"phd\": \"91.4/88.17\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.66\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"154\",\n" + + " \"stationCode\": \"RUP54\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"49.413361\",\n" + + " \"lat\": \"58.586\",\n" + + " \"description\": \"Kirov, Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"86.02/86.02\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.44\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"230\",\n" + + " \"stationCode\": \"FRX30\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-70.256306\",\n" + + " \"lat\": \"-49.350722\",\n" + + " \"description\": \"Noble Gas Experim. Stn. TAAF, France.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"46.77/46.77\",\n" + + " \"phd\": \"87.34/7.2\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"107.06\",\n" + + " \"phdMetSoh\": \"54.99\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"143\",\n" + + " \"stationCode\": \"MRP43\",\n" + + " \"countryCode\": \"MR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-15.92\",\n" + + " \"lat\": \"18.14\",\n" + + " \"description\": \"Nouakchott, Mauritania\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"19.35/16.13\",\n" + + " \"phd\": \"19.09/19.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"231\",\n" + + " \"stationCode\": \"FRX31\",\n" + + " \"countryCode\": \"FR\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-52.689667\",\n" + + " \"lat\": \"5.171333\",\n" + + " \"description\": \"Cayenne, French Guiana\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"46.77/45.16\",\n" + + " \"phd\": \"86.1/7.2\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"108.56\",\n" + + " \"phdMetSoh\": \"55.65\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"134\",\n" + + " \"stationCode\": \"ISP34\",\n" + + " \"countryCode\": \"IS\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-21.9\",\n" + + " \"lat\": \"64.4\",\n" + + " \"description\": \"Reykjavik,Iceland\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"74.19/41.94\",\n" + + " \"phd\": \"70.43/50.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"2.82\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"243\",\n" + + " \"stationCode\": \"MRX43\",\n" + + " \"countryCode\": \"MR\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-15.92\",\n" + + " \"lat\": \"18.14\",\n" + + " \"description\": \"Nouakchott, Mauritania\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"24.17/0.0\",\n" + + " \"phd\": \"39.98/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"25.59\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"258\",\n" + + " \"stationCode\": \"RUX58\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"ARIX-4\",\n" + + " \"lon\": \"131.9\",\n" + + " \"lat\": \"43.7\",\n" + + " \"description\": \"Ussuriysk, Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"25.59\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"159\",\n" + + " \"stationCode\": \"RUP59\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"84.7895\",\n" + + " \"lat\": \"53.935806\",\n" + + " \"description\": \"Zalesovo, Russian Federation.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/0.0\",\n" + + " \"phd\": \"86.56/86.56\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.46\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"309\",\n" + + " \"stationCode\": \"ILL09\",\n" + + " \"countryCode\": \"IL\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"31.8779\",\n" + + " \"lat\": \"34.7394\",\n" + + " \"description\": \"Soreq Nuclear Research Centre,Yavne,Israel\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"158\",\n" + + " \"stationCode\": \"RUP58\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"132.002444\",\n" + + " \"lat\": \"44.151556\",\n" + + " \"description\": \"Ussuriysk, Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/90.32\",\n" + + " \"phd\": \"86.83/83.87\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.47\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"152\",\n" + + " \"stationCode\": \"PHP52\",\n" + + " \"countryCode\": \"PH\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"121.369639\",\n" + + " \"lat\": \"14.581861\",\n" + + " \"description\": \"Tanay, Philippines\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/83.87\",\n" + + " \"phd\": \"84.68/80.65\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.39\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"303\",\n" + + " \"stationCode\": \"ATL03\",\n" + + " \"countryCode\": \"AT\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"13.31\",\n" + + " \"lat\": \"47.58\",\n" + + " \"description\": \"Austrian Research Center, Seibersdorf, Austria\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"238\",\n" + + " \"stationCode\": \"JPX38\",\n" + + " \"countryCode\": \"JP\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"139.079722\",\n" + + " \"lat\": \"36.299972\",\n" + + " \"description\": \"Takasaki, Gunma, Japan\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"98.13/94.96\",\n" + + " \"phd\": \"95.07/52.6\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.52\",\n" + + " \"phdMetSoh\": \"69.12\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA2\"\n" + + " },\n" + + " {\n" + + " \"id\": \"121\",\n" + + " \"stationCode\": \"CNP21\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"104.2\",\n" + + " \"lat\": \"36.0\",\n" + + " \"description\": \"Lanzhou, China.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"45.16/45.16\",\n" + + " \"phd\": \"83.87/83.87\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.62\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"216\",\n" + + " \"stationCode\": \"CAX16\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-114.46875\",\n" + + " \"lat\": \"62.476222\",\n" + + " \"description\": \"Noble Gas Experim. stn., Yellokn Canada.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"91.94/91.94\",\n" + + " \"phd\": \"92.8/14.14\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"107.24\",\n" + + " \"phdMetSoh\": \"55.31\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"122\",\n" + + " \"stationCode\": \"CNP22\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"113.3\",\n" + + " \"lat\": \"23.1\",\n" + + " \"description\": \"Lanzhou, China.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"50.0/50.0\",\n" + + " \"phd\": \"84.86/84.86\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.67\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"117\",\n" + + " \"stationCode\": \"CAP17\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-52.735667\",\n" + + " \"lat\": \"47.585972\",\n" + + " \"description\": \"St. John`s, N.L., Canda.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.47/92.47\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.7\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"137\",\n" + + " \"stationCode\": \"JPP37\",\n" + + " \"countryCode\": \"JP\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"127.9\",\n" + + " \"lat\": \"26.5\",\n" + + " \"description\": \"Okinawa, Japan\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.62/94.62\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.78\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"120\",\n" + + " \"stationCode\": \"CNP20\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"116.4\",\n" + + " \"lat\": \"39.95\",\n" + + " \"description\": \"Beijing, China.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"46.77/46.77\",\n" + + " \"phd\": \"87.84/87.84\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.79\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"138\",\n" + + " \"stationCode\": \"JPP38\",\n" + + " \"countryCode\": \"JP\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"139.0\",\n" + + " \"lat\": \"36.3\",\n" + + " \"description\": \"Takasaki Gunma,Japan \",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.82/93.82\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.75\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"115\",\n" + + " \"stationCode\": \"CAP15\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-94.969028\",\n" + + " \"lat\": \"74.705306\",\n" + + " \"description\": \"Resolute, NU, Canada\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.09/94.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"116\",\n" + + " \"stationCode\": \"CAP16\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-114.46875\",\n" + + " \"lat\": \"62.476222\",\n" + + " \"description\": \"Yelloknife, N.W.T., Canada.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.74/92.74\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.71\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"222\",\n" + + " \"stationCode\": \"CNX22\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"113.3\",\n" + + " \"lat\": \"23.1\",\n" + + " \"description\": \"Test ARSA for Guangzhou, China\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"97.5/70.97\",\n" + + " \"phd\": \"94.47/54.03\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.18\",\n" + + " \"phdMetSoh\": \"68.97\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"114\",\n" + + " \"stationCode\": \"CAP14\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-123.445388\",\n" + + " \"lat\": \"48.651305\",\n" + + " \"description\": \"Sidney, B.C., Canada\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.47/92.47\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.7\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"220\",\n" + + " \"stationCode\": \"CNX20\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"116.4\",\n" + + " \"lat\": \"39.95\",\n" + + " \"description\": \"Test ARSA for China\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"32.26/29.03\",\n" + + " \"phd\": \"69.73/4.47\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"102.93\",\n" + + " \"phdMetSoh\": \"52.26\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"219\",\n" + + " \"stationCode\": \"CLX19\",\n" + + " \"countryCode\": \"CL\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-109.345\",\n" + + " \"lat\": \"-27.125833\",\n" + + " \"description\": \"Las Condes, Santiago - Chile\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"92.08/86.69\",\n" + + " \"phd\": \"91.01/75.92\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"92.05\",\n" + + " \"phdMetSoh\": \"67.54\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"140\",\n" + + " \"stationCode\": \"KWP40\",\n" + + " \"countryCode\": \"KW\",\n" + + " \"type\": \"RASA\",\n" + + " \"lon\": \"47.905389\",\n" + + " \"lat\": \"29.339972\",\n" + + " \"description\": \"Kuwait City, Kuwait.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"83.87/80.65\",\n" + + " \"phd\": \"84.14/80.91\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.37\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"126\",\n" + + " \"stationCode\": \"FJP26\",\n" + + " \"countryCode\": \"FJ\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"177.445\",\n" + + " \"lat\": \"-17.759722\",\n" + + " \"description\": \"Nadi, Fiji.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"94.09/94.09\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.76\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"217\",\n" + + " \"stationCode\": \"CAX17\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-52.735667\",\n" + + " \"lat\": \"47.585972\",\n" + + " \"description\": \"Noble Gas Experim. stn., Yellokn Canada.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"91.94/91.94\",\n" + + " \"phd\": \"87.84/14.14\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"94.89\",\n" + + " \"phdMetSoh\": \"49.19\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"315\",\n" + + " \"stationCode\": \"GBL15\",\n" + + " \"countryCode\": \"GB\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"-1.0\",\n" + + " \"lat\": \"52.0\",\n" + + " \"description\": \"AWE Aldermaston, United Kingdom.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"119\",\n" + + " \"stationCode\": \"CLP19\",\n" + + " \"countryCode\": \"CL\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-109.345\",\n" + + " \"lat\": \"-27.125833\",\n" + + " \"description\": \"Hanga Roa, Easter Island, Chile\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.2/92.2\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.69\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"118\",\n" + + " \"stationCode\": \"CLP18\",\n" + + " \"countryCode\": \"CL\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-70.878306\",\n" + + " \"lat\": \"-53.137139\",\n" + + " \"description\": \"Punta Arenas, Chile.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"83.87/83.87\",\n" + + " \"phd\": \"85.48/85.48\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.42\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"136\",\n" + + " \"stationCode\": \"IRP36\",\n" + + " \"countryCode\": \"IR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"52.0\",\n" + + " \"lat\": \"35.0\",\n" + + " \"description\": \"Tehran, Iran (Islamic Republic of) \",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"142\",\n" + + " \"stationCode\": \"MYP42\",\n" + + " \"countryCode\": \"MY\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"101.37\",\n" + + " \"lat\": \"4.48\",\n" + + " \"description\": \"Tanah Rata, Malaysia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.55/93.55\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.74\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"301\",\n" + + " \"stationCode\": \"ARL01\",\n" + + " \"countryCode\": \"AR\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"-58.5\",\n" + + " \"lat\": \"-34.5\",\n" + + " \"description\": \"National Board of Nuclear Regulation, Buenos Aires, Argentina\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"316\",\n" + + " \"stationCode\": \"USL16\",\n" + + " \"countryCode\": \"US\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"-119.28\",\n" + + " \"lat\": \"46.35\",\n" + + " \"description\": \"Pacific Northwest NL, WA, USA\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"304\",\n" + + " \"stationCode\": \"BRL04\",\n" + + " \"countryCode\": \"BR\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"-22.9068\",\n" + + " \"lat\": \"-43.1728\",\n" + + " \"description\": \"Institute of Radiation Protection and Dosimetry,Rio de Janeiro,Brazil\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"163\",\n" + + " \"stationCode\": \"SEP63\",\n" + + " \"countryCode\": \"SE\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"17.946389\",\n" + + " \"lat\": \"59.405\",\n" + + " \"description\": \"Stockholm, Sweden\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/83.87\",\n" + + " \"phd\": \"90.32/83.87\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.61\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"314\",\n" + + " \"stationCode\": \"SAL14\",\n" + + " \"countryCode\": \"SA\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"-27.055086\",\n" + + " \"lat\": \"32.52595\",\n" + + " \"description\": \"Atomic Energy Corporation,Pelindaba,South Africa\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"306\",\n" + + " \"stationCode\": \"CNL06\",\n" + + " \"countryCode\": \"CN\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"115.333\",\n" + + " \"lat\": \"40.01\",\n" + + " \"description\": \"Beijing, China.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"NO\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"139\",\n" + + " \"stationCode\": \"KIP39\",\n" + + " \"countryCode\": \"KI\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-157.391\",\n" + + " \"lat\": \"2.005\",\n" + + " \"description\": \"Kiritimati, Kiribati.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"91.13/91.13\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.65\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"150\",\n" + + " \"stationCode\": \"PAP50\",\n" + + " \"countryCode\": \"PA\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-79.533083\",\n" + + " \"lat\": \"8.983583\",\n" + + " \"description\": \"Panama City, Panama\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"87.1/77.42\",\n" + + " \"phd\": \"84.14/77.42\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.37\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"211\",\n" + + " \"stationCode\": \"BRX11\",\n" + + " \"countryCode\": \"BR\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-43.416944\",\n" + + " \"lat\": \"-22.991944\",\n" + + " \"description\": \"Noble gas station in Rio de Janeiro\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"86.25/83.47\",\n" + + " \"phd\": \"83.24/46.15\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.23\",\n" + + " \"phdMetSoh\": \"68.99\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA2\"\n" + + " },\n" + + " {\n" + + " \"id\": \"313\",\n" + + " \"stationCode\": \"RUL13\",\n" + + " \"countryCode\": \"RU\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"55.755826\",\n" + + " \"lat\": \"37.6173\",\n" + + " \"description\": \"Central Radiation Control Laboratory, Ministry of Defense Special Verification Service,Moscow,Russian Federation\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"153\",\n" + + " \"stationCode\": \"PTP53\",\n" + + " \"countryCode\": \"PT\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-25.698361\",\n" + + " \"lat\": \"37.740556\",\n" + + " \"description\": \"Ponta Delgada, Sao Miguel, Azores\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"250\",\n" + + " \"stationCode\": \"PAX50\",\n" + + " \"countryCode\": \"PA\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-79.533083\",\n" + + " \"lat\": \"8.983583\",\n" + + " \"description\": \"Spalax Noble Gas Experim. Stn., Panama.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"45.16/43.55\",\n" + + " \"phd\": \"85.36/6.95\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"107.17\",\n" + + " \"phdMetSoh\": \"54.96\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"good\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"111\",\n" + + " \"stationCode\": \"BRP11\",\n" + + " \"countryCode\": \"BR\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-43.416944\",\n" + + " \"lat\": \"-22.991944\",\n" + + " \"description\": \"Rio de Janeiro, Brazil.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"90.32/90.32\",\n" + + " \"phd\": \"92.74/92.74\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.71\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"205\",\n" + + " \"stationCode\": \"CAX05\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"-75.686\",\n" + + " \"lat\": \"45.374\",\n" + + " \"description\": \"Noble Gas Experim. stn.Ottowa, Canada.\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"111.29/109.68\",\n" + + " \"phd\": \"96.31/31.34\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"95.72\",\n" + + " \"phdMetSoh\": \"50.27\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SPALAX_PLC\"\n" + + " },\n" + + " {\n" + + " \"id\": \"145\",\n" + + " \"stationCode\": \"MNP45\",\n" + + " \"countryCode\": \"MN\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"106.33\",\n" + + " \"lat\": \"47.89\",\n" + + " \"description\": \"Ulaanbaatar, Mongolia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/90.32\",\n" + + " \"phd\": \"86.56/83.6\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.46\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"147\",\n" + + " \"stationCode\": \"NZP47\",\n" + + " \"countryCode\": \"NZ\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"173.29\",\n" + + " \"lat\": \"-35.07\",\n" + + " \"description\": \"Kaitaia, New Zealand\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"95.16/95.16\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.81\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"146\",\n" + + " \"stationCode\": \"NZP46\",\n" + + " \"countryCode\": \"NZ\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-176.48\",\n" + + " \"lat\": \"-43.82\",\n" + + " \"description\": \"Chatham Island\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"58.06/51.61\",\n" + + " \"phd\": \"55.38/52.15\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"2.22\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"245\",\n" + + " \"stationCode\": \"MNX45\",\n" + + " \"countryCode\": \"MN\",\n" + + " \"type\": \"SPALAX\",\n" + + " \"lon\": \"106.33\",\n" + + " \"lat\": \"47.89\",\n" + + " \"description\": \"MNX45, Mongolia\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"40.32\",\n" + + " \"phdMetSoh\": \"19.29\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": \"SPALAX\"\n" + + " },\n" + + " {\n" + + " \"id\": \"123\",\n" + + " \"stationCode\": \"CKP23\",\n" + + " \"countryCode\": \"CK\",\n" + + " \"type\": \"CINDER\",\n" + + " \"lon\": \"-159.81\",\n" + + " \"lat\": \"-21.2\",\n" + + " \"description\": \"Rarotonga, Cook Islands\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"93.55/93.55\",\n" + + " \"phd\": \"93.55/93.55\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"3.74\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": null\n" + + " },\n" + + " {\n" + + " \"id\": \"246\",\n" + + " \"stationCode\": \"NZX46\",\n" + + " \"countryCode\": \"NZ\",\n" + + " \"type\": \"SAUNA\",\n" + + " \"lon\": \"-176.48\",\n" + + " \"lat\": \"-43.82\",\n" + + " \"description\": \"Chatham Island\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"91.67/73.39\",\n" + + " \"phd\": \"88.36/61.98\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"89.56\",\n" + + " \"phdMetSoh\": \"66.4\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"excellent\",\n" + + " \"efficCalculType\": \"SAUNA\"\n" + + " },\n" + + " {\n" + + " \"id\": \"305\",\n" + + " \"stationCode\": \"CAL05\",\n" + + " \"countryCode\": \"CA\",\n" + + " \"type\": \"LAB\",\n" + + " \"lon\": \"-75.72\",\n" + + " \"lat\": \"45.39\",\n" + + " \"description\": \"Health Canada, Ottawa, Ont, Canada\",\n" + + " \"status\": \"Operating\",\n" + + " \"phdf\": \"0.0/0.0\",\n" + + " \"phd\": \"0.0/0.0\",\n" + + " \"met\": \"0.0\",\n" + + " \"soh\": \"0.0\",\n" + + " \"phdMetSoh\": \"0.0\",\n" + + " \"used\": \"YES\",\n" + + " \"quality\": \"bad\",\n" + + " \"efficCalculType\": null\n" + + " }\n" + + " ],\n" + + " \"timestamp\": 1765450950704\n" + + "}"; + } +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/impl/MapSituationDisplayServiceImpl.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/impl/MapSituationDisplayServiceImpl.java new file mode 100644 index 0000000..db86ece --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/service/impl/MapSituationDisplayServiceImpl.java @@ -0,0 +1,303 @@ +package org.jeecg.gis.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.text.StrSplitter; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.dynamic.datasource.annotation.DS; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import lombok.RequiredArgsConstructor; +import org.apache.logging.log4j.util.Strings; +import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.util.RedisUtil; +import org.jeecg.gis.enums.GlobalSiteTypeEnum; +import org.jeecg.gis.service.MapSituationDisplayService; +import org.jeecg.gis.service.StationJsonData; +import org.jeecg.gis.vo.DataProvisionEfficiency; +import org.jeecg.gis.vo.GlobalSiteInfoVO; +import org.jeecg.modules.base.entity.configuration.*; +import org.jeecg.modules.base.mapper.*; +import org.springframework.stereotype.Service; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Service +@RequiredArgsConstructor +public class MapSituationDisplayServiceImpl implements MapSituationDisplayService { + + private final RedisUtil redisUtil; + private final GardsNuclearReactorsMapper nuclearReactorsMapper; + private final GardsStationsMapper stationsMapper; + private final GardsResearchReactorsMapper researchReactorsMapper; + private final GardsNuclearFuelFacilitiesMapper nuclearFuelFacilitiesMapper; + private final GardsNuclearTestingPlantMapper nuclearTestingPlantMapper; + private final GardsAcceleratorMapper acceleratorMapper; + + /** + * 获取全球站点信息包括:台站、核设施、反应堆、后处理厂、加速器核试验厂 + */ + @DS("ora") + @Override + public List getGlobalSiteInfo() { + List list = new ArrayList<>(); + list.addAll(this.getIMSStations()); + list.addAll(this.getNuclearfacilitys()); + list.addAll(this.getNuclearReactors()); + list.addAll(this.getNuclearFuelFacilities()); + list.addAll(this.getNuclearTestPlant()); + list.addAll(this.getAccelerator()); + return list; + } + + /** + * 查询核设施站点信息 + * @return + */ + @Override + public List getAllNuclearfacility() { + return (List) redisUtil.get(CommonConstant.ALL_NUCLEARFACILITY); + } + + /** + * 查询反应堆站点信息 + * @return + */ + @Override + public List getAllResearchReactors() { + return (List) redisUtil.get(CommonConstant.ALL_RESEARCH_REACTORS); + } + + /** + * 查询后处理厂站点信息 + * @return + */ + @Override + public List getAllNuclearFuelFacilitiy() { + return (List) redisUtil.get(CommonConstant.ALL_NUCLEAR_FUEL_FACILITIES); + } + + /** + * 查询核试验厂站点信息 + * @return + */ + @Override + public List getAllNuclearTestPlant() { + List list = (List) redisUtil.get(CommonConstant.ALL_NUCLEAR_TEST_PLANT); + list.forEach(gardsNuclearTestingPlant -> { + gardsNuclearTestingPlant.setInfo(Strings.EMPTY); + }); + return list; + } + + /** + * 查询加速器站点信息 + * @return + */ + @Override + public List getAllAccelerator() { + List list = (List) redisUtil.get(CommonConstant.ALL_ACCELERATOR); + list.forEach(gardsAccelerator -> { + gardsAccelerator.setFacilityName(Strings.EMPTY); + gardsAccelerator.setWebsite(Strings.EMPTY); + }); + return list; + } + + /** + * 查询IMS台站数据有效率信息 + * + * @return + */ + @Override + public List getDataProvisionEfficiency() { + List stations = (List)redisUtil.get(CommonConstant.ALL_STATIONS); + JSONObject jsonObject = JSON.parseObject(StationJsonData.getJson()); + if (jsonObject.containsKey("result")) { + Object obj = jsonObject.get("result"); + if (obj instanceof JSONArray && Objects.nonNull(obj)) { + List dataProvisionEfficiency = ((JSONArray) obj).toJavaList(DataProvisionEfficiency.class); + dataProvisionEfficiency.forEach(data -> { + for (GardsStations station : stations) { + if (station.getStationCode().equals(data.getStationCode())) { + data.setElevation(station.getElevation()); + data.setDateBegin(station.getDateBegin()); + data.setDateEnd(station.getDateEnd()); + } + } + }); + return dataProvisionEfficiency; + } + } + return CollUtil.newArrayList(); + } + + /** + * 获取台站 + * @return + */ + private List getIMSStations(){ + List stations; + if(redisUtil.hasKey(CommonConstant.ALL_STATIONS)){ + stations = (List)redisUtil.get(CommonConstant.ALL_STATIONS); + }else { + stations = stationsMapper.selectList(new LambdaQueryWrapper<>()); + redisUtil.set(CommonConstant.ALL_STATIONS,stations); + } + if(CollUtil.isNotEmpty(stations)){ + List list = new ArrayList<>(); + for(GardsStations station:stations){ + GlobalSiteInfoVO globalSiteInfo = new GlobalSiteInfoVO(); + globalSiteInfo.setId(station.getStationId()); + globalSiteInfo.setName(station.getStationCode()); + globalSiteInfo.setLon(station.getLon()); + globalSiteInfo.setLat(station.getLat()); + globalSiteInfo.setSiteType(GlobalSiteTypeEnum.STATION.getValue()); + list.add(globalSiteInfo); + } + return list; + } + return List.of(); + } + + /** + * 获取核设施 + * @return + */ + private List getNuclearfacilitys(){ + List nuclearReactors; + if(redisUtil.hasKey(CommonConstant.ALL_NUCLEARFACILITY)){ + nuclearReactors = (List) redisUtil.get(CommonConstant.ALL_NUCLEARFACILITY); + }else { + nuclearReactors = nuclearReactorsMapper.selectList(new LambdaQueryWrapper<>()); + redisUtil.set(CommonConstant.ALL_NUCLEARFACILITY, nuclearReactors); + } + if(CollUtil.isNotEmpty(nuclearReactors)){ + List list = new ArrayList<>(); + for(GardsNuclearReactors nuclearReactor : nuclearReactors){ + GlobalSiteInfoVO globalSiteInfo = new GlobalSiteInfoVO(); + globalSiteInfo.setId(nuclearReactor.getId()); + globalSiteInfo.setName(nuclearReactor.getUnitName()); + globalSiteInfo.setLon(nuclearReactor.getLongitude()); + globalSiteInfo.setLat(nuclearReactor.getLatitude()); + globalSiteInfo.setSiteType(GlobalSiteTypeEnum.NUCLEAR_FACILITY.getValue()); + list.add(globalSiteInfo); + } + return list; + } + return List.of(); + } + + /** + * 获取反应堆 + * @return + */ + private List getNuclearReactors(){ + List researchReactors; + if(redisUtil.hasKey(CommonConstant.ALL_RESEARCH_REACTORS)){ + researchReactors = (List)redisUtil.get(CommonConstant.ALL_RESEARCH_REACTORS); + }else { + researchReactors = researchReactorsMapper.selectList(new LambdaQueryWrapper<>()); + redisUtil.set(CommonConstant.ALL_RESEARCH_REACTORS,researchReactors); + } + if(CollUtil.isNotEmpty(researchReactors)){ + List list = new ArrayList<>(); + for(GardsResearchReactors nuclearReactor:researchReactors){ + GlobalSiteInfoVO globalSiteInfo = new GlobalSiteInfoVO(); + globalSiteInfo.setId(nuclearReactor.getId()); + globalSiteInfo.setName(nuclearReactor.getFacilityName()); + globalSiteInfo.setLon(nuclearReactor.getLongitude()); + globalSiteInfo.setLat(nuclearReactor.getLatitude()); + globalSiteInfo.setSiteType(GlobalSiteTypeEnum.NUCLEAR_REACTOR.getValue()); + list.add(globalSiteInfo); + } + return list; + } + return List.of(); + } + + /** + * 获取后处理厂 + * @return + */ + private List getNuclearFuelFacilities(){ + List nuclearFuelFacilities; + if(redisUtil.hasKey(CommonConstant.ALL_NUCLEAR_FUEL_FACILITIES)){ + nuclearFuelFacilities = (List)redisUtil.get(CommonConstant.ALL_NUCLEAR_FUEL_FACILITIES); + }else { + nuclearFuelFacilities = nuclearFuelFacilitiesMapper.selectList(new LambdaQueryWrapper<>()); + redisUtil.set(CommonConstant.ALL_NUCLEAR_FUEL_FACILITIES,nuclearFuelFacilities); + } + if(CollUtil.isNotEmpty(nuclearFuelFacilities)){ + List list = new ArrayList<>(); + for(GardsNuclearFuelFacilities nuclearFuelFacilitie:nuclearFuelFacilities){ + GlobalSiteInfoVO globalSiteInfo = new GlobalSiteInfoVO(); + globalSiteInfo.setId(nuclearFuelFacilitie.getId()); + globalSiteInfo.setName(nuclearFuelFacilitie.getFacilityName()); + globalSiteInfo.setLon(nuclearFuelFacilitie.getLongitude()); + globalSiteInfo.setLat(nuclearFuelFacilitie.getLatitude()); + globalSiteInfo.setSiteType(GlobalSiteTypeEnum.POST_PROCESSING_PLANT.getValue()); + list.add(globalSiteInfo); + } + return list; + } + return List.of(); + } + + /** + * 获取核试验场 + * @return + */ + private List getNuclearTestPlant(){ + List nuclearTestingPlants; + if(redisUtil.hasKey(CommonConstant.ALL_NUCLEAR_TEST_PLANT)){ + nuclearTestingPlants = (List)redisUtil.get(CommonConstant.ALL_NUCLEAR_TEST_PLANT); + }else { + nuclearTestingPlants = nuclearTestingPlantMapper.selectList(new LambdaQueryWrapper<>()); + redisUtil.set(CommonConstant.ALL_NUCLEAR_TEST_PLANT,nuclearTestingPlants); + } + if(CollUtil.isNotEmpty(nuclearTestingPlants)){ + List list = new ArrayList<>(); + for(GardsNuclearTestingPlant nuclearTestingPlant:nuclearTestingPlants){ + GlobalSiteInfoVO globalSiteInfo = new GlobalSiteInfoVO(); + globalSiteInfo.setId(nuclearTestingPlant.getId()); + globalSiteInfo.setName(nuclearTestingPlant.getName()); + globalSiteInfo.setLon(nuclearTestingPlant.getLongitude()); + globalSiteInfo.setLat(nuclearTestingPlant.getLatitude()); + globalSiteInfo.setSiteType(GlobalSiteTypeEnum.NUCLEAR_TESTING_PLANT.getValue()); + list.add(globalSiteInfo); + } + return list; + } + return List.of(); + } + + /** + * 获取加速器 + * @return + */ + private List getAccelerator(){ + List accelerators; + if(redisUtil.hasKey(CommonConstant.ALL_ACCELERATOR)){ + accelerators = (List)redisUtil.get(CommonConstant.ALL_ACCELERATOR); + }else { + accelerators = acceleratorMapper.selectList(new LambdaQueryWrapper<>()); + redisUtil.set(CommonConstant.ALL_ACCELERATOR,accelerators); + } + if(CollUtil.isNotEmpty(accelerators)){ + List list = new ArrayList<>(); + for(GardsAccelerator accelerator:accelerators){ + GlobalSiteInfoVO globalSiteInfo = new GlobalSiteInfoVO(); + globalSiteInfo.setId(accelerator.getId()); + globalSiteInfo.setName(accelerator.getFacilityName()); + globalSiteInfo.setLon(accelerator.getLongitude()); + globalSiteInfo.setLat(accelerator.getLatitude()); + globalSiteInfo.setSiteType(GlobalSiteTypeEnum.ACCELERATOR.getValue()); + list.add(globalSiteInfo); + } + return list; + } + return List.of(); + } +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/DataProvisionEfficiency.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/DataProvisionEfficiency.java new file mode 100644 index 0000000..56126e8 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/DataProvisionEfficiency.java @@ -0,0 +1,49 @@ +package org.jeecg.gis.vo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; + +import java.util.Date; + +/** + * 数据有效率 + */ +@Data +public class DataProvisionEfficiency { + + private Integer id; + + private String stationCode; + + private String countryCode; + + private String type; + + private Double lon; + + private Double lat; + + private String description; + + private String status; + + private String phdf; + + private String phd; + + private String met; + + private String soh; + + private String phdMetSoh; + + private String quality; + + private Double elevation; + + @JsonFormat(pattern = "yyyy-Mm-dd",timezone = "GMT+8") + private Date dateBegin; + + @JsonFormat(pattern = "yyyy-Mm-dd",timezone = "GMT+8") + private Date dateEnd; +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/GlobalSiteInfoVO.java b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/GlobalSiteInfoVO.java new file mode 100644 index 0000000..9f6e4a2 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/gis/vo/GlobalSiteInfoVO.java @@ -0,0 +1,20 @@ +package org.jeecg.gis.vo; + +import lombok.Data; + +/** + * 全球站点信息包括:台站、核设施、反应堆、后处理厂、加速器核试验厂 + */ +@Data +public class GlobalSiteInfoVO { + + private Integer id; + + private String name; + + private Double lon; + + private Double lat; + + private Integer siteType; +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/monitor/controller/ServiceClusterMonitorController.java b/jeecg-module-large-screen/src/main/java/org/jeecg/monitor/controller/ServiceClusterMonitorController.java new file mode 100644 index 0000000..a9bb7b2 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/monitor/controller/ServiceClusterMonitorController.java @@ -0,0 +1,79 @@ +package org.jeecg.monitor.controller; + +import jakarta.validation.constraints.NotBlank; +import lombok.RequiredArgsConstructor; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.monitor.feign.ServiceMonitorFeignClient; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RestController +@RequestMapping("clusterMonitor") +@RequiredArgsConstructor +public class ServiceClusterMonitorController { + + private final ServiceMonitorFeignClient serviceMonitorFeignClient; + + @AutoLog(value = "查询当前时刻的CPU使用率") + @GetMapping("getCpuInfo") + public Object getCpuInfo(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return serviceMonitorFeignClient.getCpuInfo(ip,conditions); + } + + @AutoLog(value = "查询过去指定时间范围内的CPU使用率") + @GetMapping("getCpuInfoList") + public Object getCpuInfoList(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return serviceMonitorFeignClient.getCpuInfoList(ip,conditions); + } + + @AutoLog(value = "获取CPU核心数") + @GetMapping("getCpuCoreInfo") + public Object getCpuCoreInfo(String ip) { + return serviceMonitorFeignClient.getCpuCoreInfo(ip); + } + + @AutoLog(value = "查询当前时刻的内存使用率") + @GetMapping("getMemoryInfo") + public Object getMemoryInfo(String ip) { + return serviceMonitorFeignClient.getMemoryInfo(ip); + } + + @AutoLog(value = "获取总内存") + @GetMapping("getTotleMemoryInfo") + public Object getTotleMemoryInfo(String ip) { + return serviceMonitorFeignClient.getTotleMemoryInfo(ip); + } + + @AutoLog(value = "查询过去指定时间范围内的内存使用率") + @GetMapping("getMemoryInfoList") + public Object getMemoryInfoList(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return serviceMonitorFeignClient.getMemoryInfoList(ip,conditions); + } + + @AutoLog(value = "查询当前时刻的网络带宽吞吐量") + @GetMapping("getNetworkInfo") + public Object getNetworkInfo(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return serviceMonitorFeignClient.getNetworkInfo(ip,conditions); + } + + @AutoLog(value = "获取网络带宽监测数据") + @GetMapping("getNetworkInfoList") + public Object getNetworkInfoList(String ip, @NotBlank(message = "查询条件不能为空") String conditions) { + return serviceMonitorFeignClient.getNetworkInfoList(ip,conditions); + } + + @AutoLog(value = "获取磁盘使用率") + @GetMapping("getDiskInfo") + public Object getDiskInfo(String ip) { + return serviceMonitorFeignClient.getDiskInfo(ip); + } + + @AutoLog(value = "获取主机服务列表") + @GetMapping("getHostList") + public Object getHostList() { + return serviceMonitorFeignClient.getHostList(); + } +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/monitor/feign/ServiceMonitorFeignClient.java b/jeecg-module-large-screen/src/main/java/org/jeecg/monitor/feign/ServiceMonitorFeignClient.java new file mode 100644 index 0000000..c8b325d --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/monitor/feign/ServiceMonitorFeignClient.java @@ -0,0 +1,77 @@ +package org.jeecg.monitor.feign; + +import org.jeecg.common.api.vo.Result; +import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +@FeignClient(value = "jeecg-system") +public interface ServiceMonitorFeignClient { + + /** + * 获取CPU信息 + */ + @GetMapping(value = "/monitor/getCpuInfo") + Result getCpuInfo(@RequestParam("ip") String ip,@RequestParam("conditions") String conditions); + + /** + * 获取CPU信息列表 + */ + @GetMapping(value = "/monitor/getCpuInfoList") + Result getCpuInfoList(@RequestParam("ip") String ip,@RequestParam("conditions") String conditions); + + /** + * 获取CPU核心数 + */ + @GetMapping(value = "/monitor/getCpuCoreInfo") + Result getCpuCoreInfo(@RequestParam("ip") String ip); + + /** + * 获取内存信息 + */ + @GetMapping(value = "/monitor/getMemoryInfo") + Result getMemoryInfo(@RequestParam("ip") String ip); + + /** + * 获取总内存 + * @return + */ + @GetMapping(value = "/monitor/getTotleMemoryInfo") + Result getTotleMemoryInfo(@RequestParam("ip") String ip); + + /** + * 获取内存信息列表 + */ + @GetMapping(value = "/monitor/getMemoryInfoList") + Result getMemoryInfoList(@RequestParam("ip") String ip,@RequestParam("conditions") String conditions); + + /** + * 获取网络信息 + */ + @GetMapping(value = "/monitor/getNetworkInfo") + Result getNetworkInfo(@RequestParam("ip") String ip,@RequestParam("conditions") String conditions); + + /** + * 获取网络信息列表 + * @return + */ + @GetMapping(value = "/monitor/getNetworkInfoList") + Result getNetworkInfoList(@RequestParam("ip") String ip,@RequestParam("conditions") String conditions); + + /** + * 获取磁盘使用率 + */ + @GetMapping(value = "/monitor/getDiskInfo") + Result getDiskInfo(@RequestParam("ip") String ip); + + /** + * 获取主机服务列表 + * @return + */ + @GetMapping(value = "/monitor/getHostList") + Result getHostList(); +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/sample/controller/IMSSampleAnalysesController.java b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/controller/IMSSampleAnalysesController.java new file mode 100644 index 0000000..5f6ac0b --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/controller/IMSSampleAnalysesController.java @@ -0,0 +1,49 @@ +package org.jeecg.sample.controller; + +import jakarta.validation.constraints.NotNull; +import lombok.RequiredArgsConstructor; +import org.jeecg.common.api.vo.Result; +import org.jeecg.common.aspect.annotation.AutoLog; +import org.jeecg.sample.service.IMSSampleAnalysesService; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * IMS样品分析大屏 + */ +@Validated +@RestController +@RequestMapping("sample") +@RequiredArgsConstructor +public class IMSSampleAnalysesController { + + private final IMSSampleAnalysesService sampleAnalysesService; + + @AutoLog(value = "查询气溶胶样品统计") + @GetMapping("countParticulateSample") + public Result countParticulateSample() { + return Result.ok(sampleAnalysesService.countParticulateSample()); + } + + @AutoLog(value = "查询气体样品统计率") + @GetMapping("countXeSample") + public Result countXeSample() { + return Result.ok(sampleAnalysesService.countXeSample()); + } + + @AutoLog(value = "查询待输运的样品列表") + @GetMapping("getSamplesTransportList") + public Result getSamplesTransportList() { + return Result.ok(sampleAnalysesService.getSamplesTransportList()); + } + + @AutoLog(value = "关闭样品输运记录") + @PutMapping("closeSamplesTransportRecord") + public Result closeSamplesTransportRecord(@NotNull(message = "样品id不能为空") Integer sampleId) { + sampleAnalysesService.closeSamplesTransportRecord(sampleId); + return Result.ok(); + } +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/IMSSampleAnalysesMapper.java b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/IMSSampleAnalysesMapper.java new file mode 100644 index 0000000..c6b66ac --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/IMSSampleAnalysesMapper.java @@ -0,0 +1,27 @@ +package org.jeecg.sample.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +import java.util.List; +import java.util.Map; + +public interface IMSSampleAnalysesMapper extends BaseMapper { + + /** + * 统计气溶胶样品数量 + * @return + */ + Map countParticulateSample(); + + /** + * 统计气体样品数量 + * @return + */ + Map countXeSample(); + + /** + * 查询待输运的样品列表 + * @return + */ + List> getSamplesTransportList(); +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/xml/IMSSampleAnalysesMapper.xml b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/xml/IMSSampleAnalysesMapper.xml new file mode 100644 index 0000000..c21e413 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/mapper/xml/IMSSampleAnalysesMapper.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/IMSSampleAnalysesService.java b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/IMSSampleAnalysesService.java new file mode 100644 index 0000000..74a2032 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/IMSSampleAnalysesService.java @@ -0,0 +1,33 @@ +package org.jeecg.sample.service; + +import java.util.List; +import java.util.Map; + +/** + * 统计样品数据 + */ +public interface IMSSampleAnalysesService { + + /** + * 统计气溶胶样品数量 + * @return + */ + Map countParticulateSample(); + + /** + * 统计颗粒物样品数量 + * @return + */ + Map countXeSample(); + + /** + * 查询待输运的样品列表 + * @return + */ + List> getSamplesTransportList(); + + /** + * 关闭样品输运记录 + */ + void closeSamplesTransportRecord(Integer sampleId); +} diff --git a/jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/impl/IMSSampleAnalysesServiceImpl.java b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/impl/IMSSampleAnalysesServiceImpl.java new file mode 100644 index 0000000..3c106d0 --- /dev/null +++ b/jeecg-module-large-screen/src/main/java/org/jeecg/sample/service/impl/IMSSampleAnalysesServiceImpl.java @@ -0,0 +1,64 @@ +package org.jeecg.sample.service.impl; + +import com.baomidou.dynamic.datasource.annotation.DS; +import lombok.RequiredArgsConstructor; +import org.jeecg.common.constant.enums.TransportTaskCloseStatusEnum; +import org.jeecg.modules.base.entity.rnauto.GardsTransportStatus; +import org.jeecg.modules.base.mapper.GardsTransportStatusMapper; +import org.jeecg.sample.mapper.IMSSampleAnalysesMapper; +import org.jeecg.sample.service.IMSSampleAnalysesService; +import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +@Service +@RequiredArgsConstructor +public class IMSSampleAnalysesServiceImpl implements IMSSampleAnalysesService { + + private final IMSSampleAnalysesMapper sampleAnalysesMapper; + private final GardsTransportStatusMapper transportStatusMapper; + + /** + * 统计气溶胶样品数量 + * @return + */ + @DS("ora") + @Override + public Map countParticulateSample() { + return sampleAnalysesMapper.countParticulateSample(); + } + + /** + * 统计气体样品数量 + * @return + */ + @DS("ora") + @Override + public Map countXeSample() { + return sampleAnalysesMapper.countXeSample(); + } + + /** + * 查询待输运的样品列表 + * @return + */ + @DS("ora") + @Override + public List> getSamplesTransportList() { + return sampleAnalysesMapper.getSamplesTransportList(); + } + + /** + * 关闭样品输运记录 + */ + @DS("ora") + @Override + public void closeSamplesTransportRecord(Integer sampleId) { + GardsTransportStatus transportStatus = transportStatusMapper.selectById(sampleId); + if(Objects.nonNull(transportStatus)){ + transportStatus.setCloseStatus(TransportTaskCloseStatusEnum.CLOSE.getValue()); + transportStatusMapper.updateById(transportStatus); + } + } +} diff --git a/jeecg-module-monitor-info-database/src/main/java/org/jeecg/controller/GardsNuclearTestingPlantController.java b/jeecg-module-monitor-info-database/src/main/java/org/jeecg/controller/GardsNuclearTestingPlantController.java index f14a36f..1f28297 100644 --- a/jeecg-module-monitor-info-database/src/main/java/org/jeecg/controller/GardsNuclearTestingPlantController.java +++ b/jeecg-module-monitor-info-database/src/main/java/org/jeecg/controller/GardsNuclearTestingPlantController.java @@ -140,7 +140,7 @@ public class GardsNuclearTestingPlantController { wrapper.eq(GardsNuclearTestingPlant::getName, name); } if (type != null && !type.trim().isEmpty()) { - wrapper.eq(GardsNuclearTestingPlant::getType, type); + wrapper.eq(GardsNuclearTestingPlant::getCountry, type); } IPage pageResult = gardsNuclearTestingPlantService.page(page, wrapper); diff --git a/jeecg-module-monitor-info-database/src/main/java/org/jeecg/service/impl/GardsNuclearTestingPlantServiceImpl.java b/jeecg-module-monitor-info-database/src/main/java/org/jeecg/service/impl/GardsNuclearTestingPlantServiceImpl.java index 5243572..f3ef85a 100644 --- a/jeecg-module-monitor-info-database/src/main/java/org/jeecg/service/impl/GardsNuclearTestingPlantServiceImpl.java +++ b/jeecg-module-monitor-info-database/src/main/java/org/jeecg/service/impl/GardsNuclearTestingPlantServiceImpl.java @@ -22,7 +22,7 @@ public class GardsNuclearTestingPlantServiceImpl extends ServiceImpl getCpuInfo(@NotBlank(message = "查询条件不能为空") String conditions) { - return Result.OK(hostMonitorService.getCpuInfo(conditions)); + public Result getCpuInfo(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getCpuInfo(ip,conditions)); } @AutoLog(value = "查询过去指定时间范围内的CPU使用率") @GetMapping("getCpuInfoList") - public Result getCpuInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { - return Result.OK(hostMonitorService.getCpuInfoList(conditions)); + public Result getCpuInfoList(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getCpuInfoList(ip,conditions)); } @AutoLog(value = "获取CPU核心数") @GetMapping("getCpuCoreInfo") - public Result getCpuCoreInfo() { - return Result.OK(hostMonitorService.getCpuCoreInfo()); + public Result getCpuCoreInfo(String ip) { + return Result.OK(hostMonitorService.getCpuCoreInfo(ip)); } @AutoLog(value = "查询当前时刻的内存使用率") @GetMapping("getMemoryInfo") - public Result getMemoryInfo() { - return Result.OK(hostMonitorService.getMemoryInfo()); + public Result getMemoryInfo(String ip) { + return Result.OK(hostMonitorService.getMemoryInfo(ip)); } @AutoLog(value = "获取总内存") @GetMapping("getTotleMemoryInfo") - public Result getTotleMemoryInfo() { - return Result.OK(hostMonitorService.getTotleMemoryInfo()); + public Result getTotleMemoryInfo(String ip) { + return Result.OK(hostMonitorService.getTotleMemoryInfo(ip)); } @AutoLog(value = "查询过去指定时间范围内的内存使用率") @GetMapping("getMemoryInfoList") - public Result getMemoryInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { - return Result.OK(hostMonitorService.getMemoryInfoList(conditions)); + public Result getMemoryInfoList(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getMemoryInfoList(ip,conditions)); } @AutoLog(value = "获取网络带宽监测数据") @GetMapping("getNetworkInfo") - public Result getNetworkInfo(@NotBlank(message = "查询条件不能为空") String conditions) { - return Result.OK(hostMonitorService.getNetworkInfo(conditions)); + public Result getNetworkInfo(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getNetworkInfo(ip,conditions)); } @AutoLog(value = "获取网络带宽监测数据") @GetMapping("getNetworkInfoList") - public Result getNetworkInfoList(@NotBlank(message = "查询条件不能为空") String conditions) { - return Result.OK(hostMonitorService.getNetworkInfoList(conditions)); + public Result getNetworkInfoList(String ip,@NotBlank(message = "查询条件不能为空") String conditions) { + return Result.OK(hostMonitorService.getNetworkInfoList(ip,conditions)); } @AutoLog(value = "获取磁盘使用率") @GetMapping("getDiskInfo") - public Result getDiskInfo() { - return Result.OK(hostMonitorService.getDiskInfo()); + public Result getDiskInfo(String ip) { + return Result.OK(hostMonitorService.getDiskInfo(ip)); + } + + @AutoLog(value = "获取主机服务列表") + @GetMapping("getHostList") + public Result getHostList() { + return Result.OK(hostMonitorService.getHostList()); } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java index bfe6ef2..5bf4f9e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/HostMonitorService.java @@ -3,53 +3,60 @@ package org.jeecg.modules.monitor.service; import java.util.List; import java.util.Map; +import java.util.Set; public interface HostMonitorService { /** * 获取CPU信息 */ - Map getCpuInfo(String conditions); + Map getCpuInfo(String ip,String conditions); /** * 获取CPU信息列表 */ - List> getCpuInfoList(String conditions); + List> getCpuInfoList(String ip,String conditions); /** * 获取CPU核心数 */ - Map getCpuCoreInfo(); + Map getCpuCoreInfo(String ip); /** * 获取内存信息 */ - Map getMemoryInfo(); + Map getMemoryInfo(String ip); /** * 获取内存信息列表 */ - List> getMemoryInfoList(String conditions); + List> getMemoryInfoList(String ip,String conditions); /** * 获取总内存 * @return */ - Map getTotleMemoryInfo(); + Map getTotleMemoryInfo(String ip); /** * 获取网络信息 */ - Map getNetworkInfo(String conditions); + Map getNetworkInfo(String ip,String conditions); /** * 获取网络信息列表 * @return */ - Map>> getNetworkInfoList(String conditions); + Map>> getNetworkInfoList(String ip,String conditions); /** * 获取磁盘使用率 */ - Map getDiskInfo(); + Map getDiskInfo(String ip); + + /** + * 获取主机服务列表 + * @return + */ + Set getHostList(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java index 0f94b7c..f8e5a97 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/monitor/service/impl/HostMonitorServiceImpl.java @@ -2,6 +2,7 @@ package org.jeecg.modules.monitor.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.StrUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.jeecg.common.constant.enums.PrometheusHostQueryTypeEnum; @@ -32,13 +33,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取CPU信息 */ @Override - public Map getCpuInfo(String conditions) { + public Map getCpuInfo(String ip,String conditions) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //查询CPU利用率 PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); String exprTime = queryTypeEnum.getExprTime(); @@ -70,13 +71,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取CPU信息列表 */ @Override - public List> getCpuInfoList(String conditions) { + public List> getCpuInfoList(String ip,String conditions) { List> result = new ArrayList<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //查询CPU利用率 PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); long end = Instant.now().getEpochSecond(); @@ -116,13 +117,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取CPU核心数 */ @Override - public Map getCpuCoreInfo() { + public Map getCpuCoreInfo(String ip) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //查询CPU核数 String cpuCoreQuery = "count(count by (cpu) (node_cpu_seconds_total{instance=\"" + instance + "\"}))"; PrometheusResponse response = webClient.get() @@ -150,13 +151,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取内存信息 */ @Override - public Map getMemoryInfo() { + public Map getMemoryInfo(String ip) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //查询总内存 // String totalMemoryQuery = "node_memory_MemTotal_bytes{instance=\"" + instance + "\"}"; // PrometheusResponse totalMemoryResponse = webClient.get() @@ -222,13 +223,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * @param conditions */ @Override - public List> getMemoryInfoList(String conditions) { + public List> getMemoryInfoList(String ip,String conditions) { List> result = new ArrayList<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //使用率 String usageRateQuery = "(1 - (node_memory_MemAvailable_bytes{instance=\""+instance+"\"} / node_memory_MemTotal_bytes{instance=\""+instance+"\"})) * 100"; PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); @@ -269,12 +270,12 @@ public class HostMonitorServiceImpl implements HostMonitorService { * @return */ @Override - public Map getTotleMemoryInfo() { + public Map getTotleMemoryInfo(String ip) { Map result = new HashMap<>(); //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //查询总内存 String totalMemoryQuery = "node_memory_MemTotal_bytes{instance=\"" + instance + "\"}"; PrometheusResponse totalMemoryResponse = webClient.get() @@ -299,13 +300,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取网络信息 */ @Override - public Map getNetworkInfo(String conditions) { + public Map getNetworkInfo(String ip,String conditions) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); String exprTime = queryTypeEnum.getExprTime(); //接收带宽 (Kbps) @@ -359,13 +360,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * @return */ @Override - public Map>> getNetworkInfoList(String conditions) { + public Map>> getNetworkInfoList(String ip,String conditions) { Map>> result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //构建查询参数 PrometheusHostQueryTypeEnum queryTypeEnum = PrometheusHostQueryTypeEnum.getQueryTypeEnum(conditions); long end = Instant.now().getEpochSecond(); @@ -435,13 +436,13 @@ public class HostMonitorServiceImpl implements HostMonitorService { * 获取磁盘使用率 */ @Override - public Map getDiskInfo() { + public Map getDiskInfo(String ip) { Map result = new HashMap<>(); try { //Prometheus 服务器地址 String url = serverProperties.getServerUrl(); //目标主机实例(node-exporter 的地址) - String instance = serverProperties.getInstance(); + String instance = this.getInstance(ip); //磁盘使用率 String diskUsageQuery = "((node_filesystem_size_bytes{instance=\""+instance+"\", device!~\"rootfs\"} - node_filesystem_avail_bytes{instance=\""+instance+"\", device!~\"rootfs\"}) / node_filesystem_size_bytes{instance=\""+instance+"\", device!~\"rootfs\"}) * 100"; PrometheusResponse diskUsageResponse = webClient.get() @@ -465,6 +466,34 @@ public class HostMonitorServiceImpl implements HostMonitorService { return result; } + /** + * 获取主机服务列表 + * + * @return + */ + @Override + public Set getHostList() { + return this.serverProperties.getInstances().keySet(); + } + + /** + * 获取服务器实例 + * @param ip + * @return + */ + private String getInstance(String ip) { + if(StrUtil.isBlank(ip)){ + Map.Entry first = serverProperties.getInstances().entrySet().stream().findFirst().get(); + return first.getKey()+":"+first.getValue(); + } + if (!serverProperties.getInstances().containsKey(ip)){ + throw new RuntimeException("此ip不在服务器列表中,请检查监控ip列表配置"); + } + Integer port = serverProperties.getInstances().get(ip); + return "192.168.186.143"+":"+port; + //return ip+":"+port; + } + /** * 构建URI * @param url diff --git a/jeecg-module-transport/src/main/java/org/jeecg/service/impl/StationDataServiceImpl.java b/jeecg-module-transport/src/main/java/org/jeecg/service/impl/StationDataServiceImpl.java index 9dbfc81..479f924 100644 --- a/jeecg-module-transport/src/main/java/org/jeecg/service/impl/StationDataServiceImpl.java +++ b/jeecg-module-transport/src/main/java/org/jeecg/service/impl/StationDataServiceImpl.java @@ -4,6 +4,7 @@ import com.baomidou.dynamic.datasource.annotation.DS; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import org.jeecg.common.constant.CommonConstant; +import org.jeecg.common.util.CoordinateTransformUtil; import org.jeecg.common.util.RedisUtil; import org.jeecg.modules.base.entity.configuration.GardsNuclearfacility; import org.jeecg.modules.base.entity.configuration.GardsStations; @@ -13,6 +14,7 @@ import org.jeecg.modules.base.mapper.GardsXeResultMapper; import org.jeecg.service.StationDataService; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Date; import java.util.List; import java.util.Map; @@ -39,9 +41,7 @@ public class StationDataServiceImpl implements StationDataService { if(redisUtil.hasKey(CommonConstant.ALL_STATIONS)){ return (List) redisUtil.get(CommonConstant.ALL_STATIONS); }else { - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.select(GardsStations::getStationId,GardsStations::getStationCode,GardsStations::getLon,GardsStations::getLat); - List stations = stationsMapper.selectList(queryWrapper); + List stations = stationsMapper.selectList(new LambdaQueryWrapper<>()); redisUtil.set(CommonConstant.ALL_STATIONS,stations); return stations; } @@ -57,12 +57,11 @@ public class StationDataServiceImpl implements StationDataService { return (List) redisUtil.get(CommonConstant.ALL_NUCLEARFACILITY); }else { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.select(GardsNuclearfacility::getFacilityId, GardsNuclearfacility::getFacilityName,GardsNuclearfacility::getLongitude,GardsNuclearfacility::getLatitude); List nuclearfacilities = nuclearfacilityMapper.selectList(queryWrapper); nuclearfacilities.forEach(nuclearfacility -> { //数据库经纬度存储的是反的,所以这里反着处理 - Double lon = this.lonAndLatConversion(nuclearfacility.getLatitude()); - Double lat = this.lonAndLatConversion(nuclearfacility.getLongitude()); + Double lon = CoordinateTransformUtil.lonAndLatConversion(nuclearfacility.getLatitude()); + Double lat = CoordinateTransformUtil.lonAndLatConversion(nuclearfacility.getLongitude()); nuclearfacility.setLonValue(lon); nuclearfacility.setLatValue(lat); }); @@ -97,33 +96,4 @@ public class StationDataServiceImpl implements StationDataService { return stationsMapper.selectById(stationId); } - /** - * 29°46’04”N - * 经纬度转换29°37′50″N -> 29.xxxxx - * @param lonOrLatStr - * @return - */ - private Double lonAndLatConversion(String lonOrLatStr) { - if(lonOrLatStr.contains("°") && lonOrLatStr.contains("′") && lonOrLatStr.contains("″")){ - String cleanStr = lonOrLatStr.replaceAll("[NSEW\\s]", ""); - String[] parts = cleanStr.split("[°′″:\\s]+"); - String deg = parts[0]; - String min = parts.length > 1 && !parts[1].isEmpty() ? parts[1] : "0"; - String sec = parts.length > 2 && !parts[2].isEmpty() ? parts[2] : "0"; - BigDecimal degBigDecimal = new BigDecimal(deg); - BigDecimal minBigDecimal = new BigDecimal(min); - BigDecimal secBigDecimal = new BigDecimal(sec); - minBigDecimal = minBigDecimal.divide(new BigDecimal("60"), 5, BigDecimal.ROUND_HALF_UP); - secBigDecimal = secBigDecimal.divide(new BigDecimal("3600"), 5, BigDecimal.ROUND_HALF_UP); - double value = degBigDecimal.doubleValue() + minBigDecimal.doubleValue() + secBigDecimal.doubleValue(); - return value; - }else { - if(lonOrLatStr.contains("°") && !lonOrLatStr.contains("′") && !lonOrLatStr.contains("″")){ - String cleanStr = lonOrLatStr.replaceAll("[NSEW°\\s]", ""); - return Double.parseDouble(cleanStr); - } - } - return 0D; - } - } diff --git a/jeecg-module-transport/src/main/java/org/jeecg/service/impl/TransportTaskServiceImpl.java b/jeecg-module-transport/src/main/java/org/jeecg/service/impl/TransportTaskServiceImpl.java index 376ef36..749e26b 100644 --- a/jeecg-module-transport/src/main/java/org/jeecg/service/impl/TransportTaskServiceImpl.java +++ b/jeecg-module-transport/src/main/java/org/jeecg/service/impl/TransportTaskServiceImpl.java @@ -215,6 +215,8 @@ public class TransportTaskServiceImpl extends ServiceImpl getTaskLog(Integer taskId) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(TransportTaskLog::getTaskId,taskId); + queryWrapper.select(TransportTaskLog::getCreateTime,TransportTaskLog::getLogContent); + queryWrapper.orderByAsc(TransportTaskLog::getCreateTime); return transportTaskLogMapper.selectList(queryWrapper); } @@ -239,7 +241,7 @@ public class TransportTaskServiceImpl extends ServiceImpl stationConfigInfo = new ArrayList<>(); @@ -151,6 +157,8 @@ public class TransportTaskExec extends Thread{ String row = String.format(format,taskChild.getStationCode(),taskChild.getLat(),taskChild.getLon(),taskChild.getReleaseAmount()); stationConfigInfo.add(row); }); + //最后一行需要换行,否则启动flexpart报错 + stationConfigInfo.add("\n"); FileUtil.writeLines(stationConfigInfo,stationsConfigPath,"UTF-8"); //获取脚本路径 String scriptPath = null;