Commit 0ec7aee63f4b0bb1425df14936e5679af84b6cee

Authored by 房远帅
1 parent d1c0b8d8

凯盛:电表数据上报能源管理修改

@@ -10,12 +10,10 @@ import org.springframework.stereotype.Service; @@ -10,12 +10,10 @@ import org.springframework.stereotype.Service;
10 import org.springframework.util.CollectionUtils; 10 import org.springframework.util.CollectionUtils;
11 11
12 import java.sql.*; 12 import java.sql.*;
  13 +import java.sql.Date;
13 import java.time.LocalDateTime; 14 import java.time.LocalDateTime;
14 import java.time.format.DateTimeFormatter; 15 import java.time.format.DateTimeFormatter;
15 -import java.util.ArrayList;  
16 -import java.util.HashMap;  
17 -import java.util.List;  
18 -import java.util.Map; 16 +import java.util.*;
19 17
20 /** 18 /**
21 * 凯盛设备 19 * 凯盛设备
@@ -60,27 +58,72 @@ public class KSDeviceReportService { @@ -60,27 +58,72 @@ public class KSDeviceReportService {
60 return; 58 return;
61 } 59 }
62 60
  61 + // ========== 【修改点 1】:定义合并规则并预处理数据 ==========
  62 + // 定义需要合并的 SN 标识 (主SN, 被合并SN)
  63 + final int EP_INDEX = 1; // Ep 在 dataList 中的索引位置(从1开始,0是sn)
  64 + List<String[]> mergeRules = new ArrayList<>();
  65 + mergeRules.add(new String[]{"1ACP4-AHU6、7、8、MAU-01", "1ACP4-AHU6、7、8、MAU-02"});
  66 + mergeRules.add(new String[]{"1ACP2-AHU-03、04、MAU-02", "1ACP2-AHU-03、04、MAU-01"});
  67 +
  68 + // 将原始数据转换为 Map,方便通过 SN 快速查找和修改
  69 + Map<String, List<Object>> dataMap = new HashMap<>();
  70 + for (Object needSyncData : needSyncDataList) {
  71 + List<Object> dataList = (ArrayList) needSyncData;
  72 + String sn = dataList.get(0).toString();
  73 + dataMap.put(sn, dataList);
  74 + }
  75 +
  76 + // 遍历合并规则,执行 Ep 值的相加与更新
  77 + for (String[] rule : mergeRules) {
  78 + String mainSn = rule[0];
  79 + String subSn = rule[1];
  80 + List<Object> mainData = dataMap.get(mainSn);
  81 + List<Object> subData = dataMap.get(subSn);
  82 +
  83 + if (mainData != null && subData != null) {
  84 + Object valMain = mainData.get(EP_INDEX);
  85 + Object valSub = subData.get(EP_INDEX);
  86 + double epMain = (valMain != null) ? Double.parseDouble(valMain.toString().trim()) : 0.0;
  87 + double epSub = (valSub != null) ? Double.parseDouble(valSub.toString().trim()) : 0.0;
  88 +
  89 + double totalEp = epMain + epSub;
  90 + mainData.set(EP_INDEX, totalEp);
  91 + log.info("已将设备{}和设备{}的Ep值合并,{}的新Ep值为: {}", mainSn, subSn, mainSn, totalEp);
  92 + } else {
  93 + log.warn("合并规则[{}+{}]执行跳过,未能在数据中找到对应的设备数据", mainSn, subSn);
  94 + }
  95 + }
  96 + // ========== 【修改点 1 结束】==========
  97 +
63 log.info("开始处理{}条电表设备数据并进行上报", needSyncDataList.size()); 98 log.info("开始处理{}条电表设备数据并进行上报", needSyncDataList.size());
64 int successCount = 0; 99 int successCount = 0;
65 int failCount = 0; 100 int failCount = 0;
66 List<String> failedDevices = new ArrayList<>(); 101 List<String> failedDevices = new ArrayList<>();
67 - Map<Object, String> map = new HashMap<>();  
68 - map.put(1,"Ep");  
69 - map.put(2,"Ubc");  
70 - map.put(3,"Uc");  
71 - map.put(4,"P");  
72 - map.put(5,"Uab");  
73 - map.put(6,"Ib");  
74 - map.put(7,"Eq");  
75 - map.put(8,"F");  
76 - map.put(9,"Q");  
77 - map.put(10,"Ua");  
78 - map.put(11,"S");  
79 - map.put(12,"Ic");  
80 - map.put(13,"Ub");  
81 - map.put(14,"Uca");  
82 - map.put(15,"PSum");  
83 - map.put(16,"Ia"); 102 +
  103 + // 提取所有需要被跳过的子设备 SN,方便后续判断
  104 + Set<String> skipSnSet = new HashSet<>();
  105 + for (String[] rule : mergeRules) {
  106 + skipSnSet.add(rule[1]);
  107 + }
  108 +
  109 + // 属性映射表
  110 + Map<Integer, String> map = new HashMap<>();
  111 + map.put(1, "Ep");
  112 + map.put(2, "Ubc");
  113 + map.put(3, "Uc");
  114 + map.put(4, "P");
  115 + map.put(5, "Uab");
  116 + map.put(6, "Ib");
  117 + map.put(7, "Eq");
  118 + map.put(8, "F");
  119 + map.put(9, "Q");
  120 + map.put(10, "Ua");
  121 + map.put(11, "S");
  122 + map.put(12, "Ic");
  123 + map.put(13, "Ub");
  124 + map.put(14, "Uca");
  125 + map.put(15, "PSum");
  126 + map.put(16, "Ia");
84 127
85 for (int i = 0; i < needSyncDataList.size(); i++) { 128 for (int i = 0; i < needSyncDataList.size(); i++) {
86 Object needSyncData = needSyncDataList.get(i); 129 Object needSyncData = needSyncDataList.get(i);
@@ -88,6 +131,11 @@ public class KSDeviceReportService { @@ -88,6 +131,11 @@ public class KSDeviceReportService {
88 List<Object> dataList = (ArrayList) needSyncData; 131 List<Object> dataList = (ArrayList) needSyncData;
89 String sn = dataList.get(0).toString(); 132 String sn = dataList.get(0).toString();
90 133
  134 + // ========== 【修改点 2】:如果是被合并的子设备,直接跳过本次上报 ==========
  135 + if (skipSnSet.contains(sn)) {
  136 + log.info("设备{}的Ep已合并至主设备,跳过该设备的数据上报。sn={}", sn, sn);
  137 + continue;
  138 + }
91 // 1. 获取当前时间 139 // 1. 获取当前时间
92 LocalDateTime now = LocalDateTime.now(); 140 LocalDateTime now = LocalDateTime.now();
93 // 2. 定义间隔分钟数 (例如 5 分钟) 141 // 2. 定义间隔分钟数 (例如 5 分钟)
@@ -33,60 +33,44 @@ ks: @@ -33,60 +33,44 @@ ks:
33 jdbcUserName: "postgres" 33 jdbcUserName: "postgres"
34 jdbcPassword: "1qaz@WSX" 34 jdbcPassword: "1qaz@WSX"
35 selectSql: "SELECT 35 selectSql: "SELECT
36 - de.sn AS sn,  
37 - tkl1.dbl_v AS Ep,  
38 - tkl2.dbl_v AS Ubc,  
39 - tkl3.dbl_v AS Uc,  
40 - tkl4.dbl_v AS P,  
41 - tkl5.dbl_v AS Uab,  
42 - tkl6.dbl_v AS Ib,  
43 - tkl7.dbl_v AS Eq,  
44 - tkl8.dbl_v AS F,  
45 - tkl9.dbl_v AS Q,  
46 - tkl10.dbl_v AS Ua,  
47 - tkl11.dbl_v AS S,  
48 - tkl12.dbl_v AS Ic,  
49 - tkl13.dbl_v AS Ub,  
50 - tkl14.dbl_v AS Uca,  
51 - tkl15.dbl_v AS PSum,  
52 - tkl16.dbl_v AS Ia 36 + de.sn AS sn,
  37 + COALESCE(tkl1.dbl_v, CAST(tkl1.long_v AS DOUBLE PRECISION)) AS Ep,
  38 + COALESCE(tkl2.dbl_v, CAST(tkl2.long_v AS DOUBLE PRECISION)) AS Ubc,
  39 + COALESCE(tkl3.dbl_v, CAST(tkl3.long_v AS DOUBLE PRECISION)) AS Uc,
  40 + COALESCE(tkl4.dbl_v, CAST(tkl4.long_v AS DOUBLE PRECISION)) AS P,
  41 + COALESCE(tkl5.dbl_v, CAST(tkl5.long_v AS DOUBLE PRECISION)) AS Uab,
  42 + COALESCE(tkl6.dbl_v, CAST(tkl6.long_v AS DOUBLE PRECISION)) AS Ib,
  43 + COALESCE(tkl7.dbl_v, CAST(tkl7.long_v AS DOUBLE PRECISION)) AS Eq,
  44 + COALESCE(tkl8.dbl_v, CAST(tkl8.long_v AS DOUBLE PRECISION)) AS F,
  45 + COALESCE(tkl9.dbl_v, CAST(tkl9.long_v AS DOUBLE PRECISION)) AS Q,
  46 + COALESCE(tkl10.dbl_v, CAST(tkl10.long_v AS DOUBLE PRECISION)) AS Ua,
  47 + COALESCE(tkl11.dbl_v, CAST(tkl11.long_v AS DOUBLE PRECISION)) AS S,
  48 + COALESCE(tkl12.dbl_v, CAST(tkl12.long_v AS DOUBLE PRECISION)) AS Ic,
  49 + COALESCE(tkl13.dbl_v, CAST(tkl13.long_v AS DOUBLE PRECISION)) AS Ub,
  50 + COALESCE(tkl14.dbl_v, CAST(tkl14.long_v AS DOUBLE PRECISION)) AS Uca,
  51 + COALESCE(tkl15.dbl_v, CAST(tkl15.long_v AS DOUBLE PRECISION)) AS PSum,
  52 + COALESCE(tkl16.dbl_v, CAST(tkl16.long_v AS DOUBLE PRECISION)) AS Ia
53 FROM 53 FROM
54 - device de  
55 - LEFT JOIN ts_kv_latest tkl1 ON de.id = tkl1.entity_id  
56 - AND tkl1.key = 64  
57 - LEFT JOIN ts_kv_latest tkl2 ON de.id = tkl2.entity_id  
58 - AND tkl2.key = 65  
59 - LEFT JOIN ts_kv_latest tkl3 ON de.id = tkl3.entity_id  
60 - AND tkl3.key = 66  
61 - LEFT JOIN ts_kv_latest tkl4 ON de.id = tkl4.entity_id  
62 - AND tkl4.key = 67  
63 - LEFT JOIN ts_kv_latest tkl5 ON de.id = tkl5.entity_id  
64 - AND tkl5.key = 68  
65 - LEFT JOIN ts_kv_latest tkl6 ON de.id = tkl6.entity_id  
66 - AND tkl6.key = 69  
67 - LEFT JOIN ts_kv_latest tkl7 ON de.id = tkl7.entity_id  
68 - AND tkl7.key = 70  
69 - LEFT JOIN ts_kv_latest tkl8 ON de.id = tkl8.entity_id  
70 - AND tkl8.key = 71  
71 - LEFT JOIN ts_kv_latest tkl9 ON de.id = tkl9.entity_id  
72 - AND tkl9.key = 72  
73 - LEFT JOIN ts_kv_latest tkl10 ON de.id = tkl10.entity_id  
74 - AND tkl10.key = 73  
75 - LEFT JOIN ts_kv_latest tkl11 ON de.id = tkl11.entity_id  
76 - AND tkl11.key = 74  
77 - LEFT JOIN ts_kv_latest tkl12 ON de.id = tkl12.entity_id  
78 - AND tkl12.key = 75  
79 - LEFT JOIN ts_kv_latest tkl13 ON de.id = tkl13.entity_id  
80 - AND tkl13.key = 76  
81 - LEFT JOIN ts_kv_latest tkl14 ON de.id = tkl14.entity_id  
82 - AND tkl14.key = 77  
83 - LEFT JOIN ts_kv_latest tkl15 ON de.id = tkl15.entity_id  
84 - AND tkl15.key = 78  
85 - LEFT JOIN ts_kv_latest tkl16 ON de.id = tkl16.entity_id  
86 - AND tkl16.key = 79  
87 - WHERE  
88 - de.organization_id='1697500a-dc11-45cc-88f5-2ad47472a9bb'  
89 - AND de.device_profile_id = 'c2401630-ffec-11f0-926f-2f3182abc65f'" 54 + device de
  55 + LEFT JOIN ts_kv_latest tkl1 ON de.id = tkl1.entity_id AND tkl1.key = 64
  56 + LEFT JOIN ts_kv_latest tkl2 ON de.id = tkl2.entity_id AND tkl2.key = 65
  57 + LEFT JOIN ts_kv_latest tkl3 ON de.id = tkl3.entity_id AND tkl3.key = 66
  58 + LEFT JOIN ts_kv_latest tkl4 ON de.id = tkl4.entity_id AND tkl4.key = 67
  59 + LEFT JOIN ts_kv_latest tkl5 ON de.id = tkl5.entity_id AND tkl5.key = 68
  60 + LEFT JOIN ts_kv_latest tkl6 ON de.id = tkl6.entity_id AND tkl6.key = 69
  61 + LEFT JOIN ts_kv_latest tkl7 ON de.id = tkl7.entity_id AND tkl7.key = 70
  62 + LEFT JOIN ts_kv_latest tkl8 ON de.id = tkl8.entity_id AND tkl8.key = 71
  63 + LEFT JOIN ts_kv_latest tkl9 ON de.id = tkl9.entity_id AND tkl9.key = 72
  64 + LEFT JOIN ts_kv_latest tkl10 ON de.id = tkl10.entity_id AND tkl10.key = 73
  65 + LEFT JOIN ts_kv_latest tkl11 ON de.id = tkl11.entity_id AND tkl11.key = 74
  66 + LEFT JOIN ts_kv_latest tkl12 ON de.id = tkl12.entity_id AND tkl12.key = 75
  67 + LEFT JOIN ts_kv_latest tkl13 ON de.id = tkl13.entity_id AND tkl13.key = 76
  68 + LEFT JOIN ts_kv_latest tkl14 ON de.id = tkl14.entity_id AND tkl14.key = 77
  69 + LEFT JOIN ts_kv_latest tkl15 ON de.id = tkl15.entity_id AND tkl15.key = 78
  70 + LEFT JOIN ts_kv_latest tkl16 ON de.id = tkl16.entity_id AND tkl16.key = 79
  71 + WHERE
  72 + de.organization_id = '1697500a-dc11-45cc-88f5-2ad47472a9bb'
  73 + AND de.device_profile_id = 'de36b0f0-9acf-11f1-91f1-1bded40a486e'"
90 74
91 selectSql1: "SELECT 75 selectSql1: "SELECT
92 de.sn AS sn, 76 de.sn AS sn,