Commit 0ec7aee63f4b0bb1425df14936e5679af84b6cee

Authored by 房远帅
1 parent d1c0b8d8

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

... ... @@ -10,12 +10,10 @@ import org.springframework.stereotype.Service;
10 10 import org.springframework.util.CollectionUtils;
11 11
12 12 import java.sql.*;
  13 +import java.sql.Date;
13 14 import java.time.LocalDateTime;
14 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 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 98 log.info("开始处理{}条电表设备数据并进行上报", needSyncDataList.size());
64 99 int successCount = 0;
65 100 int failCount = 0;
66 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 128 for (int i = 0; i < needSyncDataList.size(); i++) {
86 129 Object needSyncData = needSyncDataList.get(i);
... ... @@ -88,6 +131,11 @@ public class KSDeviceReportService {
88 131 List<Object> dataList = (ArrayList) needSyncData;
89 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 139 // 1. 获取当前时间
92 140 LocalDateTime now = LocalDateTime.now();
93 141 // 2. 定义间隔分钟数 (例如 5 分钟)
... ...
... ... @@ -33,60 +33,44 @@ ks:
33 33 jdbcUserName: "postgres"
34 34 jdbcPassword: "1qaz@WSX"
35 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 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 75 selectSql1: "SELECT
92 76 de.sn AS sn,
... ...