package com.ruoyi.iot.service; import com.ruoyi.common.utils.NumberUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.iot.constants.ReceiveConstants; import com.ruoyi.iot.domain.IotDeviceDetail; import com.ruoyi.iot.domain.ReceiveMsg; import com.ruoyi.iot.enums.ReceiveType; import com.ruoyi.ss.device.domain.Device; import com.ruoyi.ss.device.domain.enums.DeviceOutageWay; import com.ruoyi.ss.device.service.DeviceService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.math.RoundingMode; /** * @author wjh * 2024/5/6 */ @Service @Slf4j public class IotReceiveServiceImpl implements IotReceiveService{ @Autowired private DeviceService deviceService; @Override public void handleReceive(ReceiveMsg msg) { log.info("handleReceive {}", msg.toString()); // 数据点推送 if (ReceiveType.DATA_POINT.getType().equals(msg.getType())) { if (ReceiveConstants.DS_SSID.equals(msg.getDsId()) && ReceiveConstants.DSV_SSID_CT.equals((String) msg.getValue())) { // 当数据点推送ssid的值为ChangteA时,录入设备 Device device = this.parseToDevice(msg); device.setDeviceName("未命名"); // deviceService.addInitDevice(device); } else { // 其他情况,更新设备信息 deviceService.updateByIot(this.parseToDevice(msg)); } } // 生命周期 else if (ReceiveType.DEVICE_STATUS.getType().equals(msg.getType())) { deviceService.updateByIot(this.parseToDeviceByLife(msg)); } } // 生命周期转设备信息 private Device parseToDeviceByLife(ReceiveMsg msg) { Device device = new Device(); device.setMac(msg.getDevName()); device.setOnlineStatus(IotDeviceDetail.Status.toDeviceOnlineStatus(msg.getStatus()).getStatus()); return device; } // 数据点数据转设备信息 private Device parseToDevice(ReceiveMsg msg) { Device device = new Device(); device.setMac(msg.getDevName()); if (StringUtils.hasText(msg.getDsId())) { String value = msg.getValue().toString(); switch(msg.getDsId()) { case ReceiveConstants.DS_SSID: device.setWifi(value); break; case ReceiveConstants.DS_V: device.setVoltage(NumberUtils.nonNullDecimal(value)); break; case ReceiveConstants.DS_P: device.setRealTimePower(NumberUtils.nonNullDecimal(value)); break; case ReceiveConstants.DS_A: device.setElectricity(NumberUtils.nonNullDecimal(value)); break; case ReceiveConstants.DS_W: device.setTotalElectriQuantity(NumberUtils.nonNullDecimal(value).divide(new BigDecimal(1000), 2, RoundingMode.HALF_UP)); break; case ReceiveConstants.DS_S: device.setPowerStatus(value); break; case ReceiveConstants.DS_SET: DeviceOutageWay deviceOutageWay = DeviceOutageWay.parse(value); device.setOutageWay(deviceOutageWay.getValue()); break; case ReceiveConstants.DS_TIME: device.setRemainTime(NumberUtils.nonNullDecimal(value)); break; default: break; } } return device; } }