|
|
@@ -27,6 +27,7 @@ import com.usky.rule.util.RuleEngineUtil;
|
|
|
//import com.usky.rule.DeviceService;
|
|
|
import com.usky.rule.service.RuleEngineService;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.time.DayOfWeek;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.temporal.ChronoUnit;
|
|
|
import java.util.*;
|
|
|
@@ -156,28 +157,64 @@ public class ConsumptionJob implements Job {
|
|
|
Integer end = timeRange.getEnd();
|
|
|
Assert.notNull(start, "start不能为空");
|
|
|
Assert.notNull(end, "end不能为空");
|
|
|
- Assert.isTrue(end - start > 0, "结束时间必须大于起始时间");
|
|
|
- LocalDateTime startTime = null;
|
|
|
- LocalDateTime endTime = null;
|
|
|
- switch (TimeTypeEnum.get(timeRange.getType())) {
|
|
|
+ Assert.isTrue(end > start, "结束时间必须大于起始时间");
|
|
|
+
|
|
|
+ LocalDateTime startTime;
|
|
|
+ LocalDateTime endTime;
|
|
|
+
|
|
|
+ TimeTypeEnum typeEnum = TimeTypeEnum.get(timeRange.getType());
|
|
|
+ Assert.notNull(typeEnum, "不支持的时间类型");
|
|
|
+
|
|
|
+ // 老版本传统 switch 格式
|
|
|
+ switch (typeEnum) {
|
|
|
case HOUR:
|
|
|
- endTime = now.truncatedTo(ChronoUnit.HOURS);
|
|
|
- int hour = endTime.getHour();
|
|
|
- if (hour < start) {
|
|
|
- startTime = endTime.minusDays(1L).withHour(start);
|
|
|
+ // 支持跨天小时 22~26
|
|
|
+ LocalDateTime todayZeroHour = now.truncatedTo(ChronoUnit.DAYS);
|
|
|
+ startTime = todayZeroHour.withHour(start);
|
|
|
+
|
|
|
+ if (end >= 24) {
|
|
|
+ endTime = todayZeroHour.plusDays(1).withHour(end - 24);
|
|
|
} else {
|
|
|
- startTime = endTime.withHour(start);
|
|
|
+ endTime = todayZeroHour.withHour(end);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (now.isBefore(startTime)) {
|
|
|
+ startTime = startTime.minusDays(1);
|
|
|
+ endTime = endTime.minusDays(1);
|
|
|
}
|
|
|
break;
|
|
|
case DAY:
|
|
|
+ // 支持按当月实际天数跨月:start=5, end=33
|
|
|
+ LocalDateTime todayZeroDay = now.truncatedTo(ChronoUnit.DAYS);
|
|
|
+ startTime = todayZeroDay.withDayOfMonth(start);
|
|
|
+ // 结束时间 = 开始时间 + (end-1)天
|
|
|
+ endTime = startTime.plusDays(end - 1);
|
|
|
+
|
|
|
+ if (now.isBefore(startTime)) {
|
|
|
+ startTime = startTime.minusMonths(1);
|
|
|
+ endTime = endTime.minusMonths(1);
|
|
|
+ }
|
|
|
+ break;
|
|
|
case WEEK:
|
|
|
- endTime = now.truncatedTo(ChronoUnit.DAYS);
|
|
|
- int day = endTime.getDayOfMonth();
|
|
|
- if (day < start) {
|
|
|
- startTime = endTime.minusMonths(1L).withDayOfMonth(start);
|
|
|
- } else {
|
|
|
- startTime = endTime.withDayOfMonth(start);
|
|
|
+ LocalDateTime todayZeroWeek = now.truncatedTo(ChronoUnit.DAYS);
|
|
|
+
|
|
|
+ // 开始时间:本周 星期start(1=周一)
|
|
|
+ DayOfWeek todayWeek = todayZeroWeek.getDayOfWeek();
|
|
|
+ int weekVal = todayWeek.getValue();
|
|
|
+ startTime = todayZeroWeek.plusDays((long) start - weekVal);
|
|
|
+
|
|
|
+ // 结束时间:从开始时间 直接往后加 (end - start) 天
|
|
|
+ // 支持 end > 7,自动跨周、跨N周
|
|
|
+ endTime = startTime.plusDays(end - start);
|
|
|
+
|
|
|
+ // 如果还没到当前周期 → 取上一周
|
|
|
+ if (now.isBefore(startTime)) {
|
|
|
+ startTime = startTime.minusWeeks(1);
|
|
|
+ endTime = endTime.minusWeeks(1);
|
|
|
}
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ throw new IllegalArgumentException("不支持的时间类型: " + typeEnum);
|
|
|
}
|
|
|
|
|
|
times[0] = startTime;
|