|
|
@@ -326,6 +326,61 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
+ * 按月查询数据--停机类型)
|
|
|
+ *
|
|
|
+ * @param twinCalcStop 查询条件
|
|
|
+ * @return 停机详情列表
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public List<StopDetail> selectTwinCalcStopMonthList(TwinCalcStop twinCalcStop) {
|
|
|
+ // 获取当月第一天和最后一天
|
|
|
+ Calendar cal = Calendar.getInstance();
|
|
|
+ if (twinCalcStop.getDataDate() != null) {
|
|
|
+ cal.setTime(twinCalcStop.getDataDate());
|
|
|
+ }
|
|
|
+ cal.set(Calendar.DAY_OF_MONTH, 1);
|
|
|
+ Date firstDay = cal.getTime();
|
|
|
+
|
|
|
+ cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
|
|
+ Date lastDay = cal.getTime();
|
|
|
+
|
|
|
+ // 结束日期为当前时间减去31小时
|
|
|
+ Calendar endCal = Calendar.getInstance();
|
|
|
+ endCal.add(Calendar.HOUR_OF_DAY, -31);
|
|
|
+ Date endDate = endCal.getTime();
|
|
|
+
|
|
|
+ // 取 endDate 和 lastDay 中较早的日期作为实际结束日期
|
|
|
+ Date actualEndDate = endDate.before(lastDay) ? endDate : lastDay;
|
|
|
+
|
|
|
+ // 设置查询条件
|
|
|
+ twinCalcStop.setWorkDay(firstDay);
|
|
|
+ Map<String, Object> params = twinCalcStop.getParams();
|
|
|
+ if (params == null) {
|
|
|
+ params = new HashMap<>();
|
|
|
+ twinCalcStop.setParams(params);
|
|
|
+ }
|
|
|
+ params.put("endDate", actualEndDate);
|
|
|
+ List<StopDetail> monthList = twinCalcStopMapper.selectTwinCalcStopDetailListByMonth(twinCalcStop);
|
|
|
+ List<StopDetail> dailySummaryList = monthList.stream()
|
|
|
+ .collect(Collectors.groupingBy(
|
|
|
+ detail -> detail.getDate(),
|
|
|
+ Collectors.summingInt(StopDetail::getTimes)
|
|
|
+ ))
|
|
|
+ .entrySet()
|
|
|
+ .stream()
|
|
|
+ .map(entry -> {
|
|
|
+ StopDetail summary = new StopDetail();
|
|
|
+ summary.setDate(entry.getKey());
|
|
|
+ summary.setTimes(entry.getValue());
|
|
|
+ return summary;
|
|
|
+ })
|
|
|
+ .sorted(Comparator.comparing(StopDetail::getDate))
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ return dailySummaryList;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 查询月度停机详情列表(按日统计)
|
|
|
*
|
|
|
* @param twinCalcStop 查询条件
|
|
|
@@ -339,18 +394,18 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
}
|
|
|
cal.set(Calendar.DAY_OF_MONTH, 1);
|
|
|
Date firstDay = cal.getTime();
|
|
|
-
|
|
|
+
|
|
|
cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
|
|
|
Date lastDay = cal.getTime();
|
|
|
-
|
|
|
+
|
|
|
// 结束日期为当前时间减去31小时
|
|
|
Calendar endCal = Calendar.getInstance();
|
|
|
endCal.add(Calendar.HOUR_OF_DAY, -31);
|
|
|
Date endDate = endCal.getTime();
|
|
|
-
|
|
|
+
|
|
|
// 取 endDate 和 lastDay 中较早的日期作为实际结束日期
|
|
|
Date actualEndDate = endDate.before(lastDay) ? endDate : lastDay;
|
|
|
-
|
|
|
+
|
|
|
// 设置查询条件
|
|
|
twinCalcStop.setWorkDay(firstDay);
|
|
|
Map<String, Object> params = twinCalcStop.getParams();
|
|
|
@@ -359,10 +414,10 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
twinCalcStop.setParams(params);
|
|
|
}
|
|
|
params.put("endDate", actualEndDate);
|
|
|
-
|
|
|
+
|
|
|
// 查询数据库中的实际数据
|
|
|
List<StopDetail> actualList = twinCalcStopMapper.selectTwinCalcStopDetailListByMonth(twinCalcStop);
|
|
|
-
|
|
|
+
|
|
|
// 获取所有涉及的设备
|
|
|
Set<Long> deviceIds = actualList.stream().map(StopDetail::getDeviceId).collect(Collectors.toSet());
|
|
|
Map<Long, String> deviceNames = new HashMap<>();
|
|
|
@@ -372,22 +427,22 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
deviceNames.put(detail.getDeviceId(), detail.getDeviceName());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 如果没有任何设备数据,直接返回空列表
|
|
|
if (deviceIds.isEmpty()) {
|
|
|
return new ArrayList<>();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 构建完整的日期列表(从当月第一天到实际结束日期)
|
|
|
List<Date> dateList = new ArrayList<>();
|
|
|
Calendar dateCal = Calendar.getInstance();
|
|
|
dateCal.setTime(firstDay);
|
|
|
-
|
|
|
+
|
|
|
while (!dateCal.getTime().after(actualEndDate)) {
|
|
|
dateList.add(dateCal.getTime());
|
|
|
dateCal.add(Calendar.DAY_OF_MONTH, 1);
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 构建完整的结果列表,没有数据的日期补0
|
|
|
List<StopDetail> resultList = new ArrayList<>();
|
|
|
for (Long deviceId : deviceIds) {
|
|
|
@@ -395,12 +450,12 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
Map<Date, StopDetail> dateMap = actualList.stream()
|
|
|
.filter(d -> d.getDeviceId().equals(deviceId))
|
|
|
.collect(Collectors.toMap(StopDetail::getDate, d -> d));
|
|
|
-
|
|
|
+
|
|
|
// 如果该设备在整个月内没有任何数据记录,则不加入结果列表
|
|
|
if (dateMap.isEmpty()) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
for (Date date : dateList) {
|
|
|
StopDetail detail;
|
|
|
if (dateMap.containsKey(date)) {
|
|
|
@@ -415,7 +470,7 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
resultList.add(detail);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return resultList;
|
|
|
}
|
|
|
|
|
|
@@ -434,12 +489,12 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
cal.add(Calendar.DAY_OF_MONTH, -90);
|
|
|
queryDate = cal.getTime();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
twinCalcStop.setWorkDay(queryDate);
|
|
|
-
|
|
|
+
|
|
|
// 查询数据库中的实际数据
|
|
|
List<StopDetail> actualList = twinCalcStopMapper.selectTwinCalcStopDetailList(twinCalcStop);
|
|
|
-
|
|
|
+
|
|
|
// 获取所有涉及的设备
|
|
|
Set<Long> deviceIds = actualList.stream().map(StopDetail::getDeviceId).collect(Collectors.toSet());
|
|
|
Map<Long, String> deviceNames = new HashMap<>();
|
|
|
@@ -448,12 +503,12 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
deviceNames.put(detail.getDeviceId(), detail.getDeviceName());
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 如果没有任何设备数据,直接返回空列表
|
|
|
if (deviceIds.isEmpty()) {
|
|
|
return new ArrayList<>();
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 构建完整的结果列表,没有数据的小时补0(从7点到第二天7点,共24小时)
|
|
|
List<StopDetail> resultList = new ArrayList<>();
|
|
|
for (Long deviceId : deviceIds) {
|
|
|
@@ -469,12 +524,12 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
String key = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, d.getDate()) + "-" + d.getHour();
|
|
|
hourMap.put(key, d);
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
// 如果该设备在24小时内没有任何数据记录,则不加入结果列表
|
|
|
if (hourMap.isEmpty()) {
|
|
|
continue;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
// 构建从7点到第二天7点的24小时数据
|
|
|
Calendar cal = Calendar.getInstance();
|
|
|
cal.setTime(queryDate);
|
|
|
@@ -482,11 +537,11 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
cal.set(Calendar.MINUTE, 0);
|
|
|
cal.set(Calendar.SECOND, 0);
|
|
|
cal.set(Calendar.MILLISECOND, 0);
|
|
|
-
|
|
|
+
|
|
|
for (int i = 0; i < 24; i++) {
|
|
|
// 构造key查找是否有数据
|
|
|
String key = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, cal.getTime()) + "-" + cal.get(Calendar.HOUR_OF_DAY);
|
|
|
-
|
|
|
+
|
|
|
StopDetail detail;
|
|
|
if (hourMap.containsKey(key)) {
|
|
|
detail = hourMap.get(key);
|
|
|
@@ -499,11 +554,11 @@ public class TwinCalcStopServiceImpl implements ITwinCalcStopService {
|
|
|
detail.setTimes(0);
|
|
|
}
|
|
|
resultList.add(detail);
|
|
|
-
|
|
|
+
|
|
|
cal.add(Calendar.HOUR_OF_DAY, 1); // 增加1小时
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return resultList;
|
|
|
}
|
|
|
}
|