package com.ruoyi.fuzhou.service.impl;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.fuzhou.domain.DpEquipment;
import com.ruoyi.fuzhou.domain.ReceiveElectricityValue;
import com.ruoyi.fuzhou.domain.ReceiveWaterInfo;
import com.ruoyi.fuzhou.domain.ReceiveWaterValue;
import com.ruoyi.fuzhou.mapper.EquipmentMapper;
import com.ruoyi.fuzhou.mapper.ReceiveWaterInfoMapper;
import com.ruoyi.fuzhou.service.ReceiveWaterInfoService;
import com.ruoyi.fuzhou.service.ReceiveWaterValueService;
import com.ruoyi.fuzhou.utils.hj1239.StringToHexUtil;
import com.ruoyi.fuzhou.utils.waterdept.ModbusWaterDeptUtils;
import com.ruoyi.fuzhou.utils.watermodbus.ModbusWaterUtils;
import com.ruoyi.fuzhou.websocket.WebSocketOilServer;
import jakarta.annotation.Resource;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
*
* 水设备信息 服务实现类
*
*
* @author zhangyy
* @since 2025-03-12
*/
@Service
public class ReceiveWaterInfoServiceImpl extends ServiceImpl implements ReceiveWaterInfoService {
@Resource
private ReceiveWaterValueService receiveWaterValueService;
@Resource
private EquipmentMapper equipmentMapper;
@Resource
private RedisTemplate redisTemplate;
@Override
public void saveWater(List list, DpEquipment dpEquipment) {
JSONObject jsonObject = ModbusWaterUtils.getValue(list.get(0).getIp(), list.get(0).getPort(), list);
if (jsonObject != null && jsonObject.size() > 0) {
ReceiveWaterValue receiveWaterValue = JSON.toJavaObject(jsonObject, ReceiveWaterValue.class);
receiveWaterValue.setCreateTime(new Date());
receiveWaterValue.setDeviceName(list.get(0).getDeviceName());
if (Math.abs(Double.valueOf(receiveWaterValue.getTimeFlow())) > 0 || Math.abs(Double.valueOf(receiveWaterValue.getFlowRate())) > 0) {
redisTemplate.opsForValue().set("VALUE@" + receiveWaterValue.getDeviceName(), receiveWaterValue.getFlowRate()
+ receiveWaterValue.getTimeFlow(), 30, TimeUnit.MINUTES);
receiveWaterValueService.save(receiveWaterValue);
} else {
Object obj = redisTemplate.opsForValue().get("VALUE@" + receiveWaterValue.getDeviceName());
if (obj == null) {
redisTemplate.opsForValue().set("VALUE@" + receiveWaterValue.getDeviceName(), receiveWaterValue.getFlowRate()
+ receiveWaterValue.getTimeFlow(), 30, TimeUnit.MINUTES);
receiveWaterValueService.save(receiveWaterValue);
} else if (!obj.toString().equals(receiveWaterValue.getFlowRate() + receiveWaterValue.getTimeFlow())) {
redisTemplate.opsForValue().set("VALUE@" + receiveWaterValue.getDeviceName(), receiveWaterValue.getFlowRate()
+ receiveWaterValue.getTimeFlow(), 30, TimeUnit.MINUTES);
receiveWaterValueService.save(receiveWaterValue);
}
}
}
//制造socket数据
// JSONArray header = new JSONArray();
// list.forEach(item -> {
// JSONObject head = new JSONObject();
// head.put("param", item.getParam());
// head.put("paramCode", item.getParamCode());
// head.put("unit", item.getUnit());
// header.add(head);
// });
// ReceiveWaterValue receiveOilValue = receiveWaterValueService.getOne(new LambdaQueryWrapper() {{
// or().eq(ReceiveWaterValue::getDeviceName, list.get(0).getDeviceName()).orderByDesc(ReceiveWaterValue::getCreateTime).last("limit 1");
// }});
// if (receiveOilValue != null) {
// JSONObject object = new JSONObject();
// object.put("header", header);
// object.put("body", JSONObject.parseObject(JSON.toJSONString(receiveOilValue)));
// object.put("info", JSONObject.parseObject(JSON.toJSONString(dpEquipment)));
// object.put("status", "1");
// WebSocketOilServer.sendAllMessage(object.toJSONString());
// }
}
@Override
public void saveWaterYa(List list, DpEquipment info) {
JSONObject jsonObject = ModbusWaterUtils.getValue(list.get(0).getIp(), list.get(0).getPort(), list);
if (jsonObject != null && jsonObject.size() > 0) {
ReceiveWaterValue receiveWaterValue = JSON.toJavaObject(jsonObject, ReceiveWaterValue.class);
receiveWaterValue.setCreateTime(new Date());
receiveWaterValue.setDeviceName(list.get(0).getDeviceName());
receiveWaterValueService.save(receiveWaterValue);
}
}
@Override
public void saveWaterDept(List list, DpEquipment info) {
for (ReceiveWaterInfo receiveWaterInfo : list
) {
try{
String value = ModbusWaterDeptUtils.getWaterDept(receiveWaterInfo.getIp(), receiveWaterInfo.getPort());
Map map = new HashMap<>();
if (StringUtils.isNotEmpty(value)) {
String result = StringToHexUtil.convertHexToString(value);
System.out.println("📥 收到水深设备响应: " + result);
String[] resultList = result.split("\\r\\n");
for (int i = 0; i < resultList.length; i++) {
String[] item = resultList[i].split("-");
if (item.length == 2) {
if (map.get(item[0]) == null) {
map.put(item[0], Double.valueOf(item[1]));
} else {
if (Double.valueOf(item[1]) > map.get(item[0])) {
map.put(item[0], Double.valueOf(item[1]));
}
}
}
}
}
if (map.size() > 0) {
Set set = map.keySet();
for (String src : set
) {
DpEquipment equipment = equipmentMapper.selectOne(new LambdaQueryWrapper() {{
or().eq(DpEquipment::getFieldName, src);
}});
if (equipment != null) {
ReceiveWaterValue receiveWaterValue = new ReceiveWaterValue();
if (map.get(src) > 5 && map.get(src) < 20) {
receiveWaterValue.setWaterDeep(String.valueOf(String.format("%.3f", map.get(src))));
receiveWaterValue.setCreateTime(new Date());
receiveWaterValue.setDeviceName(String.valueOf(equipment.getId()));
receiveWaterValueService.save(receiveWaterValue);
}else {
receiveWaterValue.setWaterDeep("10");
receiveWaterValue.setCreateTime(new Date());
receiveWaterValue.setDeviceName(String.valueOf(equipment.getId()));
receiveWaterValueService.save(receiveWaterValue);
}
}
}
}
}catch (Exception e){
System.out.println("");
continue;
}
}
}
}