|
@@ -0,0 +1,79 @@
|
|
|
+package com.persagy.service.impl;
|
|
|
+
|
|
|
+import com.persagy.utils.DateUtils;
|
|
|
+import com.persagy.utils.condition.ConditionUtils;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+
|
|
|
+import java.time.LocalDateTime;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 用户自定义报警时间段
|
|
|
+ *
|
|
|
+ * @author lixing
|
|
|
+ * @version V1.0 2021/11/9 9:46 上午
|
|
|
+ **/
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class UserDefinePeriod {
|
|
|
+ @Value("${user.define.period.start:}")
|
|
|
+ private String userDefineStartTime;
|
|
|
+
|
|
|
+ @Value("${user.define.period.end:}")
|
|
|
+ private String userDefineEndTime;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断是否在用户定义的报警时间段内
|
|
|
+ *
|
|
|
+ * @param date 需要判断的时间
|
|
|
+ * @return 是否在用户定义的报警时间段内
|
|
|
+ * @author lixing
|
|
|
+ * @version V1.0 2021/11/9 9:50 上午
|
|
|
+ */
|
|
|
+ public boolean inUserDefinePeriod(Date date) {
|
|
|
+ if (date == null) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (StringUtils.isBlank(userDefineStartTime) || StringUtils.isBlank(userDefineEndTime)) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ if (!ConditionUtils.validateTime(userDefineStartTime) || !ConditionUtils.validateTime(userDefineEndTime)) {
|
|
|
+ log.error("用户自定义报警时间格式错误,此设置不会生效,时间格式应为HHmmss");
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 提取要判断的时间的年月日
|
|
|
+ LocalDateTime localDateTime = DateUtils.date2LocalDateTime(date);
|
|
|
+ String dateStr = localDateTime.format(DateTimeFormatter.ofPattern(DateUtils.sdfDay));
|
|
|
+
|
|
|
+ // 将用户定义的时间转换为localDateTime
|
|
|
+ LocalDateTime startTime = LocalDateTime.parse(
|
|
|
+ dateStr + userDefineStartTime, DateTimeFormatter.ofPattern(DateUtils.sdfTime));
|
|
|
+ LocalDateTime endTime = LocalDateTime.parse(
|
|
|
+ dateStr + userDefineEndTime, DateTimeFormatter.ofPattern(DateUtils.sdfTime));
|
|
|
+ // 如果开始时间晚于结束时间(例如用户定义的时间为:22:00 -> 8:00),代表用户自定义的结束时间为第二天的时间点
|
|
|
+ if (startTime.isAfter(endTime)) {
|
|
|
+ endTime = endTime.plusDays(1);
|
|
|
+ }
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 用户自定义时间设置为22:00 -> 8:00
|
|
|
+ * 接收到2号7:00的数据
|
|
|
+ * 期望根据1号22:00 -> 2号8:00进行判断
|
|
|
+ * 接收到2号9:00的数据
|
|
|
+ * 期望根据1号22:00 -> 2号8:00进行判断
|
|
|
+ * 接收到2号21:00的数据
|
|
|
+ * 期望根据2号22:00 -> 3号8:00进行判断
|
|
|
+ * 接收到2号23点的数据
|
|
|
+ * 期望根据2号22:00 -> 3号8:00进行判断
|
|
|
+ * 所以接收到2号的数据,需要判断是否在1号到2号以及2号到3号用户定义的时间段内
|
|
|
+ */
|
|
|
+ boolean inCurrentDayPeriod = localDateTime.isAfter(startTime) && localDateTime.isBefore(endTime);
|
|
|
+ boolean inYesterdayPeriod = localDateTime.isAfter(startTime.plusDays(-1)) && localDateTime.isBefore(endTime.plusDays(-1));
|
|
|
+ return inCurrentDayPeriod || inYesterdayPeriod;
|
|
|
+ }
|
|
|
+}
|