2026-06-30 24681c81c09022f584a57006f2534b5f74723414
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
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<IotDeviceModbusConfigDO> 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 模式下,数据帧格式不能为空");
        }
    }
 
}