package com.ruoyi.device.service.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.device.mapper.CollectBridgeMapper; import com.ruoyi.device.pojo.CollectBridge; import com.ruoyi.device.service.CollectBridgeService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import java.time.Duration; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; /** * 数字电桥采集 * * @author zhuo * @since 2025-02-19 */ @Service @Slf4j public class CollectBridgeServiceImpl extends ServiceImpl implements CollectBridgeService { /** * 填充采集数据 * @param jsonObject */ @Override public void addBridgeValue(JSONObject jsonObject) { JSONArray dataArray = jsonObject.getJSONArray("data"); for (int i = 0; i < dataArray.size(); i++) { JSONObject listInfo = dataArray.getJSONObject(i); // 存储数据 String dataStream = listInfo.getString("dataStream"); if (dataStream.equals("DQCS.DQCS.SN")) { JSONArray dataPoints = listInfo.getJSONArray("dataPoints"); JSONObject pointsJSONObject = dataPoints.getJSONObject(0); String entrustCode = pointsJSONObject.getString("value"); // 解析时间戳 Instant instant = Instant.ofEpochMilli(pointsJSONObject.getLong("time")); LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); // 先存储编号, 后续存储值 CollectBridge collectBridge = new CollectBridge(); collectBridge.setEntrustCode(entrustCode); collectBridge.setCollectDate(collectDate); baseMapper.insert(collectBridge); } // 寄存器地址等于64获取结果值 if (dataStream.equals("DQCS.DQCS.64")) { JSONArray dataPoints = listInfo.getJSONArray("dataPoints"); JSONObject pointsJSONObject = dataPoints.getJSONObject(0); String value = pointsJSONObject.getString("value"); if (value.equals("64")) { for (int j = 0; j < dataArray.size(); j++) { JSONObject listInfo2 = dataArray.getJSONObject(j); String dataStream2 = listInfo2.getString("dataStream"); // 寄存器地址等于64获取结果值 if (dataStream2.equals("DQCS.DQCS.DZZ")) { JSONArray dataPoints2 = listInfo2.getJSONArray("dataPoints"); JSONObject pointsJSONObject2 = dataPoints2.getJSONObject(0); String collectValue = pointsJSONObject2.getString("value"); // 解析时间戳 Instant instant = Instant.ofEpochMilli(pointsJSONObject2.getLong("time")); LocalDateTime collectDate = LocalDateTime.ofInstant(instant, ZoneId.systemDefault()); // 查询最新一条数据 CollectBridge collectBridge = baseMapper.selectOne(Wrappers.lambdaQuery() .orderByDesc(CollectBridge::getCollectDate) .last("limit 1")); // 判断两条数据是否相差在10分钟之内和有没有编号 if (isWithinTenMinutes(collectDate, collectBridge.getCollectDate()) && StringUtils.isNotBlank(collectBridge.getEntrustCode())) { // 修改检验值 collectBridge.setCollectValue(collectValue); baseMapper.updateById(collectBridge); } else { // 只存储值 CollectBridge bridge = new CollectBridge(); bridge.setCollectValue(collectValue); bridge.setCollectDate(collectDate); baseMapper.insert(bridge); } } } } } } } public static boolean isWithinTenMinutes(LocalDateTime dateTime1, LocalDateTime dateTime2) { Duration duration = Duration.between(dateTime1, dateTime2); long minutesDifference = Math.abs(duration.toMinutes()); return minutesDifference <= 10; } }