Showing
2 changed files
with
106 additions
and
74 deletions
| @@ -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, |