From 7590c5db9c84953fc7b33fbac2da6695ca1a5ab1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=A2=A8=E5=A4=A7=E5=8F=94?= <494979559@qq.com> Date: Mon, 20 May 2024 16:04:35 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=BE=E5=A4=87=E5=AF=B9=E6=8E=A5=E3=80=81?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BE=E5=A4=87=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ruoyi/common/constant/IotConstants.java | 3 +- .../com/ruoyi/common/utils/NumberUtils.java | 12 ++- .../ruoyi/iot/constants/ReceiveConstants.java | 18 +++- .../ruoyi/iot/domain/CurrentDeviceData.java | 4 + .../com/ruoyi/iot/domain/IotDeviceInfo.java | 2 + .../iot/service/IotReceiveServiceImpl.java | 53 ++++++++++- .../com/ruoyi/iot/service/IotServiceImpl.java | 2 +- .../com/ruoyi/ss/device/domain/SmDevice.java | 6 +- .../ruoyi/ss/device/domain/SmDeviceBO.java | 2 - .../ruoyi/ss/device/domain/SmDeviceQuery.java | 5 + .../ruoyi/ss/device/domain/vo/SmDeviceVo.java | 6 ++ .../ss/device/mapper/SmDeviceMapper.java | 13 ++- .../ruoyi/ss/device/mapper/SmDeviceMapper.xml | 45 +++++++-- .../ss/device/service/ISmDeviceService.java | 21 ++++- .../service/impl/DeviceValidatorImpl.java | 16 ---- .../service/impl/SmDeviceServiceImpl.java | 93 ++++++++++++++++--- .../ruoyi/ss/store/mapper/StoreMapper.java | 2 +- .../ruoyi/ss/store/service/IStoreService.java | 5 + .../store/service/impl/StoreServiceImpl.java | 10 ++ .../com/ruoyi/ss/suit/mapper/SuitMapper.xml | 2 +- .../impl/TransactionBillServiceImpl.java | 2 +- ...iceStartTask.java => DeviceStartTask.java} | 2 +- .../ruoyi/task/device/DeviceStatusTask.java | 49 ++++++++++ .../controller/app/AppDeviceController.java | 9 +- .../controller/app/AppStoreController.java | 1 - 25 files changed, 317 insertions(+), 66 deletions(-) rename smart-switch-service/src/main/java/com/ruoyi/task/device/{deviceStartTask.java => DeviceStartTask.java} (95%) create mode 100644 smart-switch-service/src/main/java/com/ruoyi/task/device/DeviceStatusTask.java diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java index 37ddd1ff..92b69363 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/constant/IotConstants.java @@ -60,7 +60,7 @@ public class IotConstants { /** * 命令 电量充值 */ - public static final String COMMAND_RECHARGE = "money"; + public static final String COMMAND_RECHARGE = "time"; /** * 命令 设置断电方式 @@ -69,5 +69,4 @@ public class IotConstants { /**----------------------------命令end----------------------------*/ - } diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java index 1ebf875d..1f892c60 100644 --- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java +++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/utils/NumberUtils.java @@ -27,7 +27,11 @@ public class NumberUtils { if (StringUtils.isBlank(value)) { return defaultValue; } - return new BigDecimal(value); + try { + return new BigDecimal(value); + } catch (Exception e) { + return defaultValue; + } } /** @@ -40,7 +44,11 @@ public class NumberUtils { if (StringUtils.isBlank(value)) { return defaultValue; } - return Integer.parseInt(value); + try { + return Integer.parseInt(value); + } catch (Exception e) { + return defaultValue; + } } public static int nonNullInt(String value) { diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/constants/ReceiveConstants.java b/smart-switch-service/src/main/java/com/ruoyi/iot/constants/ReceiveConstants.java index 1f45c4f6..742b43b9 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/constants/ReceiveConstants.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/constants/ReceiveConstants.java @@ -8,8 +8,24 @@ public class ReceiveConstants { // 数据点ID:SSID public static final String DS_SSID = "ssid"; + // 数据点ID:电压 + public static final String DS_V = "V"; + // 数据点ID:电流 + public static final String DS_A = "A"; + // 数据点ID:功率 + public static final String DS_P = "P"; + // 数据点ID:总电量 + public static final String DS_W = "W"; + // 数据点ID:开关状态 + public static final String DS_S = "S"; + // 数据点ID:剩余金额 + public static final String DS_M = "M"; + // 数据点ID:断电方式 + public static final String DS_SET = "SET"; + // 数据点ID:剩余时长(秒) + public static final String DS_TIME = "TIME"; // 数据点ID:SSID的值:创特 - public static final String DSV_SSID_CT = "ChangteA"; + public static final String DSV_SSID_CT = "ChuangteA"; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/CurrentDeviceData.java b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/CurrentDeviceData.java index 721afec3..c259ca5a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/CurrentDeviceData.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/CurrentDeviceData.java @@ -1,5 +1,6 @@ package com.ruoyi.iot.domain; +import com.ruoyi.common.constant.IotConstants; import com.ruoyi.common.utils.NumberUtils; import com.ruoyi.ss.device.domain.enums.DeviceOutageWay; import lombok.Data; @@ -58,6 +59,9 @@ public class CurrentDeviceData { DeviceOutageWay deviceOutageWay = DeviceOutageWay.parse(value); device.setSet(deviceOutageWay.getValue()); break; + case "TIME": + device.setTime(NumberUtils.nonNullDecimal(value)); + break; default: break; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/IotDeviceInfo.java b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/IotDeviceInfo.java index 7b508730..ca3636b2 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/IotDeviceInfo.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/IotDeviceInfo.java @@ -30,6 +30,7 @@ public class IotDeviceInfo { private String s; // 开关状态,0不通电,1闭合通电 private BigDecimal m; // 剩余电量(度) private String set; // 欠费断电方式 + private BigDecimal time; // 剩余时间(秒) public static IotDeviceInfo newDefaultInstance() { return IotDeviceInfo.builder() @@ -40,6 +41,7 @@ public class IotDeviceInfo { .s("0") .m(BigDecimal.ZERO) .set(DeviceOutageWay.IMMEDIATE.getValue()) + .time(BigDecimal.ZERO) .build(); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotReceiveServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotReceiveServiceImpl.java index 13af1775..8fce9cca 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotReceiveServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotReceiveServiceImpl.java @@ -1,13 +1,20 @@ package com.ruoyi.iot.service; +import com.ruoyi.common.constant.IotConstants; +import com.ruoyi.common.utils.NumberUtils; +import com.ruoyi.common.utils.StringUtils; import com.ruoyi.iot.constants.ReceiveConstants; import com.ruoyi.iot.domain.ReceiveMsg; import com.ruoyi.iot.enums.ReceiveType; import com.ruoyi.ss.device.domain.SmDevice; +import com.ruoyi.ss.device.domain.enums.DeviceOutageWay; import com.ruoyi.ss.device.service.ISmDeviceService; 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 @@ -23,17 +30,55 @@ public class IotReceiveServiceImpl implements IotReceiveService{ public void handleReceive(ReceiveMsg msg) { log.info("handleReceive {}", msg.toString()); if (ReceiveType.DATA_POINT.getType().equals(msg.getType()) - && ReceiveConstants.DS_SSID.equals(msg.getDsId()) - && ReceiveConstants.DSV_SSID_CT.equals((String) msg.getValue()) ) { - // 当数据点推送ssid的值为ChangteA时,录入设备 - deviceService.addInitDevice(this.parseToDevice(msg)); + if (ReceiveConstants.DS_SSID.equals(msg.getDsId()) + && ReceiveConstants.DSV_SSID_CT.equals((String) msg.getValue())) { + // 当数据点推送ssid的值为ChangteA时,录入设备 + deviceService.addInitDevice(this.parseToDevice(msg)); + } else { + // 其他情况,更新设备信息 + deviceService.updateByIot(this.parseToDevice(msg)); + } } } private SmDevice parseToDevice(ReceiveMsg msg) { SmDevice device = new SmDevice(); 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; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotServiceImpl.java index 0e203e6c..474f7790 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotServiceImpl.java +++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotServiceImpl.java @@ -180,7 +180,7 @@ public class IotServiceImpl implements IotService { log.error("充值设备参数错误:读数不允许为空或者小于0"); return false; } - CommandResponse response = sendCommand(deviceName, IotConstants.COMMAND_RECHARGE + num.multiply(new BigDecimal(1000)) + IotConstants.COMMAND_SEPARATOR); + CommandResponse response = sendCommand(deviceName, IotConstants.COMMAND_RECHARGE + num.multiply(new BigDecimal(60)) + IotConstants.COMMAND_SEPARATOR); if (!Objects.equals(HttpStatus.IOT_SUCCESS, response.getCode())) { log.error("充值设备发生异常:" + response.getMsg()); return false; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java index 65ded40c..7b4b3d1a 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDevice.java @@ -139,10 +139,6 @@ public class SmDevice extends BaseEntity @JsonView(DeviceView.SuitList.class) private LocalDateTime expireTime; - @ApiModelProperty("所属用户ID") - @NotNull(message = "用户不允许为空", groups = {ValidGroup.Create.class}) - private Long userId; - @ApiModelProperty("用户自定义图片") private String customPicture; @@ -150,4 +146,6 @@ public class SmDevice extends BaseEntity @Range(min = 0, max = 100, message = "服务费费率必须在0-100之间") private BigDecimal serviceRate; + @ApiModelProperty("剩余时长(秒)") + private BigDecimal remainTime; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceBO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceBO.java index 581f14c1..be74c5c4 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceBO.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceBO.java @@ -19,7 +19,6 @@ public class SmDeviceBO extends SmDevice { bo.setDeviceName(getDeviceName()); bo.setModelId(getModelId()); bo.setMac(getMac()); - bo.setUserId(getUserId()); bo.setServiceRate(getServiceRate()); return bo; } @@ -34,7 +33,6 @@ public class SmDeviceBO extends SmDevice { bo.setStoreId(getStoreId()); bo.setDeviceName(getDeviceName()); bo.setModelId(getModelId()); - bo.setUserId(getUserId()); bo.setServiceRate(getServiceRate()); return bo; } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceQuery.java index 488cd15f..64420eaf 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceQuery.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/SmDeviceQuery.java @@ -1,11 +1,13 @@ package com.ruoyi.ss.device.domain; +import com.ruoyi.common.core.domain.ValidGroup; import com.ruoyi.common.valid.EnumValid; import com.ruoyi.ss.device.domain.enums.DeviceGroupBy; import com.ruoyi.ss.device.domain.enums.DeviceGroupByTable; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; import java.util.List; /** @@ -18,6 +20,9 @@ public class SmDeviceQuery extends SmDevice { @ApiModelProperty("设备id列表") private List deviceIds; + @ApiModelProperty("所属用户ID") + private Long userId; + @ApiModelProperty("型号列表") private List modelIds; diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java index 52546a21..d361076b 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/domain/vo/SmDeviceVo.java @@ -3,12 +3,14 @@ package com.ruoyi.ss.device.domain.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonView; import com.ruoyi.common.core.domain.JsonViewProfile; +import com.ruoyi.common.core.domain.ValidGroup; import com.ruoyi.ss.device.domain.DeviceView; import com.ruoyi.ss.device.domain.SmDevice; import com.ruoyi.ss.suit.domain.SuitVo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; +import javax.validation.constraints.NotNull; import java.math.BigDecimal; import java.time.LocalTime; import java.util.List; @@ -22,6 +24,10 @@ public class SmDeviceVo extends SmDevice { @ApiModelProperty("是否默认") private Boolean isDefault; // 是否默认 + @ApiModelProperty("所属用户ID") + @NotNull(message = "用户不允许为空", groups = {ValidGroup.Create.class}) + private Long userId; + @ApiModelProperty("租户id列表") private List tenantIds; // 租户id列表 diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java index 3e09cb4d..d7dc8b6b 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.java @@ -144,5 +144,16 @@ public interface SmDeviceMapper /** * 通过用户id修改服务费率 */ - int updateServiceRateByUserId(@Param("userId") Long userId, @Param("serviceRate") BigDecimal serviceRate); + int updateServiceRateByStores(@Param("storeIds") List storeIds, @Param("serviceRate") BigDecimal serviceRate); + + /** + * 根据MAC修改数据 + * @param smDevice + */ + int updateSmDeviceByIot(SmDevice smDevice); + + /** + * 设备超时修改状态 + */ + int changeTimeoutStatus(@Param("deviceId") Long deviceId); } diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml index f8f38389..f833e126 100644 --- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml +++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/mapper/SmDeviceMapper.xml @@ -19,7 +19,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" and sd.status = #{status} and su.user_name like concat('%', #{userName}, '%') and sd.nick_name like concat('%', #{nickName}, '%') - and sd.user_id = #{userId} + and ss.user_id = #{userId} and sd.store_id = #{storeId} and sd.device_id = #{deviceId} and sd.device_no like concat('%', #{deviceNo}, '%') @@ -50,7 +50,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - and sd.user_id in + and ss.user_id in #{item} @@ -70,7 +70,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" from sm_device sd left join sm_model sm on sm.model_id = sd.model_id left join sm_store ss on ss.store_id = sd.store_id - left join sm_user su on su.user_id = sd.user_id + left join sm_user su on su.user_id = ss.user_id