cjl
2025-01-06 27e6bc3df3e39e0d0b147b155a89ad6837ea972b
screen-common/src/main/java/com/moral/util/AmendUtils.java
@@ -57,6 +57,9 @@
            List<Double> data = new ArrayList<>();
            for (Map<String, Object> dataMap : list) {
                Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
                if (ObjectUtils.isEmpty(dataValue.get(Constants.SENSOR_CODE_O3))){
                    continue;
                }
                Double o3 = Double.parseDouble(dataValue.get(Constants.SENSOR_CODE_O3).toString());
                //O3数据标记位
@@ -249,15 +252,12 @@
    public static double percentile(List<Double> data, int p) {
        int n = data.size();
        Collections.sort(data);
        double v = n / (100 / p);
        if (n % (100 / p) == 0) {
            if (v == n) {
                return data.get(n - 1);
            }
            return (data.get((int) v - 1) + data.get((int) v)) / 2;
        }
        double v = MathUtils.division(MathUtils.mul(n, p),100d,1);
        v = Math.ceil(v)-1;
        return sciCal(data.get((int) v), 4);
    }
    //一氧化碳周月均值计算
    public static Map<String, Object> getCOAvgOfWeekOrMonth(Map<String, Object> params) {
@@ -327,4 +327,40 @@
        result.put(Constants.SENSOR_CODE_O3, percentile(data, 90));
        return result;
    }
    //各因子年均值计算
    /**
     * 年均值算法
     * PM2.5,PM10,CO,日均值95百分位
     * SO2,NO2,日均值98百分位
     * O3,日最大值90百分位
     *
     * @param list       数据
     * @param sensorCode 因子code
     */
    public static Double getAvgOfYear(List<Map<String, Object>> list, String sensorCode) {
        List<Double> data = new ArrayList<>();
        for (Map<String, Object> dataMap : list) {
            Map<String, Object> dataValue = JSONObject.parseObject((String) dataMap.get("value"), Map.class);
            Object o = dataValue.get(sensorCode);
            if (ObjectUtils.isEmpty(o)) {
                continue;
            }
            Double sensorValue = Double.parseDouble(o.toString());
            data.add(sensorValue);
        }
        if (data.size() == 0) {
            return null;
        }
        Double v = null;
        if ("PM2_5".equals(sensorCode) || "PM10".equals(sensorCode) || "CO".equals(sensorCode)) {
            v = percentile(data, 95);
        } else if ("SO2".equals(sensorCode) || "NO2".equals(sensorCode)) {
            v = percentile(data, 98);
        } else if ("O3".equals(sensorCode)) {
            v = percentile(data, 90);
        }
        return v;
    }
}