소스 검색

修改设备启停数据与尖峰平谷数据分开显示以及统计图显示两天内的数据

lingpeng.li 5 달 전
부모
커밋
b4854633e1

+ 44 - 13
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/deviceLesm/service/impl/DeviceInformationServiceImpl.java

@@ -19,6 +19,7 @@ import org.springframework.data.mongodb.core.query.Query;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.stream.Collectors;
@@ -26,7 +27,7 @@ import java.util.stream.Collectors;
 /**
  * @Description: 设备管理信息表
  * @Author: jeecg-boot
- * @Date:   2024-09-19
+ * @Date: 2024-09-19
  * @Version: V1.0
  */
 @Service
@@ -40,13 +41,13 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
     public DeviceModelInfo queryDeviceModelById(String deviceRegionId, String deviceType, String dates) {
         DeviceModelInfo result = new DeviceModelInfo();
         LambdaQueryWrapper<DeviceInformation> wrapper = new LambdaQueryWrapper<>();
-        if ("0".equals(deviceType)){
+        if ("0".equals(deviceType)) {
             wrapper.eq(DeviceInformation::getDeviceRegionId, deviceRegionId);
-        }else {
+        } else {
             wrapper.eq(DeviceInformation::getDeviceRegionId, deviceRegionId).eq(DeviceInformation::getDeviceType, deviceType);
         }
         List<DeviceInformation> deviceInformationList = baseMapper.selectList(wrapper);
-        if (oConvertUtils.listIsEmpty(deviceInformationList)){
+        if (oConvertUtils.listIsEmpty(deviceInformationList)) {
             log.info("{}{}", "通过设备区域ID——未查询到设备信息:", deviceRegionId);
             return result;
         }
@@ -57,7 +58,7 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
         querylr.addCriteria(Criteria.where("deviceInformationId").in(deviceInformationIds));
         // 执行查询
         List<DeviceStatiscsModelMongodb> deviceStatiscsModelMongodbList = mongoTemplate.find(querylr, DeviceStatiscsModelMongodb.class, "leanmodel_run_realtime");
-        if (oConvertUtils.listIsEmpty(deviceStatiscsModelMongodbList)){
+        if (oConvertUtils.listIsEmpty(deviceStatiscsModelMongodbList)) {
             log.info("{}{}", "未查询到leanmodel_run_realtime峰平谷大屏实时功率和电流为空:", deviceInformationIds);
         }
         List<DeviceStatiscsModelMongodb> deviceStatiscsModelMongodbs = processDeviceStats(deviceStatiscsModelMongodbList);
@@ -70,7 +71,7 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
         query.with(Sort.by(Sort.Order.desc("deviceStartTime")));
         // 获取上次运行时间、运行累计时间、运行累计功率
         List<StatiscsModelDataResult> statiscsModelDataResultList1 = mongoTemplate.find(query, StatiscsModelDataResult.class, "total_startstop");
-        if (oConvertUtils.listIsEmpty(statiscsModelDataResultList1)){
+        if (oConvertUtils.listIsEmpty(statiscsModelDataResultList1)) {
             log.info("{}{}", "未查询到mongoDB信息total_startstop:", "区域ID:" + deviceRegionId + "设备ID集合:" + deviceInformationIds);
             return result;
         }
@@ -80,10 +81,10 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         // 将当前日期格式化为字符串
         String formattedDate = currentDate.format(formatter);
-        String  queryDateParam = "";
-        if (oConvertUtils.isEmpty(dates)){
+        String queryDateParam = "";
+        if (oConvertUtils.isEmpty(dates)) {
             queryDateParam = formattedDate;
-        }else {
+        } else {
             queryDateParam = dates;
         }
         Query querys = new Query();
@@ -91,9 +92,9 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
                 .addCriteria(Criteria.where("deviceInformationId").in(deviceInformationIds))// 虚拟设备
                 .addCriteria(Criteria.where("dates").is(queryDateParam));
         List<StatiscsModelDataResult> statiscsModelDataResultList2 = mongoTemplate.find(querys, StatiscsModelDataResult.class, "total_day_powerproportioncurrent");
-        if (oConvertUtils.listIsEmpty(statiscsModelDataResultList2)){
+        if (oConvertUtils.listIsEmpty(statiscsModelDataResultList2)) {
             log.info("{}{}", "未查询到mongoDB信息total_day_powerproportioncurrent:", "区域ID:" + deviceRegionId + "设备ID集合:" + deviceInformationIds);
-            return result;
+//            return result;
         }
         // 使用 Map 存储列表2的数据,提高查找效率
         Map<String, StatiscsModelDataResult> map2 = new HashMap<>();
@@ -132,10 +133,40 @@ public class DeviceInformationServiceImpl extends ServiceImpl<DeviceInformationM
                 mergedItem.setPower(item1.getPower());// 运行累加功率
                 mergedItem.setDeviceStartTime(item1.getDeviceStartTime());// 上次运行时刻
                 statiscsModelDataResultListMerge.add(mergedItem);
+            } else {
+                // 如果 map2 不包含当前 key,直接使用 item1 的基础数据构建 mergedItem
+                StatiscsModelDataResult mergedItem = new StatiscsModelDataResult();
+                mergedItem.setDeviceRegionId(item1.getDeviceRegionId());
+                mergedItem.setDeviceInformationId(item1.getDeviceInformationId());
+                // 使用 item1 的值填充
+                mergedItem.setIngTime(item1.getIngTime()); // 运行累计时间
+                mergedItem.setPower(item1.getPower());    // 运行累加功率
+                mergedItem.setDeviceStartTime(item1.getDeviceStartTime()); // 上次运行时刻
+                statiscsModelDataResultListMerge.add(mergedItem);
             }
         }
-        result.setStatiscsModelDataResultList(statiscsModelDataResultListMerge);
-        log.info("{}{}", "模型信息总数:", statiscsModelDataResultListMerge.size());
+
+        DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        // 使用 Stream 进行处理,只保留每个 deviceInformationId 最新的一条记录
+        List<StatiscsModelDataResult> latestRecords = statiscsModelDataResultListMerge.stream()
+                .collect(Collectors.toMap(
+                        item -> item.getDeviceRegionId() + item.getDeviceInformationId(), // 使用 deviceRegionId + deviceInformationId 作为 key
+                        item -> item, // 作为 value
+                        (existing, replacement) -> {
+                            // 使用自定义格式化器解析 deviceStartTime 字符串
+                            LocalDateTime existingStartTime = LocalDateTime.parse(existing.getDeviceStartTime(), formatter1);
+                            LocalDateTime newStartTime = LocalDateTime.parse(replacement.getDeviceStartTime(), formatter1);
+
+                            // 返回 deviceStartTime 更晚的记录
+                            return newStartTime.isAfter(existingStartTime) ? replacement : existing;
+                        }
+                ))
+                .values() // 获取 Map 的所有值,即每个 deviceInformationId 最新的记录
+                .stream()
+                .collect(Collectors.toList()); // 转换成 List
+        result.setStatiscsModelDataResultList(latestRecords);
+        System.out.println("当前数据为======" + latestRecords);
+        log.info("{}{}", "模型信息总数:", latestRecords.size());
         return result;
     }
 

+ 64 - 28
zgztBus/jeecg-module-lesm/src/main/java/org/jeecg/modules/fpgLeanModel/service/impl/FpgLeanModelServiceImpl.java

@@ -29,6 +29,9 @@ import org.springframework.stereotype.Service;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
 import java.util.*;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
@@ -36,7 +39,7 @@ import java.util.stream.IntStream;
 /**
  * @Description: 峰平谷模型
  * @Author: jeecg-boot
- * @Date:   2024-10-31
+ * @Date: 2024-10-31
  * @Version: V1.0
  */
 @Slf4j
@@ -57,15 +60,15 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
         FpgLeanModelResult fpgLeanModelResult = new FpgLeanModelResult();
         fpgLeanModelResult.setFpgLeanModelId(id);
         FpgLeanModel fpgLeanModel = baseMapper.selectById(id);
-        if (fpgLeanModel == null){
+        if (fpgLeanModel == null) {
             return fpgLeanModelResult;
         }
-        if (oConvertUtils.isEmpty(fpgLeanModel.getDeviceInformationIds())){
+        if (oConvertUtils.isEmpty(fpgLeanModel.getDeviceInformationIds())) {
             return fpgLeanModelResult;
         }
         List<String> deviceInformationIds = Arrays.asList(fpgLeanModel.getDeviceInformationIds().split(","));
         List<DeviceInformation> deviceInformations = deviceInformationMapper.selectBatchIds(deviceInformationIds);
-        if (!oConvertUtils.isNotEmpty(deviceInformations)){
+        if (!oConvertUtils.isNotEmpty(deviceInformations)) {
             return fpgLeanModelResult;
         }
         fpgLeanModelResult.setDeviceInformationList(deviceInformations);
@@ -86,18 +89,18 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 
         // 执行查询
         List<DeviceStatiscsModelMongodb> fpgStatiscsModelDataList = mongoTemplate.find(query, DeviceStatiscsModelMongodb.class, "total_startstop");
-        if (oConvertUtils.listIsEmpty(fpgStatiscsModelDataList)){
+        if (oConvertUtils.listIsEmpty(fpgStatiscsModelDataList)) {
             log.info("{}{}", "total_startstop峰平谷大屏查询设备模型历史记录-为空", query);
             return leanModelDeviceHistoryInfoIPage;
         }
 
         List<LeanModelDeviceHistoryInfo> leanModelDeviceHistoryInfoList = new ArrayList<>();
-        fpgStatiscsModelDataList.forEach(x ->{
+        fpgStatiscsModelDataList.forEach(x -> {
             LeanModelDeviceHistoryInfo leanModelDeviceHistoryInfo = new LeanModelDeviceHistoryInfo();
             BeanUtils.copyProperties(x, leanModelDeviceHistoryInfo);
             leanModelDeviceHistoryInfoList.add(leanModelDeviceHistoryInfo);
         });
-        leanModelDeviceHistoryInfoList.forEach(y ->{
+        leanModelDeviceHistoryInfoList.forEach(y -> {
             LambdaQueryWrapper<LeanEventWarnInfo> queryWrapper = new LambdaQueryWrapper<>();
             queryWrapper.eq(LeanEventWarnInfo::getDeviceInformationId, y.getDeviceInformationId());
             queryWrapper.between(LeanEventWarnInfo::getCreateTime, DateUtils.str2Date(y.getDeviceStartTime(), DateUtils.datetimeFormat.get()), DateUtils.str2Date(y.getDeviceStopTime(), DateUtils.datetimeFormat.get()));
@@ -132,16 +135,45 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 //        calendar2.setTime(endTime);
 //        Date specifiedTimePlus8HoursStartEndTime = calendar2.getTime();
 //        query.addCriteria(Criteria.where("createTime").gte(specifiedTimePlus8HoursStartEndTime).lt(specifiedTimePlus8HoursStartTime));
+
+        // 获取当前时间和两天前的时间
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime twoDaysAgo = now.minusDays(2);
+
+        // 定义日期格式器,用于解析 datestr 字符串
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+
         // 执行查询
         List<DeviceStatiscsModelMongodb> deviceStatiscsModelMongodbList = mongoTemplate.find(query, DeviceStatiscsModelMongodb.class, "leanmodel_run_realtime");
         if (oConvertUtils.listIsEmpty(deviceStatiscsModelMongodbList)){
             log.info("{}{}", "leanmodel_run_realtime折线图峰平谷大屏通过设备id查询实时功率和电流为空", deviceInformationId);
             return new ArrayList<>();
         }
-        return deviceStatiscsModelMongodbList;
+
+        // 使用 Stream 过滤出当前时间到两天前的数据
+        List<DeviceStatiscsModelMongodb> filteredList = deviceStatiscsModelMongodbList.stream()
+                .filter(item -> {
+                    // 获取 datestr 并转换为 LocalDateTime
+                    String dateStr = item.getDatestr(); // 假设 datestr 字段是 String 类型
+                    try {
+                        // 将 datestr 转换为 LocalDateTime
+                        LocalDateTime createTime = LocalDateTime.parse(dateStr, formatter);
+
+                        // 比较是否在当前时间和两天前时间之间
+                        return !createTime.isBefore(twoDaysAgo) && !createTime.isAfter(now);
+                    } catch (DateTimeParseException e) {
+                        log.error("日期格式解析错误: {}", dateStr, e);
+                        return false; // 如果解析失败,排除该记录
+                    }
+                })
+                .collect(Collectors.toList());
+
+        return filteredList;
     }
+
     /**
      * 龙钢峰平谷积木报表导出逻辑处理
+     *
      * @param leanModelCode
      * @return JSONObject
      */
@@ -150,7 +182,7 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 
         JSONObject result = new JSONObject();
         List<DeviceStatiscsModelMongodb> fpgStatiscsModelDataList = queryByTimeRanges(mongoTemplate, leanModelCode, null, null, null, null, null);
-        if (oConvertUtils.listIsEmpty(fpgStatiscsModelDataList)){
+        if (oConvertUtils.listIsEmpty(fpgStatiscsModelDataList)) {
             log.info("{}{}", "mongo数据查询为空,峰平谷报表导出失败!", leanModelCode);
             result.put("data", new JSONArray());
             return result;
@@ -180,20 +212,20 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
                     return null;
                 }).filter(x -> x != null).collect(Collectors.toList());
         JSONArray jsonResult = new JSONArray();
-        if ("total_day_eu_report".equals(leanModelCode)){
+        if ("total_day_eu_report".equals(leanModelCode)) {
             // 总用电量报表
             List<ModelDataResult> modelDataResults = generateModelDataResults(combinedList);
             jsonResult = JSON.parseArray(JSON.toJSONString(modelDataResults));
         } else if ("total_day_ec_report".equals(leanModelCode)) {
             // 峰平谷用电控制日报报表
             jsonResult = JSON.parseArray(JSON.toJSONString(combinedList));
-        }else if ("total_day_dn_report".equals(leanModelCode)) {
+        } else if ("total_day_dn_report".equals(leanModelCode)) {
             // 线路峰平谷日报
             jsonResult = JSON.parseArray(JSON.toJSONString(combinedList));
-        }else if ("total_day_ds_report".equals(leanModelCode)) {
+        } else if ("total_day_ds_report".equals(leanModelCode)) {
             // 谷峰差统计报表
             jsonResult = JSON.parseArray(JSON.toJSONString(combinedList));
-        }else if ("total_day_wp_report".equals(leanModelCode)) {
+        } else if ("total_day_wp_report".equals(leanModelCode)) {
 
             // 龙钢变各工序报表
             List<ModelDataResult> modelDataResults = new ArrayList<>();
@@ -208,47 +240,47 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
                 String createTime = modelReportFormResult.getCreateTime();
                 for (int i = 0; i < 9; i++) {
                     ModelDataResult modelDataResult = new ModelDataResult();
-                    if (i == 0){
+                    if (i == 0) {
                         modelDataResult.setKey("尖");
                         modelDataResult.setKey1("尖");
                         modelDataResult.setValue(modelReportFormResult.getTopsPower());
                     }
-                    if (i == 1){
+                    if (i == 1) {
                         modelDataResult.setKey("尖");
                         modelDataResult.setKey1("尖(%)");
                         modelDataResult.setValue(modelReportFormResult.getTopsPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
                     }
-                    if (i == 2){
+                    if (i == 2) {
                         modelDataResult.setKey("峰");
                         modelDataResult.setKey1("峰");
                         modelDataResult.setValue(modelReportFormResult.getPeaksPower());
                     }
-                    if (i == 3){
+                    if (i == 3) {
                         modelDataResult.setKey("峰");
                         modelDataResult.setKey1("峰(%)");
                         modelDataResult.setValue(modelReportFormResult.getPeaksPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
                     }
-                    if (i == 4){
+                    if (i == 4) {
                         modelDataResult.setKey("平");
                         modelDataResult.setKey1("平");
                         modelDataResult.setValue(modelReportFormResult.getFlatPower());
                     }
-                    if (i == 5){
+                    if (i == 5) {
                         modelDataResult.setKey("平");
                         modelDataResult.setKey1("平(%)");
                         modelDataResult.setValue(modelReportFormResult.getFlatPower().divide(sum, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100")).setScale(2, RoundingMode.HALF_UP));
                     }
-                    if (i == 6){
+                    if (i == 6) {
                         modelDataResult.setKey("谷");
                         modelDataResult.setKey1("谷");
                         modelDataResult.setValue(modelReportFormResult.getValleysPower());
                     }
-                    if (i == 7){
+                    if (i == 7) {
                         modelDataResult.setKey("谷");
                         modelDataResult.setKey1("谷(%)");
                         modelDataResult.setValue(modelReportFormResult.getValleysPower().add(modelReportFormResult.getPeaksPower()).add(modelReportFormResult.getFlatPower()).add(modelReportFormResult.getValleysPower()));
                     }
-                    if (i == 8){
+                    if (i == 8) {
                         modelDataResult.setKey("反有总");
                         modelDataResult.setKey1("反有总");
                         modelDataResult.setValue(modelReportFormResult.getTopsPower().add(modelReportFormResult.getPeaksPower()).add(modelReportFormResult.getFlatPower()).add(modelReportFormResult.getValleysPower()));
@@ -269,28 +301,29 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 
     /**
      * 基于模型编码、采集点ID、设备ID、区域ID、峰平谷配置时间范围 动态查询mongoDB
+     *
      * @param mongoTemplate
      * @param devicePointId
      * @param deviceInformationId
      * @param deviceRegionId
      * @return
      */
-    public List<DeviceStatiscsModelMongodb> queryByTimeRanges(MongoTemplate mongoTemplate, String leanModeCode, String startTimeParam,  String endTimeParam, String devicePointId, String deviceInformationId, String deviceRegionId) {
+    public List<DeviceStatiscsModelMongodb> queryByTimeRanges(MongoTemplate mongoTemplate, String leanModeCode, String startTimeParam, String endTimeParam, String devicePointId, String deviceInformationId, String deviceRegionId) {
         Query query = new Query();
         query.with(Sort.by(Sort.Direction.ASC, "createTime"));
-        if (oConvertUtils.isNotEmpty(devicePointId)){
+        if (oConvertUtils.isNotEmpty(devicePointId)) {
             // 设备采集点
             query.addCriteria(Criteria.where("devicePointId").is(devicePointId));
         }
-        if (oConvertUtils.isNotEmpty(devicePointId)){
+        if (oConvertUtils.isNotEmpty(devicePointId)) {
             // 虚拟设备
             query.addCriteria(Criteria.where("deviceInformationId").is(deviceInformationId));
         }
-        if (oConvertUtils.isNotEmpty(devicePointId)){
+        if (oConvertUtils.isNotEmpty(devicePointId)) {
             // 虚拟设备区域
             query.addCriteria(Criteria.where("deviceRegionId").is(deviceRegionId));
         }
-        if (oConvertUtils.isNotEmpty(startTimeParam) && oConvertUtils.isNotEmpty(endTimeParam)){
+        if (oConvertUtils.isNotEmpty(startTimeParam) && oConvertUtils.isNotEmpty(endTimeParam)) {
             // 使用Criteria添加多个时间范围条件
             // DateUtils.date2Str(startTime, new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")) 毫秒
             Date startTime = DateUtils.str2Date(startTimeParam, DateUtils.datetimeFormat.get());
@@ -312,6 +345,7 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 
     /**
      * 转为流处理模型数据、5次循环操作
+     *
      * @param combinedList
      * @return
      */
@@ -327,7 +361,8 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
     }
 
     /**
-     *  不同类型的key/value进行赋值操作
+     * 不同类型的key/value进行赋值操作
+     *
      * @param modelDataResult
      * @param i
      * @param modelReportFormResult
@@ -362,6 +397,7 @@ public class FpgLeanModelServiceImpl extends ServiceImpl<FpgLeanModelMapper, Fpg
 
     /**
      * 公共属性赋值
+     *
      * @param modelDataResult
      * @param modelReportFormResult
      */