HandleData.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. package com.jyxt.getdatabyrestful;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.JsonNode;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.jyxt.getdatabyrestful.service.IBPSService;
  6. import com.jyxt.getdatabyrestful.service.PlatformService;
  7. import org.slf4j.Logger;
  8. import org.slf4j.LoggerFactory;
  9. import org.springframework.beans.factory.annotation.Autowired;
  10. import org.springframework.stereotype.Component;
  11. import com.fasterxml.jackson.databind.node.ArrayNode;
  12. import com.fasterxml.jackson.databind.node.ObjectNode;
  13. import java.time.LocalTime;
  14. import java.time.format.DateTimeFormatter;
  15. import java.util.*;
  16. @Component
  17. public class HandleData {
  18. private static final Logger log = LoggerFactory.getLogger(GetDataByRESTfulApplication.class);
  19. private static final ObjectMapper mapper = new ObjectMapper();
  20. @Autowired
  21. PlatformService platformService;
  22. @Autowired
  23. IBPSService ibpsService;
  24. public void startHandleData() {
  25. log.info("---------------------------------------------------------------");
  26. List<Map<String, String>> platformList = platformService.getAllData();
  27. List<Map<String,Object>> configList = ibpsService.getConfList();
  28. List<Map<String,Object>> undoList = ibpsService.getUndoList();
  29. for(Map<String,Object> undoMap : undoList){
  30. String areaName = undoMap.get("qu_yu_ming_cheng_").toString();
  31. String RoomNo = undoMap.get("fang_jian_hao_").toString();
  32. Map<String,Object> configMap = getConfMap(configList,areaName,RoomNo);
  33. if (configMap.size() != 0){
  34. String collectID = configMap.get("cai_ji_qi_id_").toString();
  35. List<Map<String, String>> curPlatformList = getCurPlatformList(collectID,platformList);
  36. if (curPlatformList.size() != 0){
  37. String id = undoMap.get("id_").toString();
  38. String JsonStr = undoMap.get("lie_biao_shu_ju_").toString();
  39. String timeSlot = getTimePeriod("1");
  40. String retJsonStr = handJsonStr(JsonStr,curPlatformList,timeSlot);
  41. String JsonFlag = checkJson(retJsonStr);
  42. String timeStr = getTimePeriod("0");
  43. String retStr = ibpsService.UpdateData("t_snwsdjkjlb",id,retJsonStr,JsonFlag, timeSlot, timeStr);
  44. if (retStr.equals("1")){
  45. log.info("update success");
  46. } else {
  47. log.info("update fail:"+retStr);
  48. }
  49. }
  50. }
  51. }
  52. }
  53. public Map<String,Object> getConfMap(List<Map<String, Object>> configList, String areaName, String RoomNo){
  54. Map<String,Object> configMap = new HashMap<>();
  55. for(Map<String, Object> config : configList){
  56. String curAreaName = config.get("qu_yu_").toString();
  57. String curRoomNo = config.get("fang_jian_").toString();
  58. if(areaName.equals(curAreaName) && RoomNo.equals(curRoomNo)){
  59. configMap = config;
  60. }
  61. }
  62. return configMap;
  63. }
  64. public List<Map<String, String>> getCurPlatformList(String collectID, List<Map<String, String>> platformList){
  65. List<Map<String, String>> retList = new ArrayList<>();
  66. for(Map<String, String> platformMap : platformList){
  67. String curCollectID = platformMap.get("deviceAddr").toString();
  68. if(curCollectID.equals(collectID)){
  69. retList.add(platformMap);
  70. }
  71. }
  72. return retList;
  73. }
  74. /**
  75. * @ClassName HandleData
  76. * @Author huangws
  77. * @Description 模式0:返回当前时间(HH:mm格式)
  78. * 模式1:返回时间段
  79. * @Date 2025/8/11 16:46
  80. **/
  81. public static String getTimePeriod(String timeType) {
  82. LocalTime now = LocalTime.now();
  83. // 模式0:返回当前时间(HH:mm格式)
  84. if ("0".equals(timeType)) {
  85. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm");
  86. return now.format(formatter);
  87. }
  88. // 模式1:返回时间段
  89. else if ("1".equals(timeType)) {
  90. LocalTime morningStart = LocalTime.of(6, 0); // 6:00
  91. LocalTime afternoonStart = LocalTime.of(12, 0); // 12:00
  92. LocalTime eveningStart = LocalTime.of(18, 0); // 18:00
  93. if (now.isAfter(morningStart) && now.isBefore(afternoonStart)) {
  94. return "上午";
  95. } else if (now.equals(afternoonStart) ||
  96. (now.isAfter(afternoonStart) && now.isBefore(eveningStart))) {
  97. return "下午";
  98. } else {
  99. return "其他时段";
  100. }
  101. }
  102. // 处理无效参数
  103. else {
  104. throw new IllegalArgumentException("无效参数: 只支持\"0\"或\"1\"");
  105. }
  106. }
  107. /**
  108. * 20250619 huangws
  109. * 处理json串,将获得的实际结果填入json串再返回
  110. * @param JsonStr
  111. * @param curPlatformList
  112. * @param timeSlot
  113. * @return throws JsonProcessingException
  114. * @throws JsonProcessingException
  115. */
  116. public String handJsonStr(String JsonStr, List<Map<String, String>> curPlatformList, String timeSlot) {
  117. String retVal = JsonStr;
  118. log.info("org json string:" + JsonStr);
  119. log.info("curPlatformList size: " + (curPlatformList != null ? curPlatformList.size() : 0));
  120. if (curPlatformList == null || curPlatformList.isEmpty()) {
  121. log.warn("curPlatformList is empty, return original JSON");
  122. return retVal;
  123. }
  124. try {
  125. ObjectMapper mapper = new ObjectMapper();
  126. JsonNode rootNode = mapper.readTree(JsonStr);
  127. if (rootNode.isArray()) {
  128. ArrayNode arrayNode = (ArrayNode) rootNode;
  129. // 遍历所有平台数据
  130. for (Map<String, String> platformMap : curPlatformList) {
  131. String registerName = platformMap.get("registerName");
  132. String dataValue = platformMap.get("data");
  133. if (registerName == null || dataValue == null) {
  134. log.warn("Missing registerName or data in platformMap: " + platformMap);
  135. continue;
  136. }
  137. String targetLabel = timeSlot + registerName; // 如"上午温度"
  138. boolean found = false;
  139. // 在JSON数组中查找匹配项
  140. for (int i = 0; i < arrayNode.size(); i++) {
  141. JsonNode item = arrayNode.get(i);
  142. if (!item.isObject()) continue;
  143. ObjectNode objNode = (ObjectNode) item;
  144. String label = objNode.path("label").asText("");
  145. if (targetLabel.equals(label)) {
  146. found = true;
  147. // 更新value字段
  148. objNode.put("value", dataValue);
  149. // 处理fixValue和result
  150. String fixValueStr = objNode.path("fixValue").asText("");
  151. double dataVal = parseDoubleSafe(dataValue, 0.0);
  152. double resultVal = dataVal;
  153. if (!fixValueStr.isEmpty()) {
  154. double fixVal = parseDoubleSafe(fixValueStr, 0.0);
  155. resultVal = dataVal + fixVal;
  156. }
  157. // 更新result字段
  158. objNode.put("result", String.valueOf(resultVal));
  159. // 处理范围检查
  160. JsonNode rangeNode = objNode.path("range");
  161. if (rangeNode.isArray() && rangeNode.size() >= 2) {
  162. double min = parseDoubleSafe(rangeNode.get(0).asText(), Double.MIN_VALUE);
  163. double max = parseDoubleSafe(rangeNode.get(1).asText(), Double.MAX_VALUE);
  164. if (min != Double.MIN_VALUE && max != Double.MAX_VALUE) {
  165. String status = (resultVal >= min && resultVal <= max) ? "正常" : "失控";
  166. objNode.put("status", status);
  167. } else {
  168. objNode.put("status", "范围数据错误");
  169. log.warn("Invalid range data for label: " + label);
  170. }
  171. } else {
  172. objNode.put("status", "范围数据缺失");
  173. log.warn("Missing range data for label: " + label);
  174. }
  175. break; // 找到匹配项后跳出内层循环
  176. }
  177. }
  178. if (!found) {
  179. log.warn("No matching label found for: " + targetLabel);
  180. }
  181. }
  182. retVal = mapper.writeValueAsString(rootNode);
  183. }
  184. } catch (Exception e) {
  185. log.error("处理JSON时发生错误: " + e.getMessage(), e);
  186. }
  187. return retVal;
  188. }
  189. private double parseDoubleSafe(String value, double defaultValue) {
  190. if (value == null || value.isEmpty()) {
  191. return defaultValue;
  192. }
  193. try {
  194. return Double.parseDouble(value);
  195. } catch (NumberFormatException e) {
  196. log.warn("数值格式错误: " + value + ", 使用默认值: " + defaultValue);
  197. return defaultValue;
  198. }
  199. }
  200. /**
  201. * @ClassName HandleData
  202. * @Author huangws
  203. * @Description
  204. * @Date 2025/8/11 14:57
  205. **/
  206. public String checkJson(String retJsonStr) {
  207. boolean allResultsValid = true;
  208. boolean hasOutOfControl = false;
  209. try {
  210. ObjectMapper mapper = new ObjectMapper();
  211. JsonNode rootNode = mapper.readTree(retJsonStr);
  212. if (rootNode.isArray()) {
  213. for (JsonNode item : rootNode) {
  214. // 检查result字段是否有效
  215. JsonNode resultNode = item.get("result");
  216. if (resultNode == null || !resultNode.isTextual() || resultNode.asText().isEmpty()) {
  217. allResultsValid = false;
  218. }
  219. // 检查status字段是否为"失控"
  220. JsonNode statusNode = item.get("status");
  221. if (statusNode != null && statusNode.isTextual()) {
  222. String status = statusNode.asText();
  223. if ("失控".equals(status)) {
  224. hasOutOfControl = true;
  225. }
  226. }
  227. }
  228. }
  229. } catch (Exception e) {
  230. log.error("校验JSON完成状态时发生错误: " + e.getMessage(), e);
  231. allResultsValid = false;
  232. }
  233. // 构建返回结果
  234. String completionStatus = allResultsValid ? "1" : "0";
  235. String controlStatus = hasOutOfControl ? "1" : "0";
  236. return completionStatus + "^" + controlStatus;
  237. }
  238. }