Bläddra i källkod

生化报警临时提交

wangmiaomiao 9 månader sedan
förälder
incheckning
ee914c9561

+ 3 - 0
slibra-common/src/main/java/com/slibra/common/enums/BusinessEnum.java

@@ -41,6 +41,9 @@ public class BusinessEnum {
         CS_AD_YC("出水氨氮", "出水氨氮"),
         CS_XSY_1_YC("硝酸盐#1", "硝酸盐#1"),
         CS_XSY_2_YC("硝酸盐#2", "硝酸盐#2"),
+        WNND_MLSS_1("污泥浓度MLSS#1", "污泥浓度MLSS#1"),
+        WNND_MLSS_2("污泥浓度MLSS#2", "污泥浓度MLSS#2"),
+        HFXWNNDZB("挥发性污泥浓度占比(VSS/SS)", "挥发性污泥浓度占比(VSS/SS)"),
 
         ;
 

+ 698 - 0
slibra-common/src/main/java/com/slibra/common/utils/LocalDateTimeUtil.java

@@ -0,0 +1,698 @@
+package com.slibra.common.utils;
+
+import java.security.NoSuchAlgorithmException;
+import java.security.SecureRandom;
+import java.text.SimpleDateFormat;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.time.temporal.TemporalAdjusters;
+import java.time.temporal.TemporalUnit;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Random;
+
+/**
+ * 时间处理工具类
+ *
+ * @return
+ */
+public class LocalDateTimeUtil{
+
+    /**
+     * 时间格式
+     */
+    private static final String YYYY_MM_DD_HH_MM_SS_SSS = "yyyy-MM-dd HH:mm:ss.SSS";
+    private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+    private static final String YYYY_MM_DD_HH_MM = "yyyy-MM-dd HH:mm";
+    private static final String YYYY_MM_DD_HH = "yyyy-MM-dd HH";
+    private static final String YYYY_MM_DD = "yyyy-MM-dd";
+    private static final String YYYY_MM = "yyyy-MM";
+    private static final String YYYY = "yyyy";
+
+    /**
+     * 获取时间类型
+     * 1-包含开始和结束时间(默认)
+     * 2-包含结束-不包含开始时间   // 开始时间+1天
+     * 3-包含开始-不包含结束时间   // 结束时间-1天
+     * 4-不包含开始和结束时间 // 开始时间+1天  or 结束时间-1天
+     */
+    private static final int BETWEEN_TYPE_ONE = 1;
+    private static final int BETWEEN_TYPE_TWO = 2;
+    private static final int BETWEEN_TYPE_THREE = 3;
+    private static final int BETWEEN_TYPE_FOUR = 4;
+
+    private static Random random;
+
+    static {
+        try {
+            random = SecureRandom.getInstanceStrong();
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     * 判断时间 小于
+     * <P>   t1 < t2 = true (如:2019-10-13 11:11:00 < 2020-11-13 13:13:00 = true)  </P>
+     *
+     * @author wangsong
+     */
+    public static boolean isBefore(LocalDateTime t1, LocalDateTime t2) {
+        return t1.isBefore(t2);
+    }
+
+    /**
+     * 判断时间 大于
+     * <P>   t1 > t2 = true  </P>
+     *
+     * @author wangsong
+     */
+    public static boolean isAfter(LocalDateTime t1, LocalDateTime t2) {
+        return t1.isAfter(t2);
+    }
+
+
+    /**
+     * 自构建 LocalDateTime ==> 年,月,日,时,分
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute) {
+        return LocalDateTime.of(year, month, dayOfMonth, hour, minute);
+    }
+
+    /**
+     * 自构建 LocalDateTime ==> 年,月,日,时,分,秒,毫秒(精确到9位数)
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond) {
+        return LocalDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond);
+    }
+
+
+    //========================================================================================================
+    //========================================================================================================
+    //========================================================================================================
+    //============================================== 时间获取 =================================================
+    //========================================================================================================
+    //========================================================================================================
+
+    /**
+     * 获取指定某一天的开始时间 00:00:00
+     *
+     * @param time
+     * @return java.time.LocalDateTime
+     * @author wangsong
+     * @date 2020/12/24 0024 15:10
+     * @version 1.0.1
+     */
+    public static LocalDateTime getDayStart(LocalDateTime time) {
+        return time.withHour(0)
+                .withMinute(0)
+                .withSecond(0)
+                .withNano(0);
+    }
+
+
+    /**
+     * 获取指定某一天的结束时间  23:59:59.999999
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime getDayEnd(LocalDateTime time) {
+        // 年 月  天 时 分 秒 毫秒(这里精确到6位数)
+        return time.withHour(23)
+                .withMinute(59)
+                .withSecond(59)
+                .withNano(999999);
+    }
+
+    /**
+     * 获取指定时间是周几  1到7
+     *
+     * @author wangsong
+     */
+    public static int week(LocalDateTime time) {
+        return time.getDayOfWeek().getValue();
+    }
+
+
+
+    /**
+     * 获取指定时间之后的日期
+     * <P>  根据field不同加不同值 , field为ChronoUnit.*
+     * 秒   ChronoUnit.SECONDS
+     * 分   ChronoUnit.MINUTES
+     * 时   ChronoUnit.HOURS
+     * 半天  ChronoUnit.HALF_DAYS
+     * 天    ChronoUnit.DAYS
+     * 月    ChronoUnit.MONTHS
+     * 年    ChronoUnit.YEARS
+     * </P>
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime plus(LocalDateTime time, long number, TemporalUnit field) {
+        return time.plus(number, field);
+    }
+
+
+    /**
+     * 获取两个日期的时间差
+     *
+     * @param startTime 开始时间
+     * @param endTime   计算时间
+     * @param field     根据field不同减不同值 , field 为 ChronoUnit.*
+     * @return startTime小 endTime大 返回正数,则反之
+     * @author wangsong
+     * <p>
+     * 秒    ChronoUnit.SECONDS
+     * 分    ChronoUnit.MINUTES
+     * 时    ChronoUnit.HOURS
+     * 半天  ChronoUnit.HALF_DAYS
+     * 天    ChronoUnit.DAYS
+     * 月    ChronoUnit.MONTHS
+     * 年    ChronoUnit.YEARS
+     * </P>
+     */
+    public static long betweenTwoTime(LocalDateTime startTime, LocalDateTime endTime, ChronoUnit field) {
+        Period period = Period.between(LocalDate.from(startTime), LocalDate.from(endTime));
+        if (field == ChronoUnit.YEARS) {
+            return period.getYears();
+        }
+        if (field == ChronoUnit.MONTHS) {
+            return period.getYears() * 12L + period.getMonths();
+        }
+        return field.between(startTime, endTime);
+    }
+
+
+    /**
+     * 获取指定时间之前的日期
+     *
+     * @author wangsong
+     * <P> 根据field不同减不同值, field 为 ChronoUnit.*
+     * 秒   ChronoUnit.SECONDS
+     * 分   ChronoUnit.MINUTES
+     * 时   ChronoUnit.HOURS
+     * 半天  ChronoUnit.HALF_DAYS
+     * 天    ChronoUnit.DAYS
+     * 月    ChronoUnit.MONTHS
+     * 年    ChronoUnit.YEARS
+     * </P>
+     * @version 1.0.1
+     */
+    public static LocalDateTime subtract(LocalDateTime time, long number, TemporalUnit field) {
+        return time.minus(number, field);
+    }
+
+
+
+    /**
+     * 获取指定时间 加或减N周的第一天 00:00:00
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime weekFirstDay(LocalDateTime time, int num) {
+        int week = week(LocalDateTime.now());
+        LocalDateTime newTime = subtract(LocalDateTime.now(), week - 1L, ChronoUnit.DAYS);
+        newTime = plus(newTime, num * 7L, ChronoUnit.DAYS);
+        return getDayStart(newTime);
+    }
+
+
+    /**
+     * 获取指定时间 加或减N周的最后一天  23:59:59:999999
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime weekLastDay(LocalDateTime time, int num) {
+        int week = week(LocalDateTime.now());
+        LocalDateTime newTime = plus(LocalDateTime.now(), 7L - week, ChronoUnit.DAYS);
+        newTime = plus(newTime, num * 7L, ChronoUnit.DAYS);
+        return getDayEnd(newTime);
+    }
+
+
+    /**
+     * 获取指定月 加或减N月的第一天 00:00:00
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime monthFirstDay(LocalDateTime time, int num) {
+        LocalDateTime newTime = plus(time, num, ChronoUnit.MONTHS);
+        newTime = newTime.with(TemporalAdjusters.firstDayOfMonth());
+        return getDayStart(newTime);
+    }
+
+    /**
+     * 获取指定月 加或减N月的最后一天 23:59:59:999999
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime monthLastDay(LocalDateTime time, int num) {
+        LocalDateTime newTime = plus(time, num, ChronoUnit.MONTHS);
+        newTime = newTime.with(TemporalAdjusters.lastDayOfMonth());
+        return getDayEnd(newTime);
+    }
+
+
+
+    /**
+     * 获取指定年 加或减N年的第一天 00:00:00
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime yearFirstDay(LocalDateTime time, int num) {
+        LocalDateTime newTime = plus(time, num, ChronoUnit.YEARS);
+        int year = newTime.getYear();
+        // 年 月  天 时 分 秒 毫秒(这里精确到9位数)
+        return LocalDateTime.of(year, 1, 1, 0, 0, 0);
+    }
+
+    /**
+     * 获取指定年 加或减N年最后一天  23:59:59:999999
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime yearLastDay(LocalDateTime time, int num) {
+        LocalDateTime newTime = subtract(time, num, ChronoUnit.YEARS);
+        int year = newTime.getYear();
+        // 年 月  天 时 分 秒 毫秒(这里精确到6位数)
+        return LocalDateTime.of(year, 12, 31, 23, 59, 59, 999999);
+    }
+
+
+    /**
+     * 获取17位时间戳字符串+3位随机数
+     * <p>  这里增加了线程锁和延时一毫秒,单体项目100%不会重复,可用于生成订单号  </p>
+     * 20200101125959999  2020-01-01 12:59:59:999
+     *
+     * @return
+     * @author wangsong
+     */
+    public static synchronized String getNo() {
+        String timeStamp = new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date());
+        timeStamp += (random.nextInt(10) + "") + (random.nextInt(10) + "") + (random.nextInt(10) + "");
+        return timeStamp;
+    }
+
+
+    /**
+     * 获取整点--  把指定时间的 分+秒设置为0
+     *
+     * @param time time
+     * @return java.time.LocalDateTime
+     * @author wangsong
+     * @date 2020/12/24 0024 15:10
+     * @version 1.0.1
+     */
+    public static LocalDateTime getTheHour(LocalDateTime time) {
+        // 分   // 秒   // 毫秒(这里精确到9位数)
+        return time.withMinute(0)
+                .withSecond(0)
+                .withNano(0);
+    }
+
+
+    /**
+     * 获取整分--  把指定时间的 秒设置为0
+     * <p>
+     //	 * 如:
+     //	 * 2020-01-01 12:10  ===>  等于 2020-01-01 12:20
+     //	 * 2020-01-01 12:11  ===>  等于 2020-01-01 12:20
+     //	 * 2020-01-01 12:19  ===>  等于 2020-01-01 12:20
+     * </P>
+     *
+     * @param time
+     * @return java.time.LocalDateTime
+     * @author wangsong
+     * @date 2020/12/24 0024 15:21
+     * @version 1.0.1
+     */
+    public static LocalDateTime getTheMinute(LocalDateTime time) {
+        // 秒    // 毫秒(这里精确到9位数)
+        return time.withSecond(0).withNano(0);
+    }
+
+
+    //========================================================================================================
+    //========================================================================================================
+    //========================================================================================================
+    //============================================== 转换相关 =================================================
+    //========================================================================================================
+    //========================================================================================================
+
+    /**
+     * LocalDateTime 转为 天 的字符串,如 1号返回 01
+     *
+     * @author wangsong
+     */
+    public static Integer parseDayInt(LocalDateTime time) {
+        return Integer.parseInt(parse(time, "dd"));
+    }
+
+
+    /**
+     * Date 转 LocalDateTime
+     *
+     * @author wangsong
+     */
+    public static LocalDateTime parseLdt(Date date) {
+        return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
+    }
+
+    /**
+     * LocalDateTime 转 Date
+     *
+     * @author wangsong
+     */
+    public static Date parseDate(LocalDateTime time) {
+        return Date.from(time.atZone(ZoneId.systemDefault()).toInstant());
+    }
+
+    /**
+     * LocalDateTime 转 毫秒
+     *
+     * @author wangsong
+     */
+    public static Long parseMillisecond(LocalDateTime time) {
+        return time.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+    }
+
+    /**
+     * LocalDateTime 转 秒
+     *
+     * @author wangsong
+     */
+    public static Long parseSecond(LocalDateTime time) {
+        return time.atZone(ZoneId.systemDefault()).toInstant().getEpochSecond();
+    }
+
+
+    /**
+     * 将时间戳转 为 LocalDateTime
+     *
+     * @param timestamp
+     * @return java.lang.String
+     * @author wangsong
+     * @date 2021/5/12 0012 17:13
+     * @version 1.0.1
+     */
+    public static LocalDateTime parseTimestamp(Long timestamp) {
+        return LocalDateTime.ofEpochSecond(timestamp / 1000, 0, ZoneOffset.ofHours(8));
+    }
+
+    /**
+     * 将LocalDateTime 转 为时间戳
+     *
+     * @return java.lang.String
+     * @author wangsong
+     * @date 2021/5/12 0012 17:13
+     * @version 1.0.1
+     */
+    public static Long parseTimestamp(LocalDateTime time) {
+        return time.toEpochSecond(ZoneOffset.ofHours(8));
+    }
+
+
+
+
+
+    /**
+     * String 类型转成 LocalDateTime ,必须为完整时间,如:2020-01-20 00:00:00
+     *
+     * @param timeStr 时间字符串
+     * @return java.time.LocalDateTime
+     */
+    public static LocalDateTime parse(String timeStr) {
+        return parse(timeStr, YYYY_MM_DD_HH_MM_SS);
+    }
+
+
+    /**
+     * String (2020-01-20 00:00:00)类型转成 LocalDateTime
+     *
+     * @param timeStr timeStr 时间字符串
+     * @param pattern pattern 格式
+     * @return java.time.LocalDateTime
+     */
+    public static LocalDateTime parse(String timeStr, String pattern) {
+        if (pattern.equals(YYYY)) {
+            timeStr += "-01-01 00:00:00";
+        } else if (pattern.equals(YYYY_MM)) {
+            timeStr += "-01 00:00:00";
+        } else if (pattern.equals(YYYY_MM_DD)) {
+            timeStr += " 00:00:00";
+        } else if (pattern.equals(YYYY_MM_DD_HH)) {
+            timeStr += ":00:00";
+        } else if (pattern.equals(YYYY_MM_DD_HH_MM)) {
+            timeStr += ":00";
+        }
+        DateTimeFormatter dtf = DateTimeFormatter.ofPattern(YYYY_MM_DD_HH_MM_SS);
+        return LocalDateTime.parse(timeStr, dtf);
+    }
+
+
+    /**
+     * LocalDateTime 转完整 String 类型的时间 如:2020-01-20 00:00:00
+     *
+     * @param time time
+     * @return java.lang.String
+     */
+    public static String parse(LocalDateTime time) {
+        return parse(time, YYYY_MM_DD_HH_MM_SS);
+    }
+
+    /**
+     * LocalDateTime 转指定类型的字符串
+     *
+     * @param time    time    时间
+     * @param pattern pattern 格式
+     *
+     * @return java.lang.String
+     * @author wangsong
+     */
+    public static String parse(LocalDateTime time, String pattern) {
+        if (time == null) {
+            return null;
+        }
+        DateTimeFormatter df = DateTimeFormatter.ofPattern(pattern);
+        return df.format(time);
+    }
+
+
+    /**
+     * Date 转指定格式的字符串
+     *
+     * @param time
+     * @author wangsong
+     */
+    public static String parse(Date time, String pattern) {
+        if (time == null) {
+            return null;
+        }
+        SimpleDateFormat format = new SimpleDateFormat(pattern);
+        return format.format(time);
+    }
+
+
+
+    /**
+     * 获取指定天的24小时(0-23)  |  yyyy-MM-dd HH 格式
+     *
+     * @param t 开始月
+     * @return
+     */
+    public static List<String> getDay24Hour(LocalDateTime t) {
+        if (t == null) {
+            return new ArrayList<>();
+        }
+        List<String> times = new ArrayList<>();
+        String time = parse(t, YYYY_MM_DD);
+        int hourNum = 24;
+        for (int i = 0; i < hourNum; i++) {
+            if (i < 10) {
+                times.add(time + " 0" + i);
+            } else {
+                times.add(time + " " + i);
+            }
+        }
+        return times;
+    }
+
+
+    /**
+     * 获取每一天的时间 (指定时间 前n月前的第一天 到 n月后的最后一天的所有时间)
+     * <P>  一天一条数据 List<DateDays>  </P>
+     *
+     * @param startNum 前n月,当前月开始为 0
+     * @param endNum   后n月,当前月就是为 0
+     * @return java.util.List<com.lplb.common.utils.LocalDateTimeUtil.DateDays>
+     * @author wangsong
+     */
+    public static List<DateDays> getBetweenDaysUpListByMonth(LocalDateTime time, Integer startNum, Integer endNum) {
+        // 本月第一天  00:00:00
+        LocalDateTime startTime = monthFirstDay(time, startNum);
+        // n月后的最后一天 23:59:59.999
+        LocalDateTime endTime = monthLastDay(time, endNum);
+        return getBetweenDaysUpList(startTime, endTime, BETWEEN_TYPE_ONE);
+    }
+
+
+    /**
+     * 获取每一天的时间 (指定开始时间和结束时间)
+     * <P>
+     *     一天一条数据 List<DateDays>
+     *     返回数据包括 开始时间 和 结束时间 的当天数据
+     *  </P>
+     *
+     * @param startTime 开始时间 (时分秒已开始时间位为准)
+     * @param endTime   结束时间
+     * @param type    1-包含开始和结束时间  2-包含结束-不包含开始时间  3-包含开始-不包含结束时间  4-不包含开始和结束时间
+     * @return java.util.List<com.lplb.common.utils.LocalDateTimeUtil.DateDays>
+     * @author wangsong
+     */
+    public static List<DateDays> getBetweenDaysUpList(LocalDateTime startTime, LocalDateTime endTime, Integer type) {
+        List<DateDays> dateDaysList = new ArrayList<>();
+        List<LocalDateTime> betweenList = getBetweenDaysList(startTime, endTime, type);
+        for (LocalDateTime localDateTime : betweenList) {
+            dateDaysList.add(new DateDays(localDateTime, week(localDateTime)));
+        }
+        return dateDaysList;
+    }
+
+
+    /**
+     * 获取指定开始时间到指定结束时间的每一天, 包括开始时间,不包括结束时间,如:2020-5-16到2020-5-18 获得时间为:[2020-5-16,2020-5-17]
+     *
+     * @param startTime
+     * @param endTime
+     * @param type    1-包含开始和结束时间  2-包含结束-不包含开始时间  3-包含开始-不包含结束时间  4-不包含开始和结束时间
+     * @return java.util.List<java.time.LocalDateTime>
+     * @author wangsong
+     * @date 2020/12/24 0024 15:16
+     * @version 1.0.1
+     */
+    public static List<LocalDateTime> getBetweenDaysList(LocalDateTime startTime, LocalDateTime endTime, Integer type) {
+        // 指定开始时间  00:00:00  // 指定结束时间  00:00:00
+        LocalDateTime oldStartTime = getDayStart(startTime);
+        LocalDateTime oldEndTime = getDayStart(endTime);
+        // 1-包含开始和结束时间(默认) BetweenType
+        // 2-包含结束-不包含开始时间   // 开始时间+1天
+        // 3-包含开始-不包含结束时间   // 结束时间-1天
+        // 4-不包含开始和结束时间 // 开始时间+1天  or 结束时间-1天
+        if (type == BETWEEN_TYPE_TWO) {
+            oldStartTime = plus(oldStartTime, 1, ChronoUnit.DAYS);
+        } else if (type == BETWEEN_TYPE_THREE) {
+            oldEndTime = subtract(endTime, 1, ChronoUnit.DAYS);
+        } else if (type == BETWEEN_TYPE_FOUR) {
+            oldStartTime = plus(oldStartTime, 1, ChronoUnit.DAYS);
+            oldEndTime = subtract(endTime, 1, ChronoUnit.DAYS);
+        }
+        // 返回数据
+        List<LocalDateTime> everyDays = new ArrayList<>();
+        // 第一天数据
+        everyDays.add(oldStartTime);
+        while (true) {
+            // 获取之后的每一天时间
+            LocalDateTime nextDay = plus(everyDays.get(everyDays.size() - 1), 1, ChronoUnit.DAYS);
+            // 大于最后一天-跳出循环
+            if (isAfter(nextDay, oldEndTime)) {
+                break;
+            }
+            everyDays.add(nextDay);
+        }
+        return everyDays;
+    }
+
+
+    /**
+     * 获取月 (返回每一个月的字串, yyyy-MM 格式)
+     * <p> 包含结束月,不包含开始月 </>
+     *
+     * @param startTime 开始月
+     * @param endTime   结束月
+     * @return
+     */
+    public static List<String> getBetweenMonthsList(LocalDateTime startTime, LocalDateTime endTime) {
+        List<String> times = new ArrayList<>();
+        if (startTime != null && endTime != null) {
+            // 获取开始月的第一天
+            endTime = monthFirstDay(endTime, 0);
+            times.add(parse(startTime, YYYY_MM));
+            while (isBefore(startTime, endTime)) {
+                startTime = plus(startTime, 1, ChronoUnit.MONTHS);
+                times.add(parse(startTime, YYYY_MM));
+            }
+        }
+        return times;
+    }
+
+
+    /**
+     * 获取日期端的数据保存对象
+     *
+     * @author ws
+     * @mail 1720696548@qq.com
+     * @date 2020/5/7 0007 9:41
+     */
+    public static class DateDays {
+        // 当天时间- 年月日/00:00:00
+        private LocalDateTime dayTime;
+        // 当天是周几
+        private int week;
+
+        public DateDays(LocalDateTime dayTime, int week) {
+            this.dayTime = dayTime;
+            this.week = week;
+        }
+
+        public LocalDateTime getDayTime() {
+            return dayTime;
+        }
+
+        public void setDayTime(LocalDateTime dayTime) {
+            this.dayTime = dayTime;
+        }
+
+        public int getWeek() {
+            return week;
+        }
+
+        public void setWeek(int week) {
+            this.week = week;
+        }
+    }
+
+
+
+    public static LocalDate getCurrentDate(){
+        return LocalDate.now();
+    }
+
+    public static int getCurrentMonth(LocalDate currentDate){
+        // 获取当前月份
+        Month currentMonth = currentDate.getMonth();
+        // 打印当前月份
+        // 如果你想要获取月份的数字(1-12),你可以使用getValue()方法
+        return currentMonth.getValue();
+    }
+
+
+    public static void main(String[] args) {
+        System.out.println(getCurrentMonth(getCurrentDate()));
+        System.out.println(isSummer());
+    }
+
+    //判断龙江业务 是否是冬季 还是 夏季
+    //5到9月算夏天,其他算冬天
+    public static boolean isSummer(){
+        int currentMonth = getCurrentMonth(getCurrentDate());
+        return currentMonth == 5 || currentMonth == 6 || currentMonth == 7 || currentMonth == 8 || currentMonth == 9;
+    }
+
+}

+ 119 - 72
slibra-quartz/src/main/java/com/slibra/quartz/task/AsyncTask.java

@@ -15,6 +15,8 @@ import com.slibra.business.res.ShowValueJSBasic;
 import com.slibra.common.constant.MyConstants;
 import com.slibra.common.enums.BusinessEnum;
 import com.slibra.common.utils.DateUtils;
+import com.slibra.common.utils.LocalDateTimeUtil;
+import com.slibra.common.utils.StringUtils;
 import com.slibra.common.utils.uuid.IdUtils;
 import inference.InferenceAPIsServiceGrpc;
 import inference.PredictionResponse;
@@ -92,7 +94,7 @@ public class AsyncTask {
         this.handleSZWarning(tXinyiIndustry, normConfig);
 
         //2024年5月28日14:14:26  下面是新增的 生化报警处理
-        this.handleSHWarning(tXinyiIndustry, normConfig);
+        this.handleSHWarning(tXinyiIndustry, normConfig, xinyiCalculate);
     }
 
     /**
@@ -505,100 +507,123 @@ public class AsyncTask {
         return tXinyiCalculate;
     }
 
-    private void handleSHWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
+    private void handleSHWarning(TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, TXinyiCalculate xinyiCalculate) {
         //判断对应指标是否报警  然后调研大模型获取决策信息
         BigDecimal jsSlq = tXinyiIndustry.getJsSlq();
         //内回流比报警
-        /*BigDecimal nhlbSjz = normConfig.getNhlbSjz();//400
-        BigDecimal nhlbnkSxz = normConfig.getNhlbnkSxz();//360
+//        BigDecimal nhlbSjz = normConfig.getNhlbSjz();//400
+//        BigDecimal nhlbnkSxz = normConfig.getNhlbnkSxz();//360
+        BigDecimal nhlbnkXxz = normConfig.getNhlbnkXxz();//270
         BigDecimal nhlbqdsl = normConfig.getNHLBQDSL();
         BigDecimal nhlbdsjll = normConfig.getNHLBDSJLL();
         BigDecimal nhlbgzxl = normConfig.getNHLBGZXL();
-        if(!Objects.isNull(jsSlq) && !Objects.isNull(nhlbnkSxz) && !Objects.isNull(nhlbqdsl)
+        if(!Objects.isNull(jsSlq) && !Objects.isNull(nhlbnkXxz) && !Objects.isNull(nhlbqdsl)
                 && !Objects.isNull(nhlbdsjll) && !Objects.isNull(nhlbgzxl)){
             BigDecimal divide = nhlbqdsl.multiply(nhlbdsjll).multiply(nhlbgzxl).divide(jsSlq, 4, RoundingMode.HALF_UP);
-            if(!Objects.isNull(nhlbSjz)){
-                handleXinYiWarningsSH(nhlbSjz, divide, nhlbnkSxz, BusinessEnum.WarningCategoryEnum.NHLB.getCode(), tXinyiIndustry, normConfig);
-            }
+            handleXinYiWarningsSH(nhlbnkXxz, divide, BusinessEnum.WarningCategoryEnum.NHLB.getCode(), tXinyiIndustry, normConfig, true);
         }
 
         //外回流比报警
         BigDecimal whlbqdsl = normConfig.getWHLBQDSL();
         BigDecimal whlbdsjll = normConfig.getWHLBDSJLL();
         BigDecimal whlbgzxl = normConfig.getWHLBGZXL();
-        BigDecimal whlbnkXxz = normConfig.getWhlbnkXxz();
-        BigDecimal whlbSjz = normConfig.getWhlbSjz();
+        BigDecimal whlbnkXxz = normConfig.getWhlbnkXxz();//75
+//        BigDecimal whlbSjz = normConfig.getWhlbSjz();
         if(!Objects.isNull(whlbqdsl) && !Objects.isNull(whlbdsjll) && !Objects.isNull(whlbgzxl)){
             BigDecimal divide = whlbqdsl.multiply(whlbdsjll).multiply(whlbgzxl).divide(jsSlq, 4, RoundingMode.HALF_UP);
-            if(!Objects.isNull(whlbSjz)){
-                handleXinYiWarningsSH(whlbSjz, divide, whlbnkXxz, BusinessEnum.WarningCategoryEnum.WHLB.getCode(), tXinyiIndustry, normConfig);
-            }
-        }*/
+            handleXinYiWarningsSH(whlbnkXxz, divide, BusinessEnum.WarningCategoryEnum.WHLB.getCode(), tXinyiIndustry, normConfig, true);
+        }
 
 
         //最新的一条日报数据
-        List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(null);
+        /*List<TXinyiDaily> tXinyiDailies = this.xinyiDailyMapper.selectTXinyiDailyList(null);
         if(CollectionUtils.isEmpty(tXinyiDailies))
             return;//肯定不会出现这种情况 因为有很多历史数据了
-        TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);
+        TXinyiDaily tXinyiDaily = tXinyiDailies.get(0);*/
+        TXinyiDaily tXinyiDaily = this.xinyiDailyMapper.selectNewestData();
+        if(Objects.isNull(tXinyiDaily))
+            return;//肯定不会出现这种情况 因为有很多历史数据了  新水厂可能会有这个问题
         log.info("生化报警获取日报的最新的一条数据为{}", JSON.toJSONString(tXinyiDaily));
-        BigDecimal jsBod5 = tXinyiDaily.getJsBod5();
+
+        //污泥浓度报警
+        BigDecimal sjscgkz = null;
+        //判断是否是夏季
+        if(LocalDateTimeUtil.isSummer())
+            sjscgkz = normConfig.getXjwnndXxz();
+        else
+            sjscgkz = normConfig.getDjwnndXxz();
+        //#1
+        BigDecimal oneMlss = tXinyiIndustry.getOneMlss();
+        if(!Objects.isNull(oneMlss) && !Objects.isNull(sjscgkz)){
+            handleXinYiWarningsSH(sjscgkz, oneMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_1.getCode(), tXinyiIndustry, normConfig, true);
+        }
+        //#1
+        BigDecimal twoMlss = tXinyiIndustry.getTwoMlss();
+        if(!Objects.isNull(twoMlss) && !Objects.isNull(sjscgkz)){
+            handleXinYiWarningsSH(sjscgkz, twoMlss, BusinessEnum.WarningCategoryEnum.WNND_MLSS_2.getCode(), tXinyiIndustry, normConfig, true);
+        }
+
 
         //污泥负荷(需要从日报获取数据) 计算 + 部分数据从日报获取
         //污泥负荷=[Ls]=24*([BOD_in]-[BOD_off])*[Q_in]/[MLSS]/([V_hao]+[V_que]+[V_yan])/2 kgBOD/(kgMLSS·d)
-        //todo  后面再加 计算太复杂
-
-        //碳氮比(需要从日报获取数据)
-        //进水碳氮比=[b]=[BOD_in]/[TN_in]
-        /*BigDecimal jsTn = tXinyiIndustry.getJsTn();
-        if(!Objects.isNull(jsBod5) && !Objects.isNull(jsTn)){
-            BigDecimal divide = jsBod5.divide(jsTn, 4, RoundingMode.HALF_UP);
-            BigDecimal jstdbnkzSxz = normConfig.getJstdbnkzSxz();
-            BigDecimal cstdbSjz = normConfig.getCstdbSjz();
-            if(!Objects.isNull(whlbSjz)){
-                handleXinYiWarningsSH(cstdbSjz, divide, jstdbnkzSxz, BusinessEnum.WarningCategoryEnum.TDB.getCode(), tXinyiIndustry, normConfig);
-            }
+        //2024年6月27日17:18:33 直接从计算结果拿到
+        BigDecimal fm = xinyiCalculate.getFM();
+        //todo 污泥负荷内控下限值 没有(先用上限制)
+        BigDecimal wnfhnkSxz = normConfig.getWnfhnkSxz();
+        if(!Objects.isNull(fm) && !Objects.isNull(wnfhnkSxz)){
+            handleXinYiWarningsSH(wnfhnkSxz, fm, BusinessEnum.WarningCategoryEnum.WNFH.getCode(), tXinyiIndustry, normConfig, true);
         }
 
-        //碳磷比(需要从日报获取数据)
-        //进水碳磷比=[c]=[BOD_in]/[TP_in]
-        BigDecimal jsTp = tXinyiIndustry.getJsTp();
-        BigDecimal jstlbSjz = normConfig.getJstlbSjz();
-        if(!Objects.isNull(jsBod5) && !Objects.isNull(jsTp)){
-            BigDecimal divide = jsBod5.divide(jsTp, 4, RoundingMode.HALF_UP);
-            BigDecimal jstlbNkz = normConfig.getJstlbNkz();
-            if(!Objects.isNull(jstlbSjz)){
-                handleXinYiWarningsSH(jstlbSjz, divide, jstlbNkz, BusinessEnum.WarningCategoryEnum.TLB.getCode(), tXinyiIndustry, normConfig);
-            }
+        //万吨水产泥率(todo 没有计算规则,只能从日报获取)
+
+
+        //挥发性污泥浓度占比(VSS/SS)
+        //特殊:小于
+        BigDecimal hfxwnndzb = xinyiCalculate.getHFXWNNDZB();
+        BigDecimal hfxwnndzbSjz = normConfig.getHfxwnndzbSjz();
+        if(!Objects.isNull(hfxwnndzb) && !Objects.isNull(hfxwnndzbSjz)){
+            handleXinYiWarningsSH(hfxwnndzbSjz, hfxwnndzb, BusinessEnum.WarningCategoryEnum.HFXWNNDZB.getCode(), tXinyiIndustry, normConfig, false);
         }
 
-        //BOD比COD(需要从日报获取数据)
-        //进水BOD与COD比值数据=[d]=[BOD_in]/[COD_in]
-        BigDecimal jsCod = tXinyiIndustry.getJsCod();
-        if(!Objects.isNull(jsBod5) && !Objects.isNull(jsCod)){
-            BigDecimal jsbodycodbzSzj = normConfig.getJsbodycodbzSzj();
-            String jsbodycodbzGkz = normConfig.getJsbodycodbzGkz();
-            if(StringUtils.isNotBlank(jsbodycodbzGkz) && jsbodycodbzGkz.contains("-")){
-                String[] split = jsbodycodbzGkz.split("-");
-                BigDecimal gkz = new BigDecimal(split[1]);
-                BigDecimal divide = jsBod5.divide(jsCod, 4, RoundingMode.HALF_UP);
-                handleXinYiWarningsSH(gkz, divide, jsbodycodbzSzj, BusinessEnum.WarningCategoryEnum.BODCODB.getCode(), tXinyiIndustry, normConfig);
+        //进水碳氮比
+        BigDecimal jsTdb = xinyiCalculate.getJsTdb();
+        BigDecimal jstdbnkzXxz = normConfig.getJstdbnkzXxz();
+        if(!Objects.isNull(jsTdb) && !Objects.isNull(jstdbnkzXxz)){
+            handleXinYiWarningsSH(jstdbnkzXxz, jsTdb, BusinessEnum.WarningCategoryEnum.TDB.getCode(), tXinyiIndustry, normConfig, false);
+        }
+
+        //进水碳磷比
+        BigDecimal jsTlb = xinyiCalculate.getJsTlb();
+        BigDecimal jstlbNkz = normConfig.getJstlbNkz();
+        if(!Objects.isNull(jsTlb) && !Objects.isNull(jstlbNkz)){
+            handleXinYiWarningsSH(jstlbNkz, jsTlb, BusinessEnum.WarningCategoryEnum.TLB.getCode(), tXinyiIndustry, normConfig, false);
+        }
+
+        //进水BOD与COD比值(生化性)
+        BigDecimal jsBodBCod = xinyiCalculate.getJsBodBCod();
+        String jsbodycodbzGkz = normConfig.getJsbodycodbzGkz();
+        if(!StringUtils.isBlank(jsbodycodbzGkz) && jsbodycodbzGkz.contains("-")){
+            String[] split = jsbodycodbzGkz.split("-");
+            sjscgkz = new BigDecimal(split[0]);
+            if(!Objects.isNull(jsBodBCod)){
+                handleXinYiWarningsSH(sjscgkz, jsBodBCod, BusinessEnum.WarningCategoryEnum.TLB.getCode(), tXinyiIndustry, normConfig, false);
             }
+        }
 
-        }*/
 
         //好氧区DO(一池) 2024年5月31日14:04:37 加数据,让他一直报警
         BigDecimal shcHyOneDo = tXinyiIndustry.getOneHymdDo();
 //        BigDecimal shcHyOneDo = new BigDecimal("5");
-        BigDecimal hycrjysjzSxz = normConfig.getHycrjysjzSxz();
+//        BigDecimal hycrjysjzSxz = normConfig.getHycrjysjzSxz();
         BigDecimal hycrjyNkz = normConfig.getHycrjyNkz();
-        if(!Objects.isNull(shcHyOneDo) && !Objects.isNull(hycrjysjzSxz)){
-            handleXinYiWarningsSH(hycrjysjzSxz, shcHyOneDo, hycrjyNkz, BusinessEnum.WarningCategoryEnum.HYQDO_ONE.getCode(), tXinyiIndustry, normConfig);
+        if(!Objects.isNull(shcHyOneDo) && !Objects.isNull(hycrjyNkz)){
+            handleXinYiWarningsSH(hycrjyNkz, shcHyOneDo, BusinessEnum.WarningCategoryEnum.HYQDO_ONE.getCode(), tXinyiIndustry, normConfig, true);
         }
         //好氧区DO(二池) 2024年5月31日14:09:36 溶解氧从日报获取  工业的不准
-        BigDecimal shcHyTwoDo = tXinyiDaily.getShcHyTwoDo();
-        if(!Objects.isNull(shcHyTwoDo) && !Objects.isNull(hycrjysjzSxz)){
-            handleXinYiWarningsSH(hycrjysjzSxz, shcHyTwoDo, hycrjyNkz, BusinessEnum.WarningCategoryEnum.HYQDO_TWO.getCode(), tXinyiIndustry, normConfig);
+        //2024年6月27日17:00:31  都先从工业库获取,日报没有必要再报警了
+        BigDecimal shcHyTwoDo = tXinyiIndustry.getTwoHymdDo();
+        if(!Objects.isNull(shcHyTwoDo) && !Objects.isNull(hycrjyNkz)){
+            handleXinYiWarningsSH(hycrjyNkz, shcHyTwoDo, BusinessEnum.WarningCategoryEnum.HYQDO_TWO.getCode(), tXinyiIndustry, normConfig, true);
         }
 
         //气水比(需要从日报获取数据)
@@ -615,15 +640,16 @@ public class AsyncTask {
 
     /**
      * 处理信义生化报警的逻辑 统一处理
-     * @param bzz
+     * @param sjscgkz :实际生产管控值
      * @param currentVal
-     * @param gkz
      * @param category
      * @param tXinyiIndustry
      * @param normConfig
+     * @param normal 是否常规判断:默认都是超过;只有这个挥发性污泥浓度占比(VSS/SS)是小于才报警
+     * 2024年6月27日15:39:15 调整:生化报警只取实际生产管控指标
+     *
      */
-    private void handleXinYiWarningsSH(BigDecimal bzz, BigDecimal currentVal, BigDecimal gkz, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig) {
-        BigDecimal multiply = bzz.multiply(new BigDecimal(MyConstants.SCALE_VALUE));
+    private void handleXinYiWarningsSH(BigDecimal sjscgkz, BigDecimal currentVal, String category, TXinyiIndustry tXinyiIndustry, TXinyiNormConfig normConfig, Boolean normal) {
         TXinyiWarningRecord tXinyiWarningRecord = new TXinyiWarningRecord();
         /*String category = BusinessEnum.WarningCategoryEnum.CS_AD.getCode();*/
         tXinyiWarningRecord.setStatus(0);
@@ -631,29 +657,50 @@ public class AsyncTask {
         tXinyiWarningRecord.setCategory(category);
         tXinyiWarningRecord.setTime(DateUtils.getNowDate());
         tXinyiWarningRecord.setWarningVal(currentVal);
-        tXinyiWarningRecord.setDesignVal(bzz);
-        tXinyiWarningRecord.setControlVal(gkz);
+        tXinyiWarningRecord.setDesignVal(sjscgkz);
+        tXinyiWarningRecord.setControlVal(sjscgkz);
         tXinyiWarningRecord.setCreateBy(WARNING_DEFAULT_CREATE);
         tXinyiWarningRecord.setCreateTime(DateUtils.getNowDate());
         tXinyiWarningRecord.setRemark("1");
 
-        //2024年5月25日17:52:33  如果工业库获取不到数据,也触发报警,但是不调用决策接口
-        if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
-            tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
-        } else if (currentVal.compareTo(multiply) > 0) {//一级
+        //2024年6月27日17:36:25 有一个判断是反正的
+        if(normal){
+            //2024年5月25日17:52:33  如果工业库获取不到数据,也触发报警,但是不调用决策接口
+            if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
+                tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
+                tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
+            } else if (currentVal.compareTo(sjscgkz) > 0) {//一级
+                tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
+                tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
+            } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
             tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
-            tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
-        } else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
+            tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
+        } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
+            tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
+            tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
+        }*/ else {
+                tXinyiWarningRecord = null;//这种的无需处理
+            }
+        }else{
+            //2024年5月25日17:52:33  如果工业库获取不到数据,也触发报警,但是不调用决策接口
+            if (Objects.isNull(currentVal) || currentVal.compareTo(BigDecimal.ZERO) == 0) {
+                tXinyiWarningRecord.setReason(category + EXCEPTION_WARNING);
+                tXinyiWarningRecord.setLevel(WARNING_LEVEL_NO_DATE);
+            } else if (currentVal.compareTo(sjscgkz) < 0) {//一级
+                tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
+                tXinyiWarningRecord.setLevel(WARNING_LEVEL_ONE);
+            } /*else if (currentVal.compareTo(bzz) >= 0 && currentVal.compareTo(multiply) <= 0) {//二级
             tXinyiWarningRecord.setReason(category + CHAOBIAO_WARNING);
             tXinyiWarningRecord.setLevel(WARNING_LEVEL_TWO);
         } else if (!Objects.isNull(gkz) && currentVal.compareTo(gkz) > 0) {
             tXinyiWarningRecord.setReason(category + CHAOGUANKONG_WARNING);
             tXinyiWarningRecord.setLevel(WARNING_LEVEL_THREE);
-        } else {
-            tXinyiWarningRecord = null;//这种的无需处理
+        }*/ else {
+                tXinyiWarningRecord = null;//这种的无需处理
+            }
         }
 
+
         //当前状态正常 需要查询历史有无正在报警的数据,如果有,将报警状态改完2(系统自动关闭)
         List<TXinyiWarningRecord> tXinyiWarningRecords = this.xinyiWarningRecordMapper.selectTXinyiWarningRecordList(TXinyiWarningRecord.builder().delFlag(0).type(1).category(category).status(0).build());
         if(Objects.isNull(tXinyiWarningRecord)){//数据正常,无告警信息