package com.zksy.environment.service.impl;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zksy.environment.domain.po.PictureMessage;
import com.zksy.environment.mapper.PictureMessageMapper;
import com.zksy.environment.service.PictureMessageService;
import com.zksy.environment.utils.DataCheckUtil;
import com.zksy.environment.utils.DateTimeUtil;
import com.zksy.environment.utils.HexToImageConverter;
import com.zksy.service.MinioFileStorageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.regex.Pattern;
/**
*
* 遥测站图片报或中心站查询遥测站图片采集信息 服务实现类
*
*
* @author Yang
* @since 2024-08-09
*/
@Slf4j
@Service
public class PictureMessageServiceImpl extends ServiceImpl implements PictureMessageService {
private final List allDataSegments = new ArrayList<>();
private final Object lock = new Object();
private HashMap map = new HashMap<>();
@Autowired
private MinioFileStorageService minioFileStorageService;
@Override
public boolean savePictureMessage(String oldDataStr, String dataStr) {
boolean flag = false;
try {
PictureMessage pictureMessage = new PictureMessage();
// 解析数据包
String SYN = dataStr.substring(0, 2);
String totalHex = dataStr.substring(2, 5);
String total = DataCheckUtil.hexToDecimalExample(totalHex);
String packageNumberHex = dataStr.substring(5, 8);
String packageNumber = DataCheckUtil.hexToDecimalExample(packageNumberHex);
// 处理数据包
String segment;
if ("01".equals(packageNumber)) {
// 解析初始数据包
String serialNumber = dataStr.substring(8, 12);
String dataTime = dataStr.substring(12, 24);
String sendingMessageTime = "20" + dataTime;
map.put("sendingMessageTime", DateTimeUtil.parseDateTime(sendingMessageTime).toString());
// 测站地址
int stationAddressIndex = dataStr.indexOf("f1f1");
if (stationAddressIndex != -1 && stationAddressIndex + 10 < dataStr.length()) {
String result = dataStr.substring(stationAddressIndex + 4, stationAddressIndex + 14);
map.put("measuringStationAddress",result);
}
// 测站类型
Pattern pattern = Pattern.compile("F0F0", Pattern.CASE_INSENSITIVE);
String[] f0F0s = pattern.split(dataStr);
String f0F0 = f0F0s[0];
if (f0F0.length() >= 2) {
String prefix = f0F0.substring(f0F0.length() - 2);
map.put("measuringStationType",prefix);
}
// 观测时间
String f0F01 = f0F0s[1];
if (f0F01.length() >= 10) {
String digits = f0F01.substring(0, 10);
String observeTime = "20" + digits + "00";
map.put("observeTime",DateTimeUtil.parseDateTime(observeTime).toString());
}
// 初始化数据段列表
synchronized (lock) {
((ArrayList) allDataSegments).ensureCapacity(Integer.parseInt(total));
}
// 对于首个包,直接获取数据段
List dataSegments = new ArrayList<>();
int startIndex = dataStr.indexOf("f3f3");
if (startIndex != -1) {
segment = dataStr.substring(startIndex + "f3f3".length());
dataSegments.add(segment);
}
segment = String.join("", dataSegments);
} else {
// 对于非首个包,直接获取数据段
segment = dataStr.substring(8);
}
// 保存数据段
synchronized (lock) {
int index = Integer.parseInt(packageNumber) - 1;
if (index >= allDataSegments.size()) {
// 如果索引超出范围,扩展列表大小
while (allDataSegments.size() <= index) {
allDataSegments.add(null);
}
}
allDataSegments.set(index, segment);
System.out.println("packageNumber====="+packageNumber+"total====="+total);
// 检查是否所有数据包都已经收到
if (Integer.parseInt(packageNumber) == Integer.parseInt(total)) {
// 重新组合所有的数据包
StringBuilder completeImageDataBuilder = new StringBuilder();
for (String segment1 : allDataSegments) {
// 确保 segment 不为 null
if (segment1 != null) {
completeImageDataBuilder.append(segment1);
}
}
String completeImageData = completeImageDataBuilder.toString();
System.out.println("图片集合:" + completeImageData);
File image = HexToImageConverter.hexStringToImage(completeImageData, "output.png");
if(ObjectUtils.isNotEmpty(image)){
String filePath = minioFileStorageService.uploadFileByFile(image, "environment-image");
// 设置完整的消息
pictureMessage.setMessage(filePath);
System.out.println("pictureMessage=====" + pictureMessage);
// 设置 ID 和创建时间
pictureMessage.setId(UUID.randomUUID().toString().replace("-", ""));
pictureMessage.setCreateTime(LocalDateTime.now());
pictureMessage.setSendingMessageTime(LocalDateTime.parse(map.get("sendingMessageTime")));
pictureMessage.setMeasuringStationAddress(map.get("measuringStationAddress"));
pictureMessage.setMeasuringStationType(map.get("measuringStationType"));
pictureMessage.setObserveTime(LocalDateTime.parse(map.get("observeTime")));
// 执行保存操作
flag = super.save(pictureMessage);
}
allDataSegments.clear(); // 清空列表以便下次使用
}
}
return flag;
} catch (Exception e) {
log.info("==========数据解析错误==========", oldDataStr);
e.printStackTrace();
allDataSegments.clear(); // 清空列表以便下次使用
}
return flag;
}
}