PictureMessageServiceImpl.java 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. package com.zksy.environment.service.impl;
  2. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.zksy.environment.domain.po.PictureMessage;
  5. import com.zksy.environment.mapper.PictureMessageMapper;
  6. import com.zksy.environment.service.PictureMessageService;
  7. import com.zksy.environment.utils.DataCheckUtil;
  8. import com.zksy.environment.utils.DateTimeUtil;
  9. import com.zksy.environment.utils.HexToImageConverter;
  10. import com.zksy.service.MinioFileStorageService;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.stereotype.Service;
  14. import java.io.File;
  15. import java.nio.file.Paths;
  16. import java.text.SimpleDateFormat;
  17. import java.time.LocalDateTime;
  18. import java.util.*;
  19. import java.util.regex.Pattern;
  20. /**
  21. * <p>
  22. * 遥测站图片报或中心站查询遥测站图片采集信息 服务实现类
  23. * </p>
  24. *
  25. * @author Yang
  26. * @since 2024-08-09
  27. */
  28. @Slf4j
  29. @Service
  30. public class PictureMessageServiceImpl extends ServiceImpl<PictureMessageMapper, PictureMessage> implements PictureMessageService {
  31. private final List<String> allDataSegments = new ArrayList<>();
  32. private final Object lock = new Object();
  33. private HashMap<String,String> map = new HashMap<>();
  34. @Autowired
  35. private MinioFileStorageService minioFileStorageService;
  36. @Override
  37. public boolean savePictureMessage(String oldDataStr, String dataStr) {
  38. boolean flag = false;
  39. try {
  40. PictureMessage pictureMessage = new PictureMessage();
  41. // 解析数据包
  42. String SYN = dataStr.substring(0, 2);
  43. String totalHex = dataStr.substring(2, 5);
  44. String total = DataCheckUtil.hexToDecimalExample(totalHex);
  45. String packageNumberHex = dataStr.substring(5, 8);
  46. String packageNumber = DataCheckUtil.hexToDecimalExample(packageNumberHex);
  47. // 处理数据包
  48. String segment;
  49. if ("01".equals(packageNumber)) {
  50. // 解析初始数据包
  51. String serialNumber = dataStr.substring(8, 12);
  52. String dataTime = dataStr.substring(12, 24);
  53. String sendingMessageTime = "20" + dataTime;
  54. map.put("sendingMessageTime", DateTimeUtil.parseDateTime(sendingMessageTime).toString());
  55. // 测站地址
  56. int stationAddressIndex = dataStr.indexOf("f1f1");
  57. if (stationAddressIndex != -1 && stationAddressIndex + 10 < dataStr.length()) {
  58. String result = dataStr.substring(stationAddressIndex + 4, stationAddressIndex + 14);
  59. map.put("measuringStationAddress",result);
  60. }
  61. // 测站类型
  62. Pattern pattern = Pattern.compile("F0F0", Pattern.CASE_INSENSITIVE);
  63. String[] f0F0s = pattern.split(dataStr);
  64. String f0F0 = f0F0s[0];
  65. if (f0F0.length() >= 2) {
  66. String prefix = f0F0.substring(f0F0.length() - 2);
  67. map.put("measuringStationType",prefix);
  68. }
  69. // 观测时间
  70. String f0F01 = f0F0s[1];
  71. if (f0F01.length() >= 10) {
  72. String digits = f0F01.substring(0, 10);
  73. String observeTime = "20" + digits + "00";
  74. map.put("observeTime",DateTimeUtil.parseDateTime(observeTime).toString());
  75. }
  76. // 初始化数据段列表
  77. synchronized (lock) {
  78. ((ArrayList<String>) allDataSegments).ensureCapacity(Integer.parseInt(total));
  79. }
  80. // 对于首个包,直接获取数据段
  81. List<String> dataSegments = new ArrayList<>();
  82. int startIndex = dataStr.indexOf("f3f3");
  83. if (startIndex != -1) {
  84. segment = dataStr.substring(startIndex + "f3f3".length());
  85. dataSegments.add(segment);
  86. }
  87. segment = String.join("", dataSegments);
  88. } else {
  89. // 对于非首个包,直接获取数据段
  90. segment = dataStr.substring(8);
  91. }
  92. // 保存数据段
  93. synchronized (lock) {
  94. int index = Integer.parseInt(packageNumber) - 1;
  95. if (index >= allDataSegments.size()) {
  96. // 如果索引超出范围,扩展列表大小
  97. while (allDataSegments.size() <= index) {
  98. allDataSegments.add(null);
  99. }
  100. }
  101. allDataSegments.set(index, segment);
  102. System.out.println("packageNumber====="+packageNumber+"total====="+total);
  103. // 检查是否所有数据包都已经收到
  104. if (Integer.parseInt(packageNumber) == Integer.parseInt(total)) {
  105. // 重新组合所有的数据包
  106. StringBuilder completeImageDataBuilder = new StringBuilder();
  107. for (String segment1 : allDataSegments) {
  108. // 确保 segment 不为 null
  109. if (segment1 != null) {
  110. completeImageDataBuilder.append(segment1);
  111. }
  112. }
  113. String completeImageData = completeImageDataBuilder.toString();
  114. System.out.println("图片集合:" + completeImageData);
  115. File image = HexToImageConverter.hexStringToImage(completeImageData, "output.png");
  116. if(ObjectUtils.isNotEmpty(image)){
  117. String filePath = minioFileStorageService.uploadFileByFile(image, "environment-image");
  118. // 设置完整的消息
  119. pictureMessage.setMessage(filePath);
  120. System.out.println("pictureMessage=====" + pictureMessage);
  121. // 设置 ID 和创建时间
  122. pictureMessage.setId(UUID.randomUUID().toString().replace("-", ""));
  123. pictureMessage.setCreateTime(LocalDateTime.now());
  124. pictureMessage.setSendingMessageTime(LocalDateTime.parse(map.get("sendingMessageTime")));
  125. pictureMessage.setMeasuringStationAddress(map.get("measuringStationAddress"));
  126. pictureMessage.setMeasuringStationType(map.get("measuringStationType"));
  127. pictureMessage.setObserveTime(LocalDateTime.parse(map.get("observeTime")));
  128. // 执行保存操作
  129. flag = super.save(pictureMessage);
  130. }
  131. allDataSegments.clear(); // 清空列表以便下次使用
  132. }
  133. }
  134. return flag;
  135. } catch (Exception e) {
  136. log.info("==========数据解析错误==========", oldDataStr);
  137. e.printStackTrace();
  138. allDataSegments.clear(); // 清空列表以便下次使用
  139. }
  140. return flag;
  141. }
  142. }