package cn.iocoder.yudao.module.iot.service.device; import cn.hutool.core.lang.Assert; import cn.hutool.core.util.StrUtil; import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.module.iot.controller.admin.device.vo.modbus.IotDeviceModbusConfigSaveReqVO; import cn.iocoder.yudao.module.iot.core.biz.dto.IotModbusDeviceConfigListReqDTO; import cn.iocoder.yudao.module.iot.core.enums.IotProtocolTypeEnum; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceModbusConfigDO; import cn.iocoder.yudao.module.iot.dal.dataobject.device.IotDeviceDO; import cn.iocoder.yudao.module.iot.dal.dataobject.product.IotProductDO; import cn.iocoder.yudao.module.iot.dal.mysql.device.IotDeviceModbusConfigMapper; import cn.iocoder.yudao.module.iot.service.product.IotProductService; import jakarta.annotation.Resource; import org.springframework.stereotype.Service; import org.springframework.validation.annotation.Validated; import java.util.List; /** * IoT 设备 Modbus 连接配置 Service 实现类 * * @author 芋道源码 */ @Service @Validated public class IotDeviceModbusConfigServiceImpl implements IotDeviceModbusConfigService { @Resource private IotDeviceModbusConfigMapper modbusConfigMapper; @Resource private IotDeviceService deviceService; @Resource private IotProductService productService; @Override public void saveDeviceModbusConfig(IotDeviceModbusConfigSaveReqVO saveReqVO) { // 1.1 校验设备存在 IotDeviceDO device = deviceService.validateDeviceExists(saveReqVO.getDeviceId()); // 1.2 根据产品 protocolType 条件校验 IotProductDO product = productService.getProduct(device.getProductId()); Assert.notNull(product, "产品不存在"); validateModbusConfigByProtocolType(saveReqVO, product.getProtocolType()); // 2. 根据数据库中是否已有配置,决定是新增还是更新 IotDeviceModbusConfigDO existConfig = modbusConfigMapper.selectByDeviceId(saveReqVO.getDeviceId()); if (existConfig == null) { IotDeviceModbusConfigDO modbusConfig = BeanUtils.toBean(saveReqVO, IotDeviceModbusConfigDO.class); modbusConfigMapper.insert(modbusConfig); } else { IotDeviceModbusConfigDO updateObj = BeanUtils.toBean(saveReqVO, IotDeviceModbusConfigDO.class, o -> o.setId(existConfig.getId())); modbusConfigMapper.updateById(updateObj); } } @Override public IotDeviceModbusConfigDO getDeviceModbusConfig(Long id) { return modbusConfigMapper.selectById(id); } @Override public IotDeviceModbusConfigDO getDeviceModbusConfigByDeviceId(Long deviceId) { return modbusConfigMapper.selectByDeviceId(deviceId); } @Override public List getDeviceModbusConfigList(IotModbusDeviceConfigListReqDTO listReqDTO) { return modbusConfigMapper.selectList(listReqDTO); } private void validateModbusConfigByProtocolType(IotDeviceModbusConfigSaveReqVO saveReqVO, String protocolType) { IotProtocolTypeEnum protocolTypeEnum = IotProtocolTypeEnum.of(protocolType); if (protocolTypeEnum == null) { return; } if (protocolTypeEnum == IotProtocolTypeEnum.MODBUS_TCP_CLIENT) { Assert.isTrue(StrUtil.isNotEmpty(saveReqVO.getIp()), "Client 模式下,IP 地址不能为空"); Assert.notNull(saveReqVO.getPort(), "Client 模式下,端口不能为空"); Assert.notNull(saveReqVO.getTimeout(), "Client 模式下,连接超时时间不能为空"); Assert.notNull(saveReqVO.getRetryInterval(), "Client 模式下,重试间隔不能为空"); } else if (protocolTypeEnum == IotProtocolTypeEnum.MODBUS_TCP_SERVER) { Assert.notNull(saveReqVO.getMode(), "Server 模式下,工作模式不能为空"); Assert.notNull(saveReqVO.getFrameFormat(), "Server 模式下,数据帧格式不能为空"); } } }