package com.ruoyi.fuzhou.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.fuzhou.domain.*;
import com.ruoyi.fuzhou.enums.DataTypeEnum;
import com.ruoyi.fuzhou.mapper.ReceiveModuleInfoMapper;
import com.ruoyi.fuzhou.service.ReceiveElectricityInfoService;
import com.ruoyi.fuzhou.service.ReceiveModuleInfoService;
import com.ruoyi.fuzhou.service.ReceiveOilInfoService;
import com.ruoyi.fuzhou.service.ReceiveWaterInfoService;
import com.ruoyi.fuzhou.utils.Modbus4jUtils;
import com.ruoyi.fuzhou.utils.RtuMasterUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
*
* modbus数据模板 服务实现类
*
*
* @author zhangyy
* @since 2025-03-27
*/
@Service
public class ReceiveModuleInfoServiceImpl extends ServiceImpl implements ReceiveModuleInfoService {
@Resource
private ReceiveElectricityInfoService receiveElectricityInfoService;
@Resource
private ReceiveOilInfoService receiveOilInfoService;
@Resource
private ReceiveWaterInfoService receiveWaterInfoService;
@Override
public void saveByModule(String deviceName, String ip, Integer port, Byte deviceAddress, Integer dataType) {
if (dataType == null || DataTypeEnum.of(dataType) == null) return;
List receiveModuleInfos;
if (DataTypeEnum.YDKFM.getCode().equals(dataType)) {
receiveModuleInfos = list(new LambdaQueryWrapper() {{
or().eq(ReceiveModuleInfo::getDataType, dataType).eq(ReceiveModuleInfo::getDeviceName, deviceName);
}});
boolean flag = null == receiveModuleInfos || receiveModuleInfos.isEmpty();
ReceiveModuleInfo rmi = flag ? new ReceiveModuleInfo() : receiveModuleInfos.get(0);
if (flag) rmi.setId(null);
rmi.setDeviceAddress(deviceAddress);
rmi.setDeviceName(deviceName);
rmi.setPort(port);
if (StringUtils.isNotEmpty(ip)) rmi.setIp(ip);
rmi.setDataType(dataType);
rmi.setRegisterCount(1);
if (flag) save(rmi);
else updateById(rmi);
return;
}
receiveModuleInfos = list(new LambdaQueryWrapper() {{
or().eq(ReceiveModuleInfo::getDataType, dataType);
}});
if (receiveModuleInfos != null && receiveModuleInfos.size() > 0) {
if (DataTypeEnum.WATER_DEPT.getCode().equals(dataType) || DataTypeEnum.WATER_YA.getCode().equals(dataType) ||
DataTypeEnum.WATER_FLOW.getCode().equals(dataType)) {
List receiveWaterInfos = new ArrayList<>();
ReceiveWaterInfo receiveWaterInfo;
for (ReceiveModuleInfo info : receiveModuleInfos
) {
receiveWaterInfo = new ReceiveWaterInfo();
receiveWaterInfo.setDeviceAddress(deviceAddress);
receiveWaterInfo.setDeviceName(deviceName);
receiveWaterInfo.setPort(port);
if (StringUtils.isNotEmpty(ip)) {
receiveWaterInfo.setIp(ip);
}
if (info.getFunctionCode() != null) {
receiveWaterInfo.setFunctionCode(info.getFunctionCode());
}
receiveWaterInfo.setRegisterAdress(info.getRegisterAdress());
receiveWaterInfo.setRegisterCount(info.getRegisterCount());
receiveWaterInfo.setParam(info.getParam());
receiveWaterInfo.setParamCode(info.getParamCode());
receiveWaterInfo.setUnit(info.getUnit());
receiveWaterInfo.setDataType(dataType);
receiveWaterInfos.add(receiveWaterInfo);
}
receiveWaterInfoService.remove(new LambdaQueryWrapper() {{
or().eq(ReceiveWaterInfo::getDeviceName, deviceName);
}});
receiveWaterInfoService.saveBatch(receiveWaterInfos);
} else if (DataTypeEnum.ELECTRICITY.getCode().equals(dataType)) {
List receiveElectricityInfos = new ArrayList<>();
ReceiveElectricityInfo electricityInfo;
for (ReceiveModuleInfo info : receiveModuleInfos
) {
electricityInfo = new ReceiveElectricityInfo();
electricityInfo.setDeviceAddress(deviceAddress);
electricityInfo.setDeviceName(deviceName);
electricityInfo.setPort(port);
if (StringUtils.isNotEmpty(ip)) {
electricityInfo.setIp(ip);
}
electricityInfo.setDataType(dataType);
electricityInfo.setFunctionCode(info.getFunctionCode());
electricityInfo.setRegisterAdress(info.getRegisterAdress());
electricityInfo.setRegisterCount(info.getRegisterCount());
electricityInfo.setParam(info.getParam());
electricityInfo.setParamCode(info.getParamCode());
electricityInfo.setUnit(info.getUnit());
receiveElectricityInfos.add(electricityInfo);
}
receiveElectricityInfoService.remove(new LambdaQueryWrapper() {{
or().eq(ReceiveElectricityInfo::getDeviceName, deviceName);
}});
receiveElectricityInfoService.saveBatch(receiveElectricityInfos);
} else if (DataTypeEnum.OIL.getCode().equals(dataType) || DataTypeEnum.LIJIUOIL.getCode().equals(dataType) ||
DataTypeEnum.LIJIUJUN.getCode().equals(dataType) || DataTypeEnum.NIGDETUIYOU.getCode().equals(dataType)) {
List receiveOilInfos = new ArrayList<>();
ReceiveOilInfo receiveOilInfo;
for (ReceiveModuleInfo info : receiveModuleInfos
) {
receiveOilInfo = new ReceiveOilInfo();
receiveOilInfo.setDeviceAddress(deviceAddress);
receiveOilInfo.setDeviceName(deviceName);
receiveOilInfo.setPort(port);
if (StringUtils.isNotEmpty(ip)) {
receiveOilInfo.setIp(ip);
}
receiveOilInfo.setDataType(dataType);
if (info.getFunctionCode() != null) {
receiveOilInfo.setFunctionCode(info.getFunctionCode());
}
receiveOilInfo.setRegisterAdress(info.getRegisterAdress());
receiveOilInfo.setRegisterCount(info.getRegisterCount());
receiveOilInfo.setParam(info.getParam());
receiveOilInfo.setParamCode(info.getParamCode());
receiveOilInfo.setUnit(info.getUnit());
receiveOilInfos.add(receiveOilInfo);
}
receiveOilInfoService.remove(new LambdaQueryWrapper() {{
or().eq(ReceiveOilInfo::getDeviceName, deviceName);
}});
receiveOilInfoService.saveBatch(receiveOilInfos);
}
}
}
@Override
public void removeByModule(String deviceName, Integer dataType) {
if (dataType == null || DataTypeEnum.of(dataType) == null) {
return;
} else {
if (DataTypeEnum.WATER_DEPT.getCode().equals(dataType) || DataTypeEnum.WATER_YA.getCode().equals(dataType) ||
DataTypeEnum.WATER_FLOW.getCode().equals(dataType)) {
receiveWaterInfoService.remove(new LambdaQueryWrapper() {{
or().eq(ReceiveWaterInfo::getDeviceName, deviceName);
}});
} else if (DataTypeEnum.ELECTRICITY.getCode().equals(dataType)) {
receiveElectricityInfoService.remove(new LambdaQueryWrapper() {{
or().eq(ReceiveElectricityInfo::getDeviceName, deviceName);
}});
} else if (DataTypeEnum.OIL.getCode().equals(dataType) || DataTypeEnum.LIJIUOIL.getCode().equals(dataType) ||
DataTypeEnum.LIJIUJUN.getCode().equals(dataType) || DataTypeEnum.NIGDETUIYOU.getCode().equals(dataType)) {
receiveOilInfoService.remove(new LambdaQueryWrapper() {{
or().eq(ReceiveOilInfo::getDeviceName, deviceName);
}});
}
}
}
@Override
public DpEquipment getIp(String deviceName, Integer dataType) {
if (dataType == null || DataTypeEnum.of(dataType) == null) {
return new DpEquipment();
} else {
DpEquipment dpEquipment = new DpEquipment();
if (DataTypeEnum.YDKFM.getCode().equals(dataType)) {
List infos = list(new LambdaQueryWrapper() {{
or().eq(ReceiveModuleInfo::getDeviceName, deviceName);
}});
if (null == infos || infos.isEmpty()) return dpEquipment;
ReceiveModuleInfo rmi = infos.get(0);
dpEquipment.setIp(rmi.getIp());
dpEquipment.setPort(rmi.getPort());
dpEquipment.setDeviceAddress(rmi.getDeviceAddress());
}
if (DataTypeEnum.WATER_DEPT.getCode().equals(dataType) || DataTypeEnum.WATER_YA.getCode().equals(dataType) ||
DataTypeEnum.WATER_FLOW.getCode().equals(dataType)) {
List receiveWaterInfos = receiveWaterInfoService.list(new LambdaQueryWrapper() {{
or().eq(ReceiveWaterInfo::getDeviceName, deviceName);
}});
for (ReceiveWaterInfo r : receiveWaterInfos
) {
if (StringUtils.isNotEmpty(r.getIp())) {
dpEquipment.setIp(r.getIp());
}
if (r.getPort() != null) {
dpEquipment.setPort(r.getPort());
}
if (r.getDeviceAddress() != null) {
dpEquipment.setDeviceAddress(r.getDeviceAddress());
}
}
} else if (DataTypeEnum.ELECTRICITY.getCode().equals(dataType)) {
List receiveElectricityInfos = receiveElectricityInfoService.list(new LambdaQueryWrapper() {{
or().eq(ReceiveElectricityInfo::getDeviceName, deviceName);
}});
for (ReceiveElectricityInfo r : receiveElectricityInfos
) {
if (StringUtils.isNotEmpty(r.getIp())) {
dpEquipment.setIp(r.getIp());
}
if (r.getPort() != null) {
dpEquipment.setPort(r.getPort());
}
if (r.getDeviceAddress() != null) {
dpEquipment.setDeviceAddress(r.getDeviceAddress());
}
}
} else if (DataTypeEnum.OIL.getCode().equals(dataType) || DataTypeEnum.LIJIUOIL.getCode().equals(dataType) ||
DataTypeEnum.LIJIUJUN.getCode().equals(dataType) || DataTypeEnum.NIGDETUIYOU.getCode().equals(dataType)) {
List receiveOilInfos = receiveOilInfoService.list(new LambdaQueryWrapper() {{
or().eq(ReceiveOilInfo::getDeviceName, deviceName);
}});
for (ReceiveOilInfo r : receiveOilInfos
) {
if (StringUtils.isNotEmpty(r.getIp())) {
dpEquipment.setIp(r.getIp());
}
if (r.getPort() != null) {
dpEquipment.setPort(r.getPort());
}
if (r.getDeviceAddress() != null) {
dpEquipment.setDeviceAddress(r.getDeviceAddress());
}
}
}
return dpEquipment;
}
}
@Override
public Map getYdkfmStatus(String deviceName) throws Exception {
List infos = list(new LambdaQueryWrapper() {{
or().eq(ReceiveModuleInfo::getDeviceName, deviceName);
}});
if (null == infos || infos.isEmpty()) throw new Exception("找不到油电控阀门");
ReceiveModuleInfo rmi = infos.get(0);
Map map = new HashMap<>();
Boolean status;
try {
//status = RtuMasterUtils.getYdkfmStatus(rmi);
status = Modbus4jUtils.getYdkfmStatus(rmi);
} catch (Exception ex) {
map.put("error", ex.getMessage());
status = null;
}
map.put("status", status);
return map;
}
@Override
public Map ctrlYdkfm(String deviceName, Boolean flag) throws Exception {
List infos = list(new LambdaQueryWrapper() {{
or().eq(ReceiveModuleInfo::getDeviceName, deviceName);
}});
if (null == infos || infos.isEmpty()) throw new Exception("找不到油电控阀门");
ReceiveModuleInfo rmi = infos.get(0);
Map map = new HashMap<>();
Boolean status;
try {
//status = RtuMasterUtils.ctrlYdkfm(rmi, flag);
status = Modbus4jUtils.ctrlYdkfm(rmi, flag);
} catch (Exception ex) {
map.put("error", ex.getMessage());
status = null;
}
map.put("status", status);
return map;
}
}