添加IMS数据接收状态监控

This commit is contained in:
duwenyuan 2026-01-19 14:57:00 +08:00
parent 3f7a11e890
commit b01380adc3
16 changed files with 25709 additions and 44 deletions

View File

@ -8,14 +8,9 @@ import java.sql.Timestamp;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.ParseException; import java.text.ParseException;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.Duration; import java.time.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.temporal.ChronoUnit; import java.time.temporal.ChronoUnit;
import java.util.Calendar; import java.util.*;
import java.util.Date;
import java.util.GregorianCalendar;
/** /**
* 类描述时间操作定义类 * 类描述时间操作定义类
@ -50,24 +45,27 @@ public class DateUtils extends PropertyEditorSupport {
return new SimpleDateFormat("yyyy-MM-dd HH:mm"); return new SimpleDateFormat("yyyy-MM-dd HH:mm");
} }
}; };
public static ThreadLocal<SimpleDateFormat> yyyymmddhhmmss = new ThreadLocal<SimpleDateFormat>() { public static ThreadLocal<SimpleDateFormat> yyyymmddhhmmss =
@Override new ThreadLocal<SimpleDateFormat>() {
protected SimpleDateFormat initialValue() { @Override
return new SimpleDateFormat("yyyyMMddHHmmss"); protected SimpleDateFormat initialValue() {
} return new SimpleDateFormat("yyyyMMddHHmmss");
}; }
public static ThreadLocal<SimpleDateFormat> short_time_sdf = new ThreadLocal<SimpleDateFormat>() { };
@Override public static ThreadLocal<SimpleDateFormat> short_time_sdf =
protected SimpleDateFormat initialValue() { new ThreadLocal<SimpleDateFormat>() {
return new SimpleDateFormat("HH:mm"); @Override
} protected SimpleDateFormat initialValue() {
}; return new SimpleDateFormat("HH:mm");
public static ThreadLocal<SimpleDateFormat> datetimeFormat = new ThreadLocal<SimpleDateFormat>() { }
@Override };
protected SimpleDateFormat initialValue() { public static ThreadLocal<SimpleDateFormat> datetimeFormat =
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); new ThreadLocal<SimpleDateFormat>() {
} @Override
}; protected SimpleDateFormat initialValue() {
return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
}
};
/** /**
* 以毫秒表示的时间 * 以毫秒表示的时间
@ -79,6 +77,7 @@ public class DateUtils extends PropertyEditorSupport {
/** /**
* 指定模式的时间格式 * 指定模式的时间格式
*
* @param pattern * @param pattern
* @return * @return
*/ */
@ -227,7 +226,7 @@ public class DateUtils extends PropertyEditorSupport {
/** /**
* 日期转换为字符串 * 日期转换为字符串
* *
* @param date 日期 * @param date 日期
* @param dateSdf 日期格式 * @param dateSdf 日期格式
* @return 字符串 * @return 字符串
*/ */
@ -585,7 +584,8 @@ public class DateUtils extends PropertyEditorSupport {
return cal; return cal;
} }
public static String formatAddDate(String src, String pattern, int amount) throws ParseException { public static String formatAddDate(String src, String pattern, int amount)
throws ParseException {
Calendar cal; Calendar cal;
cal = parseCalendar(src, pattern); cal = parseCalendar(src, pattern);
cal.add(Calendar.DATE, amount); cal.add(Calendar.DATE, amount);
@ -669,10 +669,12 @@ public class DateUtils extends PropertyEditorSupport {
} else if (text.indexOf(SymbolConstant.COLON) > 0 && text.length() == length19) { } else if (text.indexOf(SymbolConstant.COLON) > 0 && text.length() == length19) {
setValue(DateUtils.datetimeFormat.get().parse(text)); setValue(DateUtils.datetimeFormat.get().parse(text));
} else { } else {
throw new IllegalArgumentException("Could not parse date, date format is error "); throw new IllegalArgumentException(
"Could not parse date, date format is error ");
} }
} catch (ParseException ex) { } catch (ParseException ex) {
IllegalArgumentException iae = new IllegalArgumentException("Could not parse date: " + ex.getMessage()); IllegalArgumentException iae =
new IllegalArgumentException("Could not parse date: " + ex.getMessage());
iae.initCause(ex); iae.initCause(ex);
throw iae; throw iae;
} }
@ -689,13 +691,14 @@ public class DateUtils extends PropertyEditorSupport {
/** /**
* 将字符串转成时间 * 将字符串转成时间
*
* @param str * @param str
* @return * @return
*/ */
public static Date parseDatetime(String str){ public static Date parseDatetime(String str) {
try { try {
return datetimeFormat.get().parse(str); return datetimeFormat.get().parse(str);
}catch (Exception e){ } catch (Exception e) {
} }
return null; return null;
} }
@ -716,8 +719,10 @@ public class DateUtils extends PropertyEditorSupport {
Calendar calendar2 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2); calendar2.setTime(date2);
boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR); boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
boolean isSameMonth = isSameYear && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH); boolean isSameMonth =
return isSameMonth && calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH); isSameYear && calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
return isSameMonth &&
calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
} }
/** /**
@ -731,7 +736,8 @@ public class DateUtils extends PropertyEditorSupport {
LocalDateTime currentTime = LocalDateTime.now(); LocalDateTime currentTime = LocalDateTime.now();
// 将java.util.Date转换为java.time.LocalDateTime // 将java.util.Date转换为java.time.LocalDateTime
LocalDateTime convertedTargetDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime(); LocalDateTime convertedTargetDate =
targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();
// 计算时间差 // 计算时间差
Duration duration = Duration.between(currentTime, convertedTargetDate); Duration duration = Duration.between(currentTime, convertedTargetDate);
@ -752,7 +758,8 @@ public class DateUtils extends PropertyEditorSupport {
// 获取当前日期 // 获取当前日期
LocalDate currentDate = LocalDate.now(); LocalDate currentDate = LocalDate.now();
// 将java.util.Date转换为java.time.LocalDate // 将java.util.Date转换为java.time.LocalDate
LocalDate convertedTargetDate = targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate(); LocalDate convertedTargetDate =
targetDate.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
// 计算日期差 // 计算日期差
long daysDifference = ChronoUnit.DAYS.between(currentDate, convertedTargetDate); long daysDifference = ChronoUnit.DAYS.between(currentDate, convertedTargetDate);
return daysDifference; return daysDifference;
@ -774,7 +781,8 @@ public class DateUtils extends PropertyEditorSupport {
Calendar calendar2 = Calendar.getInstance(); Calendar calendar2 = Calendar.getInstance();
calendar2.setTime(date2); calendar2.setTime(date2);
boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR); boolean isSameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
return isSameYear && calendar1.get(Calendar.WEEK_OF_YEAR) == calendar2.get(Calendar.WEEK_OF_YEAR); return isSameYear &&
calendar1.get(Calendar.WEEK_OF_YEAR) == calendar2.get(Calendar.WEEK_OF_YEAR);
} }
/** /**
@ -814,4 +822,31 @@ public class DateUtils extends PropertyEditorSupport {
return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR); return calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
} }
/**
* 获取指定年月的所有日期yyyy-MM-dd格式
*
* @param year 年份如2026
* @param month 月份1-12
* @return 日期列表按时间正序排列
*/
public static List<String> getDaysOfMonth(Integer year, Integer month) {
// 参数校验
if (year == null || month == null || month < 1 || month > 12) {
throw new IllegalArgumentException("无效的年月参数");
}
List<String> dateList = new ArrayList<>();
YearMonth yearMonth = YearMonth.of(year, month);
// 获取该月的总天数
int totalDays = yearMonth.lengthOfMonth();
// 遍历该月所有日期
for (int day = 1; day <= totalDays; day++) {
LocalDate date = LocalDate.of(year, month, day);
dateList.add(date_sdf.get().format(date));
}
return dateList;
}
} }

View File

@ -0,0 +1,73 @@
package org.jeecg.modules.base.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("stas_station_setting")
public class StasStationSetting {
@TableId(type = IdType.ASSIGN_ID)
private Integer id;
/**
* 区分PHDF或PHD等
*/
private String typeGroup;
/**
* 类型如SAUNA, SPALAX, PARTICULATE
*/
private String stationType;
/**
* 最低采集时长
*/
private Double collectLow;
/**
* 最高采集时长
*/
private Double collectHigh;
/**
* 最低acquisition_live_sec
*/
private Double liveLow;
/**
* 最高acquisition_live_sec
*/
private Double liveHigh;
/**
* quantity
*/
private Integer quantity;
/**
* Xe体积
*/
private Double xeVolume;
/**
* mdc
*/
private Integer mdc;
/**
* 核素名称
*/
private String nuclideName;
/**
* live_qc
*/
private Integer liveQc;
/**
* 数量
*/
private Integer number;
/**
* 创建时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date createdTime;
}

View File

@ -0,0 +1,9 @@
package org.jeecg.modules.base.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.jeecg.modules.base.entity.StasStationSetting;
@Mapper
public interface StasStationSettingMapper extends BaseMapper<StasStationSetting> {
}

View File

@ -0,0 +1,175 @@
package org.jeecg.imsDataMonitor.controller;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.aspect.annotation.AutoLog;
import org.jeecg.imsDataMonitor.entity.ProvisionData;
import org.jeecg.imsDataMonitor.entity.StationInfo;
import org.jeecg.imsDataMonitor.service.IMSDataMonitorService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.File;
import java.io.InputStream;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Slf4j
@RestController
@RequestMapping("/imsDataMonitor")
public class imsDataMonitorController {
@Autowired
private IMSDataMonitorService imsDataMonitorService;
/**
* 获取Particulate 台站的有效率和提供率
*
* @param code 类型代码
* @param startDate 开始日期
* @param endDate 结束日期
* @return 返回 Result
*/
@AutoLog(value = "Particulate 台站的有效率")
@GetMapping("getParticulate")
public Result<?> getParticulate(@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "startDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date startDate,
@RequestParam(value = "endDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date endDate) {
// List<ProvisionData> data = imsDataMonitorService.getParticulate(code, startDate, endDate);
// return Result.OK(data);
//TODO 测试待删除
try (InputStream inputStream = imsDataMonitorController.class.getClassLoader()
.getResourceAsStream("Particulate.json")) {
//region 测试数据
//endregion
ObjectMapper objectMapper = new ObjectMapper();
Result<List<ProvisionData>> resultData =
objectMapper.readValue(inputStream, new TypeReference<>() {
});
return resultData;
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
/**
* Spalax 台站的有效率
*
* @param code
* @param startDate
* @param endDate
* @return
*/
@AutoLog(value = "Spalax 台站的有效率")
@GetMapping("getSpalax")
public Result<?> getSpalax(@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "startDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date startDate,
@RequestParam(value = "endDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date endDate) {
// List<ProvisionData> data = imsDataMonitorService.getSpalax(code, startDate, endDate);
// return Result.OK(data);
//TODO 测试待删除
try (InputStream inputStream = imsDataMonitorController.class.getClassLoader()
.getResourceAsStream("Spalax.json")) {
//region 测试数据
//endregion
ObjectMapper objectMapper = new ObjectMapper();
Result<List<ProvisionData>> resultData =
objectMapper.readValue(inputStream, new TypeReference<>() {
});
return resultData;
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
/**
* Sauna2 台站的有效率
*
* @param code
* @param startDate
* @param endDate
* @return
*/
@AutoLog(value = "Sauna2 台站的有效率")
@GetMapping("getSauna2")
public Result<?> getSauna2(@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "startDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date startDate,
@RequestParam(value = "endDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date endDate) {
// List<ProvisionData> data = imsDataMonitorService.getSauna2(code, startDate, endDate);
// return Result.OK(data);
//TODO 测试待删除
try (InputStream inputStream = imsDataMonitorController.class.getClassLoader()
.getResourceAsStream("Sauna2.json")) {
//region 测试数据
//endregion
ObjectMapper objectMapper = new ObjectMapper();
Result<List<ProvisionData>> resultData =
objectMapper.readValue(inputStream, new TypeReference<>() {
});
return resultData;
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
/**
* Sauna3 台站的有效率
*
* @param code
* @param startDate
* @param endDate
* @return
*/
@AutoLog(value = "Sauna3 台站的有效率")
@GetMapping("getSauna3")
public Result<?> getSauna3(@RequestParam(value = "code", required = false) String code,
@RequestParam(value = "startDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date startDate,
@RequestParam(value = "endDate", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd")
Date endDate) {
// List<ProvisionData> data = imsDataMonitorService.getSauna3(code, startDate, endDate);
// return Result.OK(data);
//TODO 测试待删除
try (InputStream inputStream = imsDataMonitorController.class.getClassLoader()
.getResourceAsStream("Sauna3.json")) {
//region 测试数据
//endregion
ObjectMapper objectMapper = new ObjectMapper();
Result<List<ProvisionData>> resultData =
objectMapper.readValue(inputStream, new TypeReference<>() {
});
return resultData;
} catch (Exception e) {
return Result.error(e.getMessage());
}
}
}

View File

@ -0,0 +1,33 @@
package org.jeecg.imsDataMonitor.entity;
import lombok.Data;
import java.util.List;
@Data
public class PhdfProvisionEfficiency {
//liveLow
private String liveLow;
//liveHigh
private String liveHigh;
//quantity
private String quantity;
//collectLow
private String collectLow;
//collectHigh
private String collectHigh;
//curDateTime
private String curDateTime;
//pretime
private String pretime;
//number
private String number;
private String nuclideName;
private String liveQc;
private String mdc;
private String xeVolume;
//stationId
private List<Integer> stationId;
}

View File

@ -0,0 +1,33 @@
package org.jeecg.imsDataMonitor.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.jeecgframework.poi.excel.annotation.Excel;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
public class ProvisionData implements Serializable {
private String stationCode;
/**
* 数据数量
*/
private Integer dataNumber;
/**
* 数据提供率
*/
private double dataRate;
/**
* 数据有效率
*/
private double dataEfficiency;
/**
* 采集开始时间
*/
@DateTimeFormat(pattern = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date collectStart;
}

View File

@ -0,0 +1,42 @@
package org.jeecg.imsDataMonitor.entity;
import lombok.Data;
import java.io.Serializable;
@Data
public class StationInfo implements Serializable {
private String id;
private String stationCode;
private String countryCode;
private String type;
private String lon;
private String lat;
private String description;
private String status;
private String phdf;
private String phd;
private String met;
private String soh;
private String phdMetSoh;
private String used;
private String quality;
private String efficCalculType;
}

View File

@ -0,0 +1,59 @@
package org.jeecg.imsDataMonitor.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.jeecg.imsDataMonitor.entity.PhdfProvisionEfficiency;
import org.jeecg.imsDataMonitor.entity.ProvisionData;
import org.jeecg.modules.base.entity.configuration.GardsStations;
import java.util.List;
@Mapper
public interface IMSDataMonitorMapper extends BaseMapper<GardsStations> {
List<GardsStations> findStationList(@Param("systemType") String systemType);
List<GardsStations> findEfficStationList(@Param("efficType") String efficType);
/**
* 查询台站每天的有效率
*
* @param efficiency
* @return List<ProvisionData>
*/
List<ProvisionData> findPhdfParticulateEfficiency(
@Param("efficiency") PhdfProvisionEfficiency efficiency);
/**
* 查询台站每天的有效率
*
* @param efficiency
* @return List<ProvisionData>
*/
List<ProvisionData> findPhdfSpalaxEfficiency(
@Param("efficiency") PhdfProvisionEfficiency efficiency);
/**
* 查询台站每天的有效率
*
* @param efficiency
* @return List<ProvisionData>
*/
List<ProvisionData> findPhdfSauna2Efficiency(
@Param("efficiency") PhdfProvisionEfficiency efficiency);
/**
* 查询台站每天的有效率
*
* @param efficiency
* @return List<ProvisionData>
*/
List<ProvisionData> findPhdfSauna3Efficiency(
@Param("efficiency") PhdfProvisionEfficiency efficiency);
}

View File

@ -0,0 +1,185 @@
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.jeecg.imsDataMonitor.mapper.IMSDataMonitorMapper">
<select id="findStationList" resultType="org.jeecg.modules.base.entity.configuration.GardsStations">
SELECT * FROM CONFIGURATION.GARDS_STATIONS
<where>
TYPE IN
<if test='systemType == "P"'>
('Manual', 'CINDER', 'RASA', 'LAB')
</if>
<if test='systemType == "B"'>
('SAUNA', 'ARIX-4', 'ARIX-2', 'SPALAX')
</if>
</where>
</select>
<select id="findEfficStationList" resultType="org.jeecg.modules.base.entity.configuration.GardsStations">
SELECT * FROM CONFIGURATION.GARDS_STATIONS
<where>
EFFIC_CALCUL_TYPE ='${efficType}'
</where>
</select>
<select id="findPhdfParticulateEfficiency" resultType="org.jeecg.imsDataMonitor.entity.ProvisionData">
SELECT TRUNC(sdata.COLLECT_START) AS collectStart,
COUNT(*) AS total_samples,
sta.STATION_CODE ,
COUNT(
CASE
WHEN sdata.data_type = 'Q' THEN
1
WHEN sdata.data_type = 'S'
AND (sdata.acquisition_live_sec / 60 / 60.00) BETWEEN #{efficiency.liveLow}
AND #{efficiency.liveHigh}
AND
(to_number(sdata.COLLECT_STOP - sdata.COLLECT_START) * 24) BETWEEN #{efficiency.liveLow}
AND #{efficiency.liveHigh}
AND sdata.quantity > 10800 THEN
1
END
) AS dataNumber,
ROUND(
COUNT(
CASE
WHEN sdata.data_type = 'Q' THEN
1
WHEN sdata.data_type = 'S'
AND (sdata.acquisition_live_sec / 60 / 60.00) BETWEEN #{efficiency.liveLow}
AND #{efficiency.liveHigh}
AND
(to_number(sdata.COLLECT_STOP - sdata.COLLECT_START) * 24) BETWEEN #{efficiency.liveLow}
AND #{efficiency.liveHigh}
AND sdata.quantity > #{efficiency.quantity} THEN
1
END
) * 100.0 / (1 * ${efficiency.number}),
2
)AS dataEfficiency
FROM ORIGINAL.GARDS_SAMPLE_DATA sdata
LEFT JOIN CONFIGURATION.GARDS_STATIONS sta ON sta.station_id = sdata.station_id
WHERE SDATA.SAMPLE_TYPE = 'P'
AND sdata.spectral_qualifie = 'FULL'
AND sta.station_code LIKE '__P%'
AND sdata.station_id IN
<foreach collection="efficiency.stationId" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND sdata.COLLECT_START BETWEEN TO_DATE('${efficiency.pretime}', 'YYYY-MM-DD hh24:mi:ss')
AND TO_DATE('${efficiency.curDateTime}', 'YYYY-MM-DD hh24:mi:ss')
GROUP BY TRUNC(sdata.COLLECT_START),sta.STATION_CODE
ORDER BY collectStart;
</select>
<select id="findPhdfSpalaxEfficiency" resultType="org.jeecg.imsDataMonitor.entity.ProvisionData">
SELECT
TRUNC(sdata.COLLECT_START) AS collectStart,
sta.STATION_CODE ,
SUM(CASE
WHEN sdata.acquisition_live_sec > ${efficiency.liveQc}
AND sdata.data_type = 'Q'
AND sdata.spectral_qualifie = 'FULL'
THEN 1 ELSE 0
END)
+ SUM(CASE
WHEN sdata.data_type = 'S'
AND (sdata.acquisition_live_sec/60/60.00) BETWEEN ${efficiency.liveLow} AND ${efficiency.liveHigh}
AND (to_number(SDATA.COLLECT_STOP - SDATA.COLLECT_START) * 24) BETWEEN ${efficiency.collectLow} AND ${efficiency.collectHigh}
AND sdata.quantity > ${efficiency.quantity}
THEN 1 ELSE 0
END) AS dataNumber,
ROUND(
(SUM(CASE
WHEN sdata.acquisition_live_sec > ${efficiency.liveQc}
AND sdata.data_type = 'Q'
AND sdata.spectral_qualifie = 'FULL'
THEN 1 ELSE 0
END)
+ SUM(CASE
WHEN sdata.data_type = 'S'
AND (sdata.acquisition_live_sec/60/60.00) BETWEEN ${efficiency.liveLow} AND ${efficiency.liveHigh}
AND (to_number(SDATA.COLLECT_STOP - SDATA.COLLECT_START) * 24) BETWEEN ${efficiency.collectLow} AND ${efficiency.collectHigh}
AND sdata.quantity > ${efficiency.quantity}
THEN 1 ELSE 0
END))
/ 1 * ${efficiency.number} * 100,
2
) AS dataEfficiency
FROM ORIGINAL.GARDS_SAMPLE_DATA sdata
LEFT JOIN RNAUTO.GARDS_XE_RESULTS xe ON xe.sample_id = sdata.sample_id
LEFT JOIN ORIGINAL.GARDS_SAMPLE_AUX aux ON aux.sample_id = sdata.sample_id
LEFT JOIN CONFIGURATION.GARDS_STATIONS sta ON sta.station_id = sdata.station_id
<where>
sta.EFFIC_CALCUL_TYPE = 'SPALAX'
AND SDATA.SAMPLE_TYPE = 'G'
AND substr(sta.station_code, 3, 1) = 'X'
AND sdata.station_id IN
<foreach collection="efficiency.stationId" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND sdata.COLLECT_START BETWEEN TO_DATE(#{efficiency.pretime}, 'YYYY-MM-DD hh24:mi:ss')
AND TO_DATE(#{efficiency.curDateTime}, 'YYYY-MM-DD hh24:mi:ss')
</where>
GROUP BY TRUNC(sdata.COLLECT_START),sta.STATION_CODE
ORDER BY collectStart
</select>
<select id="findPhdfSauna2Efficiency" resultType="org.jeecg.imsDataMonitor.entity.ProvisionData">
SELECT
TRUNC(sdata.COLLECT_START) AS collectStart,
sta.STATION_CODE ,
(SUM(CASE WHEN ROUND(sdata.acquisition_live_sec/60/60.00) BETWEEN ${efficiency.liveLow} AND ${efficiency.liveHigh}
AND sdata.quantity > ${efficiency.quantity}
AND xe.MDC &lt; ${efficiency.mdc}
AND (to_number(SDATA.COLLECT_STOP - SDATA.COLLECT_START)*24) BETWEEN ${efficiency.collectLow} AND ${efficiency.collectHigh}
AND aux.xe_volume > ${efficiency.xeVolume}
AND xe.nuclide_name = '${efficiency.nuclideName}'
AND sdata.data_type = 'S' THEN 1 ELSE 0 END)
+ SUM(CASE WHEN sdata.acquisition_live_sec > ${efficiency.liveQc} AND sdata.data_type = 'Q' THEN 1 ELSE 0 END)
+ SUM(CASE WHEN ROUND(sdata.acquisition_live_sec/60/60.00, 2) BETWEEN ${efficiency.liveLow} AND ${efficiency.liveHigh}
AND sdata.data_type = 'G' THEN 1 ELSE 0 END)) AS dataNumber,
ROUND((SUM(CASE WHEN ROUND(sdata.acquisition_live_sec/60/60.00) BETWEEN ${efficiency.liveLow} AND ${efficiency.liveHigh}
AND sdata.quantity > ${efficiency.quantity}
AND xe.MDC &lt; ${efficiency.mdc}
AND (to_number(SDATA.COLLECT_STOP - SDATA.COLLECT_START)*24) BETWEEN ${efficiency.collectLow} AND ${efficiency.collectHigh}
AND aux.xe_volume > ${efficiency.xeVolume}
AND xe.nuclide_name = '${efficiency.nuclideName}'
AND sdata.data_type = 'S' THEN 1 ELSE 0 END)
+ SUM(CASE WHEN sdata.acquisition_live_sec > ${efficiency.liveQc} AND sdata.data_type = 'Q' THEN 1 ELSE 0 END)
+ SUM(CASE WHEN ROUND(sdata.acquisition_live_sec/60/60.00, 2) BETWEEN ${efficiency.liveLow} AND ${efficiency.liveHigh}
AND sdata.data_type = 'G' THEN 1 ELSE 0 END))
/ ${efficiency.number} * 100, 2) AS dataEfficiency
FROM ORIGINAL.GARDS_SAMPLE_DATA sdata
LEFT JOIN RNAUTO.GARDS_XE_RESULTS xe ON xe.sample_id = sdata.sample_id
LEFT JOIN ORIGINAL.GARDS_SAMPLE_AUX aux ON aux.sample_id = sdata.sample_id
LEFT JOIN CONFIGURATION.GARDS_STATIONS sta ON sta.station_id = sdata.station_id
<where>
substr(sta.station_code, 3, 1) = 'X'
AND SDATA.SAMPLE_TYPE = 'B'
AND sdata.spectral_qualifie = 'FULL'
AND sdata.station_id IN
<foreach collection="efficiency.stationId" item="id" open="(" separator="," close=")">
#{id}
</foreach>
AND sdata.COLLECT_START BETWEEN TO_DATE(#{efficiency.pretime}, 'YYYY-MM-DD hh24:mi:ss')
AND TO_DATE(#{efficiency.curDateTime}, 'YYYY-MM-DD hh24:mi:ss')
</where>
GROUP BY TRUNC(sdata.COLLECT_START),sta.STATION_CODE
ORDER BY collectStart
</select>
<select id="findPhdfSauna3Efficiency" resultType="org.jeecg.imsDataMonitor.entity.ProvisionData">
</select>
</mapper>

View File

@ -0,0 +1,34 @@
package org.jeecg.imsDataMonitor.service;
import org.jeecg.imsDataMonitor.entity.ProvisionData;
import org.jeecg.modules.base.entity.configuration.GardsStations;
import java.util.Date;
import java.util.List;
import java.util.Map;
public interface IMSDataMonitorService {
/**
* 获取台站集合
*
* @param systemType
* @return List<GardsStations> 集合
*/
List<GardsStations> getGardsStationList(String systemType);
/**
*获取Particulate类型的有效率数据
* @return Map<String, List<ProvisionData>>
*/
List<ProvisionData> getParticulate(String code, Date startDate, Date endDate);
List<ProvisionData> getSpalax(String code, Date startDate, Date endDate);
List<ProvisionData> getSauna2(String code, Date startDate, Date endDate);
List<ProvisionData> getSauna3(String code, Date startDate, Date endDate);
}

View File

@ -0,0 +1,237 @@
package org.jeecg.imsDataMonitor.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.jeecg.common.util.DateUtils;
import org.jeecg.imsDataMonitor.entity.PhdfProvisionEfficiency;
import org.jeecg.imsDataMonitor.entity.ProvisionData;
import org.jeecg.imsDataMonitor.mapper.IMSDataMonitorMapper;
import org.jeecg.imsDataMonitor.service.IMSDataMonitorService;
import org.jeecg.modules.base.entity.configuration.GardsStations;
import org.jeecg.modules.base.mapper.GardsStationsMapper;
import org.jeecg.modules.base.mapper.StasStationSettingMapper;
import org.jspecify.annotations.NonNull;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
@Service
@DS("ora")
public class IMSDataMonitorServiceImpl implements IMSDataMonitorService {
@Autowired
private IMSDataMonitorMapper imsDataMonitorMapper;
@Autowired
private StasStationSettingMapper settingMapper;
@Override
public List<GardsStations> getGardsStationList(String systemType) {
return imsDataMonitorMapper.findStationList(systemType);
}
//region Particulate
@Override
public List<ProvisionData> getParticulate(String code, Date startDate, Date endDate) {
//获取Particulate类型的台站信息
List<GardsStations> stations = imsDataMonitorMapper.findStationList("P");
String[] times = getDataTime(startDate, endDate);
//有效率状态
return getStationDailyData(stations, times[0], times[1]);
}
private List<ProvisionData> getStationDailyData(List<GardsStations> stationList,
String startTime, String endTime) {
if (CollectionUtil.isEmpty(stationList)) {
return new ArrayList<>();
}
String liveLow = "21.6";
String liveHigh = "26.4";
String quantity = "10800";
String collectLow = "21.6";
String collectHigh = "26.4";
String number = "1";
//每个台站一个月的有效率
PhdfProvisionEfficiency efficiency = new PhdfProvisionEfficiency();
List<Integer> sts = stationList.stream()
.map(GardsStations::getStationId)
.collect(Collectors.toList());
efficiency.setStationId(sts);
efficiency.setNumber(number);
efficiency.setCollectHigh(collectHigh);
efficiency.setLiveHigh(liveHigh);
efficiency.setCollectLow(collectLow);
efficiency.setLiveLow(liveLow);
efficiency.setQuantity(quantity);
efficiency.setCurDateTime(endTime);
efficiency.setPretime(startTime);
//查询数据库 获取台站有效率
List<ProvisionData> rawDataList =
imsDataMonitorMapper.findPhdfParticulateEfficiency(efficiency);
//dataMap.put(station.getStationCode(), rawDataList);
return rawDataList;
}
private String[] getDataTime(Date startDate, Date endDate) {
// 使用final确保不可变性提供更好的线程安全性
final LocalDateTime currentTime = LocalDateTime.now();
// 计算默认时间范围
final LocalDateTime defaultStartTime = currentTime.minusDays(30);
final LocalDateTime defaultEndTime = currentTime;
// 定义时间格式器常量避免重复创建
final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
final DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
// 处理开始时间
String startTime = Objects.isNull(startDate)
? defaultStartTime.format(formatter)
: DateUtils.formatDate(startDate, "yyyy-MM-dd") + " 00:00:00";
// 处理结束时间
String endTime = Objects.isNull(endDate)
? defaultEndTime.format(formatter)
: DateUtils.formatDate(endDate, "yyyy-MM-dd") + " 23:59:59";
return new String[] {startTime, endTime};
}
//endregion
//region SPALAX
@Override
public List<ProvisionData> getSpalax(String code, Date startDate, Date endDate) {
String actualCode = (code == null || code.trim().isEmpty()) ? "SPALAX" : code;
//获取Particulate类型的台站信息
List<GardsStations> stations = imsDataMonitorMapper.findEfficStationList(actualCode);
String[] times = getDataTime(startDate, endDate);
//有效率状态
return getSpalaxStationDailyData(stations, times[0], times[1]);
}
private List<ProvisionData> getSpalaxStationDailyData(List<GardsStations> stationList,
String startTime, String endTime) {
if (CollectionUtil.isEmpty(stationList)) {
return new ArrayList<>();
}
String liveLow = "10";
String liveHigh = "11";
String quantity = "10";
String collectLow = "10.8";
String collectHigh = "13.2";
String number = "4";
String liveqc = "240";
//每个台站一个月的有效率
PhdfProvisionEfficiency efficiency = new PhdfProvisionEfficiency();
List<Integer> sts = stationList.stream()
.map(GardsStations::getStationId)
.collect(Collectors.toList());
efficiency.setStationId(sts);
efficiency.setNumber(number);
efficiency.setCollectHigh(collectHigh);
efficiency.setLiveHigh(liveHigh);
efficiency.setCollectLow(collectLow);
efficiency.setLiveLow(liveLow);
efficiency.setQuantity(quantity);
efficiency.setCurDateTime(endTime);
efficiency.setPretime(startTime);
efficiency.setLiveQc(liveqc);
//查询数据库 获取台站有效率
List<ProvisionData> rawDataList =
imsDataMonitorMapper.findPhdfSpalaxEfficiency(efficiency);
//dataMap.put(station.getStationCode(), rawDataList);
return rawDataList;
}
//endregion
//region SAUNA II
@Override
public List<ProvisionData> getSauna2(String code, Date startDate, Date endDate) {
String actualCode = (code == null || code.trim().isEmpty()) ? "SAUNA2" : code;
//获取Particulate类型的台站信息
List<GardsStations> stations = imsDataMonitorMapper.findEfficStationList(actualCode);
String[] times = getDataTime(startDate, endDate);
//有效率状态
return getSauna2StationDailyData(stations, times[0], times[1]);
}
private List<ProvisionData> getSauna2StationDailyData(List<GardsStations> stationList,
String startTime, String endTime) {
if (CollectionUtil.isEmpty(stationList)) {
return new ArrayList<>();
}
String collectLow = "5.4";
String collectHigh = "6.6";
String liveLow = "4.2";
String liveHigh = "6.6";
String quantity = "10";
String xeVolume = "0.87";
String mdc = "1";
String nuclideName = "Xe133";
String liveQc = "600";
String number = "16";
//每个台站一个月的有效率
PhdfProvisionEfficiency efficiency = new PhdfProvisionEfficiency();
List<Integer> sts = stationList.stream()
.map(GardsStations::getStationId)
.collect(Collectors.toList());
efficiency.setStationId(sts);
efficiency.setNumber(number);
efficiency.setCollectHigh(collectHigh);
efficiency.setLiveHigh(liveHigh);
efficiency.setCollectLow(collectLow);
efficiency.setLiveLow(liveLow);
efficiency.setQuantity(quantity);
efficiency.setCurDateTime(endTime);
efficiency.setPretime(startTime);
efficiency.setNuclideName(nuclideName);
efficiency.setMdc(mdc);
efficiency.setLiveQc(liveQc);
efficiency.setXeVolume(xeVolume);
//查询数据库 获取台站有效率
List<ProvisionData> rawDataList =
imsDataMonitorMapper.findPhdfSauna2Efficiency(efficiency);
//dataMap.put(station.getStationCode(), rawDataList);
return rawDataList;
}
//endregion
//region SAUNA III
@Override
public List<ProvisionData> getSauna3(String code, Date startDate, Date endDate) {
String actualCode = (code == null || code.trim().isEmpty()) ? "SAUNA3" : code;
//获取Particulate类型的台站信息
List<GardsStations> stations = imsDataMonitorMapper.findEfficStationList(actualCode);
String[] times = getDataTime(startDate, endDate);
//有效率状态
return getSauna2StationDailyData(stations, times[0], times[1]);
}
//endregion
}

View File

@ -5,12 +5,10 @@ import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.http.client.utils.URIBuilder;
import org.jeecg.common.api.vo.Result; import org.jeecg.common.api.vo.Result;
import org.jeecg.common.properties.HttpClientHostProperties; import org.jeecg.common.properties.HttpClientHostProperties;
import org.jeecg.sysEmail.entity.SysEmail; import org.jeecg.sysEmail.entity.SysEmail;
import org.jeecg.utils.HttpClientUtil; import org.jeecg.utils.HttpClientUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.format.annotation.DateTimeFormat; import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
@ -18,15 +16,11 @@ import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import java.io.IOException; import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@RestController @RestController
@RequestMapping("/sysEmail") @RequestMapping("/sysEmail")

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,288 @@
{
"success": true,
"message": "",
"code": 200,
"result": [
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-31"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-01"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-02"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-03"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-04"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-05"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-06"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-07"
},
{
"stationCode": "JPX38",
"dataNumber": 4,
"dataRate": 0,
"dataEfficiency": 25,
"collectStart": "2025-11-08"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-09"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-01"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-02"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-03"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-04"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-05"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-06"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-07"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-08"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-09"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-10"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-11"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-12"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-13"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-14"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-15"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-16"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-17"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-18"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-19"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-20"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-21"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-22"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-23"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-24"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-25"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-26"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-27"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-28"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-29"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-30"
}
],
"timestamp": 1768792471998
}

View File

@ -0,0 +1,288 @@
{
"success": true,
"message": "",
"code": 200,
"result": [
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-31"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-01"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-02"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-03"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-04"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-05"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-06"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-07"
},
{
"stationCode": "JPX38",
"dataNumber": 4,
"dataRate": 0,
"dataEfficiency": 25,
"collectStart": "2025-11-08"
},
{
"stationCode": "JPX38",
"dataNumber": 2,
"dataRate": 0,
"dataEfficiency": 12.5,
"collectStart": "2025-11-09"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-01"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-02"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-03"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-04"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-05"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-06"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-07"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-08"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-09"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-10"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-11"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-12"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-13"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-14"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-15"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-16"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-17"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-18"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-19"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-20"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-21"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-22"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-23"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-24"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-25"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-26"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-27"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-28"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-29"
},
{
"stationCode": "JPX38",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-12-30"
}
],
"timestamp": 1768792471998
}

View File

@ -0,0 +1,596 @@
{
"success": true,
"message": "",
"code": 200,
"result": [
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-09-30"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-09-30"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-09-30"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-01"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-01"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-02"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-02"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-02"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-03"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-03"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-03"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-04"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-04"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-04"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-05"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-05"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-05"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-06"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-06"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-06"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-07"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-07"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-07"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-08"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-08"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-08"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-09"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-09"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-09"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-10"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-10"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-10"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-11"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-11"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-11"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-12"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-12"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-12"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-13"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-13"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-13"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-14"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-14"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-14"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-15"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-15"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-15"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-16"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-16"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-17"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-17"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-18"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-18"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-19"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-19"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-19"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-20"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-20"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-20"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-21"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-21"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-21"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-22"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-22"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-22"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-23"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-23"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-23"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-24"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-24"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-24"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-25"
},
{
"stationCode": "DEX33",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-25"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-25"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-26"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-26"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-27"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-27"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-28"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-28"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-29"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-29"
},
{
"stationCode": "CMX13",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-30"
},
{
"stationCode": "CNX20",
"dataNumber": 0,
"dataRate": 0,
"dataEfficiency": 0,
"collectStart": "2025-10-30"
}
],
"timestamp": 1768791911932
}