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 c259ca5a..322548eb 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
@@ -36,6 +36,8 @@ public class CurrentDeviceData {
 
         for (CurrentDatastream stream : datastreams) {
             String value = stream.getValue().toString();
+            device.setAt(stream.getAt());
+
             switch (stream.getId()) {
                 case "V":
                     device.setV(NumberUtils.nonNullDecimal(value));
@@ -62,6 +64,9 @@ public class CurrentDeviceData {
                 case "TIME":
                     device.setTime(NumberUtils.nonNullDecimal(value));
                     break;
+                case "FW":
+                    device.setModel(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 ca3636b2..857afe6b 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
@@ -31,6 +31,7 @@ public class IotDeviceInfo {
     private BigDecimal m;   // 剩余电量(度)
     private String set; // 欠费断电方式
     private BigDecimal time;   // 剩余时间(秒)
+    private String model;
 
     public static IotDeviceInfo newDefaultInstance() {
         return IotDeviceInfo.builder()
@@ -42,6 +43,7 @@ public class IotDeviceInfo {
                 .m(BigDecimal.ZERO)
                 .set(DeviceOutageWay.IMMEDIATE.getValue())
                 .time(BigDecimal.ZERO)
+                .model(null)
                 .build();
     }
 
diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/CommandResponse.java b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/CommandResponse.java
index cc203448..c8b6fb7d 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/CommandResponse.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/iot/domain/response/CommandResponse.java
@@ -1,7 +1,10 @@
 package com.ruoyi.iot.domain.response;
 
+import com.ruoyi.common.constant.HttpStatus;
 import lombok.Data;
 
+import java.util.Objects;
+
 /**
  * 命令下发响应
  * @author wjh
@@ -12,4 +15,9 @@ public class CommandResponse extends BaseResponse {
     private Object data;
     private String cmdUuid;
     private String cmdResp;
+
+    public boolean isSuccess() {
+        return Objects.equals(HttpStatus.IOT_SUCCESS, this.getCode());
+    }
+
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java
index 6150f43d..945fade8 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/iot/service/IotService.java
@@ -76,7 +76,7 @@ public interface IotService {
      * @param deviceName 设备名称
      * @param seconds    时长(秒)
      */
-    boolean setTime(String deviceName, BigDecimal seconds);
+    CommandResponse setTime(String deviceName, BigDecimal seconds);
 
     /**
      * 更新设备信息
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 79a294bd..0578b25f 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
@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON;
 import com.alibaba.fastjson2.JSONObject;
 import com.ruoyi.common.constant.HttpStatus;
 import com.ruoyi.common.constant.IotConstants;
+import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.ServiceUtil;
 import com.ruoyi.common.utils.StringUtils;
 import com.ruoyi.common.utils.http.HttpUtils;
@@ -182,17 +183,11 @@ public class IotServiceImpl implements IotService {
      */
     @Override
     @Transactional
-    public boolean setTime(String deviceName, BigDecimal seconds) {
+    public CommandResponse setTime(String deviceName, BigDecimal seconds) {
         if (seconds == null || BigDecimal.ZERO.compareTo(seconds) > 0) {
-            log.error("设置剩余时长参数错误:读数不允许为空或者小于0");
-            return false;
+            throw new ServiceException("设置剩余时长参数错误:读数不允许为空或者小于0");
         }
-        CommandResponse response = sendCommand(deviceName, IotConstants.COMMAND_RECHARGE + seconds + IotConstants.COMMAND_SEPARATOR);
-        if (!Objects.equals(HttpStatus.IOT_SUCCESS, response.getCode())) {
-            log.error("设置剩余时长发生异常:" + response.getMsg());
-            return false;
-        }
-        return true;
+        return sendCommand(deviceName, IotConstants.COMMAND_RECHARGE + seconds + IotConstants.COMMAND_SEPARATOR);
     }
 
     /**
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 b8f974ff..0e78ee2e 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
@@ -128,6 +128,7 @@ public class SmDevice extends BaseEntity
 
     @ApiModelProperty("上次拉取设备信息的时间")
     @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date lastPullTime;
 
     @ApiModelProperty("总电量初始读数")
@@ -141,6 +142,7 @@ public class SmDevice extends BaseEntity
     private LocalDateTime expireTime;
 
     @ApiModelProperty("用户自定义图片")
+    @JsonView(JsonViewProfile.App.class)
     private String customPicture;
 
     @ApiModelProperty("服务费费率")
@@ -149,4 +151,7 @@ public class SmDevice extends BaseEntity
 
     @ApiModelProperty("剩余时长(秒)")
     private BigDecimal remainTime;
+
+    @ApiModelProperty("所属用户ID")
+    private Long userId;
 }
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 d361076b..e7a3bd86 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
@@ -24,10 +24,6 @@ public class SmDeviceVo extends SmDevice {
     @ApiModelProperty("是否默认")
     private Boolean isDefault;    // 是否默认
 
-    @ApiModelProperty("所属用户ID")
-    @NotNull(message = "用户不允许为空", groups = {ValidGroup.Create.class})
-    private Long userId;
-
     @ApiModelProperty("租户id列表")
     private List<Long> tenantIds;   // 租户id列表
 
@@ -37,9 +33,14 @@ public class SmDeviceVo extends SmDevice {
     @ApiModelProperty("型号")
     private String model;
 
-    @ApiModelProperty("商户名称")
+    @ApiModelProperty("所属用户名称")
+    @JsonView(DeviceView.SuitList.class)
     private String userName;
 
+    @ApiModelProperty("用户电话")
+    @JsonView(DeviceView.SuitList.class)
+    private String userMobile;
+
     @ApiModelProperty("图片")
     @JsonView(JsonViewProfile.App.class)
     private String picture;
@@ -66,4 +67,13 @@ public class SmDeviceVo extends SmDevice {
 
     @ApiModelProperty("订单总金额")
     private BigDecimal orderAmount;
+
+    @ApiModelProperty("店铺联系人名称")
+    @JsonView(DeviceView.SuitList.class)
+    private String storeContactName;
+
+    @ApiModelProperty("店铺联系人电话")
+    @JsonView(DeviceView.SuitList.class)
+    private String storeContactMobile;
+
 }
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 90848c7c..8041eb7a 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
@@ -95,7 +95,7 @@ public interface SmDeviceMapper
      * @param deviceId 设备id
      * @param storeId 店铺id
      */
-    int bindStore(@Param("deviceId") Long deviceId, @Param("storeId") Long storeId);
+    int bindStore(@Param("deviceId") Long deviceId, @Param("storeId") Long storeId, @Param("userId") Long userId);
 
     /**
      * 解绑商户
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 61201c35..1dd90666 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
@@ -90,16 +90,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             sd.custom_picture,
             sd.service_rate,
             sd.remain_time,
+            sd.user_id,
             sm.model_name as model,
             sm.picture as picture,
             sm.tags as  model_tags,
-            ss.user_id as user_id,
             ss.name as store_name,
+            ss.contact_name as store_contact_name,
+            ss.contact_mobile as store_contact_mobile,
+            su.phonenumber as user_mobile,
             su.user_name as user_name
         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 = ss.user_id
+            left join sm_user su on su.user_id = sd.user_id
     </sql>
 
     <select id="selectSmDeviceList" parameterType="SmDeviceQuery" resultMap="SmDeviceResult">
@@ -225,6 +228,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="customPicture != null">custom_picture,</if>
             <if test="serviceRate != null">service_rate,</if>
             <if test="remainTime != null">remain_time,</if>
+            <if test="userId != null">user_id,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="storeId != null">#{storeId},</if>
@@ -254,13 +258,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="customPicture != null">#{customPicture},</if>
             <if test="serviceRate != null">#{serviceRate},</if>
             <if test="remainTime != null">#{remainTime},</if>
+            <if test="userId != null">#{userId},</if>
          </trim>
     </insert>
 
     <update id="addTime">
         update sm_device
         set expire_time = IF (
-            expire_time is null or now() > expire_time,
+            (expire_time is null) or (now() > expire_time),
             DATE_ADD(now(),INTERVAL #{num} MINUTE),
             DATE_ADD(expire_time,INTERVAL #{num} MINUTE)
         )
@@ -304,6 +309,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="customPicture != null">custom_picture = #{customPicture},</if>
             <if test="serviceRate != null">service_rate = #{serviceRate},</if>
             <if test="remainTime != null">remain_time = #{remainTime},</if>
+            <if test="userId != null">user_id = #{userId},</if>
         </trim>
         where device_id = #{deviceId}
     </update>
@@ -319,13 +325,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <update id="bindStore">
         update sm_device
-        set store_id = #{storeId}
-        where device_id = #{deviceId} and store_id is null
+        set store_id = #{storeId},
+            user_id = #{userId}
+        where device_id = #{deviceId} and user_id is null
     </update>
 
     <update id="unbindStore">
         update sm_device
-        set store_id = null
+        set store_id = null,
+            user_id = null
         where device_id = #{deviceId}
     </update>
 
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java
index d5f71eb5..d44bf220 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/ISmDeviceService.java
@@ -74,10 +74,12 @@ public interface ISmDeviceService
 
     /**
      * 增加时间
+     *
      * @param deviceId 设备id
-     * @param num 电量
+     * @param num      电量
+     * @param withIot
      */
-    boolean addTime(Long deviceId, BigDecimal num);
+    boolean addTime(Long deviceId, BigDecimal num, boolean withIot);
 
     /**
      * 逻辑删除
@@ -105,15 +107,17 @@ public interface ISmDeviceService
 
     /**
      * 通过SN绑定设备
-     * @param storeId 店铺ID
+     *
+     * @param storeId  店铺ID
+     * @param userId
      * @param deviceNo 设备编号(SN)
      */
-    String bindBySn(Long storeId, String deviceNo);
+    String bindBySn(Long storeId, Long userId, String deviceNo);
 
     /**
      * 通过MAC绑定设备
      */
-    String bindByMac(Long storeId, String mac);
+    String bindByMac(Long storeId, Long userId, String mac);
 
     /**
      * 商户解绑设备
@@ -210,4 +214,6 @@ public interface ISmDeviceService
      * 设备心跳,用于检测是否在线
      */
     void deviceHeartBeat();
+
+    boolean addTimeByUser(Long deviceId, BigDecimal amount, boolean b, String reason);
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java
index 7e4c161b..0637aff9 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/SmDeviceServiceImpl.java
@@ -1,10 +1,12 @@
 package com.ruoyi.ss.device.service.impl;
 
+import com.ruoyi.common.core.domain.model.LoginUser;
 import com.ruoyi.common.enums.LoginType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.*;
 import com.ruoyi.common.utils.collection.CollectionUtils;
 import com.ruoyi.iot.domain.IotDeviceInfo;
+import com.ruoyi.iot.domain.response.CommandResponse;
 import com.ruoyi.iot.service.IotService;
 import com.ruoyi.ss.device.domain.SmDevice;
 import com.ruoyi.ss.device.domain.SmDeviceCountVO;
@@ -17,14 +19,19 @@ import com.ruoyi.ss.device.mapper.SmDeviceMapper;
 import com.ruoyi.ss.device.service.DeviceAssembler;
 import com.ruoyi.ss.device.service.ISmDeviceService;
 import com.ruoyi.ss.deviceBindRecord.service.ISmDeviceBindRecordService;
+import com.ruoyi.ss.model.domain.SmModelVo;
+import com.ruoyi.ss.model.service.ISmModelService;
+import com.ruoyi.ss.record.time.service.IRecordTimeService;
+import com.ruoyi.ss.record.time.service.RecordTimeConverter;
 import com.ruoyi.ss.resetRecord.domain.SmResetRecord;
 import com.ruoyi.ss.resetRecord.service.ISmResetRecordService;
 import com.ruoyi.ss.store.domain.StoreVo;
 import com.ruoyi.ss.store.service.IStoreService;
+import com.ruoyi.ss.user.domain.SmUserVo;
+import com.ruoyi.ss.user.service.ISmUserService;
 import lombok.SneakyThrows;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
@@ -73,8 +80,17 @@ public class SmDeviceServiceImpl implements ISmDeviceService
     @Autowired
     private IStoreService storeService;
 
-    @Value("${debug}")
-    private Boolean debug;
+    @Autowired
+    private IRecordTimeService recordTimeService;
+
+    @Autowired
+    private RecordTimeConverter recordTimeConverter;
+
+    @Autowired
+    private ISmModelService smModelService;
+
+    @Autowired
+    private ISmUserService userService;
 
     /**
      * 查询设备
@@ -216,9 +232,25 @@ public class SmDeviceServiceImpl implements ISmDeviceService
         return smDeviceMapper.selectSmDeviceList(dto);
     }
 
+
     @Override
     @Transactional(propagation = Propagation.REQUIRES_NEW)
-    public boolean addTime(Long deviceId, BigDecimal num) {
+    public boolean addTimeByUser(Long deviceId, BigDecimal amount, boolean withIot, String reason) {
+        boolean b = this.addTime(deviceId, amount, withIot);
+
+        // 记录下操作日志
+        LoginUser loginUser = SecurityUtils.getLoginUser();
+        scheduledExecutorService.schedule(() -> {
+            SmDeviceVo device = smDeviceMapper.selectSmDeviceByDeviceId(deviceId);
+            recordTimeService.insertRecordTime(recordTimeConverter.toRecordTime(device, amount, reason, loginUser));
+        }, 0, TimeUnit.SECONDS);
+
+        return b;
+    }
+
+    @Override
+    @Transactional(propagation = Propagation.REQUIRES_NEW)
+    public boolean addTime(Long deviceId, BigDecimal num, boolean withIot) {
         ServiceUtil.assertion(num.compareTo(BigDecimal.ZERO) < 0, "增加的时长不允许小于0");
 
         SmDeviceVo device = smDeviceMapper.selectSmDeviceByDeviceId(deviceId);
@@ -234,11 +266,13 @@ public class SmDeviceServiceImpl implements ISmDeviceService
         changeStatus(deviceId, DeviceStatus.USING);
 
         // 物联网设备增加时长
-        SmDeviceVo newDevice = selectSmDeviceByDeviceId(deviceId);
-        long seconds = Duration.between(LocalDateTime.now(), newDevice.getExpireTime()).getSeconds();
-        if (seconds > 0) {
-            boolean rechargeResult = iotService.setTime(device.getMac(), new BigDecimal(seconds));
-            ServiceUtil.assertion(!rechargeResult, "设备充值失败,请检查设备是否在线或联系管理员");
+        if (withIot) {
+            SmDeviceVo newDevice = selectSmDeviceByDeviceId(deviceId);
+            long seconds = Duration.between(LocalDateTime.now(), newDevice.getExpireTime()).getSeconds();
+            if (seconds > 0) {
+                CommandResponse rechargeResult = iotService.setTime(device.getMac(), new BigDecimal(seconds));
+                ServiceUtil.assertion(!rechargeResult.isSuccess(), "设备充值失败,请检查设备是否在线或联系管理员");
+            }
         }
 
         // 拉取设备信息
@@ -252,6 +286,7 @@ public class SmDeviceServiceImpl implements ISmDeviceService
         return true;
     }
 
+
     private void freshStatus(Long deviceId) {
         SmDeviceVo device = smDeviceMapper.selectSmDeviceByDeviceId(deviceId);
         freshStatus(device);
@@ -305,6 +340,7 @@ public class SmDeviceServiceImpl implements ISmDeviceService
         log.info("update count: {}", i);
     }
 
+
     private int changeStatus(Long deviceId, DeviceStatus status) {
         SmDevice device = new SmDevice();
         device.setDeviceId(deviceId);
@@ -424,36 +460,54 @@ public class SmDeviceServiceImpl implements ISmDeviceService
 
     @Override
     @Transactional
-    public String bindBySn(Long storeId, String deviceNo) {
+    public String bindBySn(Long storeId, Long userId, String deviceNo) {
         SmDeviceVo device = selectByDeviceNo(deviceNo);
-        return this.bind(storeId, device);
+        return this.bindStore(storeId, userId, device);
     }
 
     @Override
-    public String bindByMac(Long storeId, String mac) {
+    public String bindByMac(Long storeId, Long userId, String mac) {
         SmDeviceVo device = selectByMac(mac);
-        return this.bind(storeId, device);
+        return this.bindStore(storeId, userId, device);
     }
 
-    private String bind(Long storeId, SmDeviceVo device) {
-        // 如果绑定的店铺是原来的店铺,则直接返回MAC
-        if (device.getStoreId() != null && device.getStoreId().equals(storeId)) {
-            return device.getMac();
-        }
+    private String bindStore(Long storeId, Long userId, SmDeviceVo device) {
         ServiceUtil.assertion(device == null, "设备未录入");
-        ServiceUtil.assertion(device.getStoreId() != null, "该设备已被绑定");
+        // 如果绑定的用户是原来的用户,则直接返回MAC
+        if (device.getUserId() != null) {
+            if (Objects.equals(device.getUserId(), userId)) {
+                return device.getMac();
+            } else {
+                throw new ServiceException("该设备已被绑定");
+            }
+        }
+        // 如果绑定的是原来的店铺,则直接返回MAC
+        if (device.getStoreId() != null) {
+            if (Objects.equals(device.getStoreId(), storeId)) {
+                return device.getMac();
+            } else {
+                throw new ServiceException("该设备已被绑定");
+            }
+        }
+
+        // 查询用户
+        SmUserVo user = userService.selectSimpleById(userId);
+        ServiceUtil.assertion(user == null, "用户不存在");
 
         // 查询店铺
-        StoreVo store = storeService.selectSmStoreById(storeId);
-        ServiceUtil.assertion(store == null, "店铺不存在");
+        if (storeId != null) {
+            StoreVo store = storeService.selectSmStoreById(storeId);
+            ServiceUtil.assertion(store == null, "店铺不存在");
+            ServiceUtil.assertion(!Objects.equals(store.getUserId(), userId), "该店铺不属于该用户");
+        }
 
-        // 绑定店铺
-        int updateCount = smDeviceMapper.bindStore(device.getDeviceId(), storeId);
+        // 绑定
+        int updateCount = smDeviceMapper.bindStore(device.getDeviceId(), storeId, userId);
         ServiceUtil.assertion(updateCount != 1, "当前设备信息已变更,请刷新后重试");
 
         // 记录设备绑定
         scheduledExecutorService.schedule(() -> {
-            smDeviceBindRecordService.record(store.getUserId(), device.getDeviceId());
+            smDeviceBindRecordService.record(userId, device.getDeviceId());
         }, 0, TimeUnit.SECONDS);
 
         return device.getMac();
@@ -487,7 +541,6 @@ public class SmDeviceServiceImpl implements ISmDeviceService
         SmDeviceVo device = smDeviceMapper.selectSmDeviceByDeviceId(deviceId);
         ServiceUtil.assertion(device == null || device.getDeleted(), "设备不存在");
         ServiceUtil.assertion(!UserUtil.hasFrontUser(device.getUserId()), "您不是该设备的商户,无法进行该操作");
-        ServiceUtil.assertion(device.getExpireTime() == null || device.getExpireTime().isBefore(now), "设备剩余时间不足,无需归零");
 
         // 归零时间,将过期时间设置为现在
         SmDevice form = new SmDevice();
@@ -497,8 +550,8 @@ public class SmDeviceServiceImpl implements ISmDeviceService
         smDeviceMapper.updateSmDevice(form);
 
         // 物联网设备归零
-        boolean b = iotService.setTime(device.getMac(), BigDecimal.ONE);
-        ServiceUtil.assertion(!b, "操作设备发生异常");
+        CommandResponse commandResponse = iotService.setTime(device.getMac(), BigDecimal.ONE);
+        ServiceUtil.assertion(!commandResponse.isSuccess(), "设备归零失败,请检查设备是否在线或联系管理员");
 
         // 归零记录
         scheduledExecutorService.schedule(() -> {
@@ -525,7 +578,7 @@ public class SmDeviceServiceImpl implements ISmDeviceService
             return false;
         }
         SmDeviceVo device = smDeviceMapper.selectSimpleSmDeviceByMac(mac);
-        return device != null && device.getStoreId() != null;
+        return device != null && device.getUserId() != null;
     }
 
     /**
@@ -540,7 +593,7 @@ public class SmDeviceServiceImpl implements ISmDeviceService
             return false;
         }
         SmDeviceVo device = smDeviceMapper.selectSimpleSmDeviceBySn(deviceNo);
-        return device != null && device.getStoreId() != null;
+        return device != null && device.getUserId() != null;
     }
 
     /**
@@ -656,14 +709,45 @@ public class SmDeviceServiceImpl implements ISmDeviceService
             return 0;
         }
         try {
+
+            // 查询设备是否存在,存在则忽略
+            SmDeviceVo device = selectByMac(smDevice.getMac());
+            if (device != null) {
+                return 0;
+            }
+
+            // 查询设备的型号
+            IotDeviceInfo deviceInfo = iotService.getDeviceInfo(smDevice.getMac());
+            if (deviceInfo == null) {
+                log.info("iot device info is null");
+                return 0;
+            }
+            log.info("select model in:{}", deviceInfo.getModel());
+            SmModelVo model = smModelService.selectByIotModel(deviceInfo.getModel());
+
             Integer result = transactionTemplate.execute(status -> {
+                SmModelVo finalModel = model;
+
+                // 如果设备型号为空,则添加新的设备型号
+                if (finalModel == null) {
+                    log.info("model is null");
+                    int addModel = smModelService.addInitModel(deviceInfo);
+                    ServiceUtil.assertion(addModel != 1, "添加设备型号失败");
+                    finalModel = smModelService.selectByIotModel(deviceInfo.getModel());
+                }
+
+                // 添加设备
                 SmDeviceVo byMac = selectByMac(smDevice.getMac());
                 if (byMac == null) {
+                    smDevice.setModelId(finalModel.getModelId());
                     smDevice.setCreateTime(DateUtils.getNowDate());
-                    return smDeviceMapper.insertSmDevice(smDevice);
+                    int i = smDeviceMapper.insertSmDevice(smDevice);    // 添加设备
+                    this.pullDeviceInfo(Collections.singletonList(smDevice.getDeviceId())); // 拉取设备信息
+                    return i;
                 }
                 return 0;
             });
+
             return result == null ? 0 : result;
         } catch (Exception e) {
             log.error("add init device error: {}", e.getMessage());
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/ISmModelService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/ISmModelService.java
index ee13ce14..98a5a51e 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/ISmModelService.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/ISmModelService.java
@@ -1,6 +1,7 @@
 package com.ruoyi.ss.model.service;
 
 
+import com.ruoyi.iot.domain.IotDeviceInfo;
 import com.ruoyi.ss.model.domain.SmModelBO;
 import com.ruoyi.ss.model.domain.SmModelQuery;
 import com.ruoyi.ss.model.domain.SmModelVo;
@@ -74,4 +75,15 @@ public interface ISmModelService
      * 逻辑删除
      */
     int logicDelete(List<Long> modelIds);
+
+    /**
+     * 根据物联网的型号查询数据
+     */
+    SmModelVo selectByIotModel(String model);
+
+    /**
+     * 创建初始型号
+     */
+    int addInitModel(IotDeviceInfo deviceInfo);
+
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/impl/SmModelServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/impl/SmModelServiceImpl.java
index 20687eb3..261ecb3d 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/impl/SmModelServiceImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/model/service/impl/SmModelServiceImpl.java
@@ -2,8 +2,11 @@ package com.ruoyi.ss.model.service.impl;
 
 import com.ruoyi.common.utils.DateUtils;
 import com.ruoyi.common.utils.ServiceUtil;
+import com.ruoyi.common.utils.StringUtils;
+import com.ruoyi.iot.domain.IotDeviceInfo;
 import com.ruoyi.ss.device.domain.vo.SmDeviceVo;
 import com.ruoyi.ss.device.service.ISmDeviceService;
+import com.ruoyi.ss.model.domain.SmModel;
 import com.ruoyi.ss.model.domain.SmModelBO;
 import com.ruoyi.ss.model.domain.SmModelQuery;
 import com.ruoyi.ss.model.domain.SmModelVo;
@@ -118,6 +121,31 @@ public class SmModelServiceImpl implements ISmModelService
         return smModelMapper.logicDeleteByIds(modelIds);
     }
 
+    @Override
+    public SmModelVo selectByIotModel(String model) {
+        if (!StringUtils.hasText(model)) {
+            return null;
+        }
+        SmModelQuery query = new SmModelQuery();
+        query.setModel(model);
+        List<SmModelVo> list = smModelMapper.selectSmModelList(query);
+        if (CollectionUtils.isEmpty(list)) {
+            return null;
+        }
+        return list.get(0);
+    }
+
+    @Override
+    public int addInitModel(IotDeviceInfo deviceInfo) {
+        if (deviceInfo == null) {
+            return 0;
+        }
+        SmModel data = new SmModel();
+        data.setModelName("未命名");
+        data.setModel(deviceInfo.getModel());
+        return smModelMapper.insertSmModel(data);
+    }
+
     /**
      * 逻辑删除前校验
      */
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTime.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTime.java
new file mode 100644
index 00000000..c6ecab86
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTime.java
@@ -0,0 +1,55 @@
+package com.ruoyi.ss.record.time.domain;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.ruoyi.common.annotation.Excel;
+import com.ruoyi.common.core.domain.BaseEntity;
+
+/**
+ * 设备时长变化记录对象 ss_record_time
+ *
+ * @author ruoyi
+ * @date 2024-06-06
+ */
+@Data
+public class RecordTime extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** 记录id */
+    private Long id;
+
+    /** 设备id */
+    @Excel(name = "设备id")
+    private Long deviceId;
+
+    /** 时长变化量(分钟) */
+    @Excel(name = "时长变化量", readConverterExp = "分=钟")
+    private BigDecimal amount;
+
+    /** 变化原因 */
+    @Excel(name = "变化原因")
+    private String reason;
+
+    /** 操作人id */
+    @Excel(name = "操作人id")
+    private Long operatorId;
+
+    /** 操作人名称 */
+    @Excel(name = "操作人名称")
+    private String operatorName;
+
+    /** 操作人类型 */
+    @Excel(name = "操作人类型")
+    private String operatorType;
+
+    /** 操作时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private LocalDateTime operatorTime;
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTimeQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTimeQuery.java
new file mode 100644
index 00000000..dee317f8
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTimeQuery.java
@@ -0,0 +1,14 @@
+package com.ruoyi.ss.record.time.domain;
+
+import lombok.Data;
+
+/**
+ * @author wjh
+ * 2024/6/6
+ */
+@Data
+public class RecordTimeQuery extends RecordTime {
+
+
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTimeVO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTimeVO.java
new file mode 100644
index 00000000..78bc6445
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/RecordTimeVO.java
@@ -0,0 +1,12 @@
+package com.ruoyi.ss.record.time.domain;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author wjh
+ * 2024/6/6
+ */
+@Data
+public class RecordTimeVO extends RecordTime {
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/enums/OperatorType.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/enums/OperatorType.java
new file mode 100644
index 00000000..a01f05fa
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/domain/enums/OperatorType.java
@@ -0,0 +1,31 @@
+package com.ruoyi.ss.record.time.domain.enums;
+
+import com.ruoyi.common.enums.LoginType;
+import com.ruoyi.common.exception.ServiceException;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * @author wjh
+ * 2024/6/6
+ */
+@Getter
+@AllArgsConstructor
+public enum OperatorType {
+
+    ADMIN("1", LoginType.ADMIN),
+    USER("2", LoginType.FRONT);
+
+    private final String type;
+    private final LoginType loginType;
+
+    public static OperatorType parse(LoginType type) {
+        for (OperatorType operatorType : values()) {
+            if (operatorType.getLoginType().equals(type)) {
+                return operatorType;
+            }
+        }
+        throw new ServiceException("不存在该枚举值");
+    }
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/mapper/RecordTimeMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/mapper/RecordTimeMapper.java
new file mode 100644
index 00000000..df8a5461
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/mapper/RecordTimeMapper.java
@@ -0,0 +1,63 @@
+package com.ruoyi.ss.record.time.mapper;
+
+import java.util.List;
+import com.ruoyi.ss.record.time.domain.RecordTime;
+import com.ruoyi.ss.record.time.domain.RecordTimeQuery;
+import com.ruoyi.ss.record.time.domain.RecordTimeVO;
+
+/**
+ * 设备时长变化记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2024-06-06
+ */
+public interface RecordTimeMapper
+{
+    /**
+     * 查询设备时长变化记录
+     *
+     * @param id 设备时长变化记录主键
+     * @return 设备时长变化记录
+     */
+    public RecordTimeVO selectRecordTimeById(Long id);
+
+    /**
+     * 查询设备时长变化记录列表
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 设备时长变化记录集合
+     */
+    public List<RecordTimeVO> selectRecordTimeList(RecordTimeQuery recordTime);
+
+    /**
+     * 新增设备时长变化记录
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 结果
+     */
+    public int insertRecordTime(RecordTime recordTime);
+
+    /**
+     * 修改设备时长变化记录
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 结果
+     */
+    public int updateRecordTime(RecordTime recordTime);
+
+    /**
+     * 删除设备时长变化记录
+     *
+     * @param id 设备时长变化记录主键
+     * @return 结果
+     */
+    public int deleteRecordTimeById(Long id);
+
+    /**
+     * 批量删除设备时长变化记录
+     *
+     * @param ids 需要删除的数据主键集合
+     * @return 结果
+     */
+    public int deleteRecordTimeByIds(Long[] ids);
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/mapper/RecordTimeMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/mapper/RecordTimeMapper.xml
new file mode 100644
index 00000000..fdb13d7f
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/mapper/RecordTimeMapper.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.ruoyi.ss.record.time.mapper.RecordTimeMapper">
+
+    <resultMap type="RecordTimeVO" id="RecordTimeResult" autoMapping="true"/>
+
+    <sql id="selectRecordTimeVo">
+        select id, device_id, amount, reason, operator_id, operator_name, operator_type, operator_time from ss_record_time
+    </sql>
+
+    <select id="selectRecordTimeList" parameterType="RecordTimeQuery" resultMap="RecordTimeResult">
+        <include refid="selectRecordTimeVo"/>
+        <where>
+            <if test="deviceId != null "> and device_id = #{deviceId}</if>
+            <if test="amount != null "> and amount = #{amount}</if>
+            <if test="reason != null  and reason != ''"> and reason = #{reason}</if>
+            <if test="operatorId != null "> and operator_id = #{operatorId}</if>
+            <if test="operatorName != null  and operatorName != ''"> and operator_name like concat('%', #{operatorName}, '%')</if>
+            <if test="operatorType != null  and operatorType != ''"> and operator_type = #{operatorType}</if>
+            <if test="operatorTime != null "> and operator_time = #{operatorTime}</if>
+        </where>
+    </select>
+
+    <select id="selectRecordTimeById" parameterType="Long" resultMap="RecordTimeResult">
+        <include refid="selectRecordTimeVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertRecordTime" parameterType="RecordTime">
+        insert into ss_record_time
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="id != null">id,</if>
+            <if test="deviceId != null">device_id,</if>
+            <if test="amount != null">amount,</if>
+            <if test="reason != null">reason,</if>
+            <if test="operatorId != null">operator_id,</if>
+            <if test="operatorName != null">operator_name,</if>
+            <if test="operatorType != null">operator_type,</if>
+            <if test="operatorTime != null">operator_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="id != null">#{id},</if>
+            <if test="deviceId != null">#{deviceId},</if>
+            <if test="amount != null">#{amount},</if>
+            <if test="reason != null">#{reason},</if>
+            <if test="operatorId != null">#{operatorId},</if>
+            <if test="operatorName != null">#{operatorName},</if>
+            <if test="operatorType != null">#{operatorType},</if>
+            <if test="operatorTime != null">#{operatorTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateRecordTime" parameterType="RecordTime">
+        update ss_record_time
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="deviceId != null">device_id = #{deviceId},</if>
+            <if test="amount != null">amount = #{amount},</if>
+            <if test="reason != null">reason = #{reason},</if>
+            <if test="operatorId != null">operator_id = #{operatorId},</if>
+            <if test="operatorName != null">operator_name = #{operatorName},</if>
+            <if test="operatorType != null">operator_type = #{operatorType},</if>
+            <if test="operatorTime != null">operator_time = #{operatorTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteRecordTimeById" parameterType="Long">
+        delete from ss_record_time where id = #{id}
+    </delete>
+
+    <delete id="deleteRecordTimeByIds" parameterType="String">
+        delete from ss_record_time where id in
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+</mapper>
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/IRecordTimeService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/IRecordTimeService.java
new file mode 100644
index 00000000..24e5c089
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/IRecordTimeService.java
@@ -0,0 +1,63 @@
+package com.ruoyi.ss.record.time.service;
+
+import java.util.List;
+import com.ruoyi.ss.record.time.domain.RecordTime;
+import com.ruoyi.ss.record.time.domain.RecordTimeQuery;
+import com.ruoyi.ss.record.time.domain.RecordTimeVO;
+
+/**
+ * 设备时长变化记录Service接口
+ *
+ * @author ruoyi
+ * @date 2024-06-06
+ */
+public interface IRecordTimeService
+{
+    /**
+     * 查询设备时长变化记录
+     *
+     * @param id 设备时长变化记录主键
+     * @return 设备时长变化记录
+     */
+    public RecordTimeVO selectRecordTimeById(Long id);
+
+    /**
+     * 查询设备时长变化记录列表
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 设备时长变化记录集合
+     */
+    public List<RecordTimeVO> selectRecordTimeList(RecordTimeQuery recordTime);
+
+    /**
+     * 新增设备时长变化记录
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 结果
+     */
+    public int insertRecordTime(RecordTime recordTime);
+
+    /**
+     * 修改设备时长变化记录
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 结果
+     */
+    public int updateRecordTime(RecordTime recordTime);
+
+    /**
+     * 批量删除设备时长变化记录
+     *
+     * @param ids 需要删除的设备时长变化记录主键集合
+     * @return 结果
+     */
+    public int deleteRecordTimeByIds(Long[] ids);
+
+    /**
+     * 删除设备时长变化记录信息
+     *
+     * @param id 设备时长变化记录主键
+     * @return 结果
+     */
+    public int deleteRecordTimeById(Long id);
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/RecordTimeConverter.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/RecordTimeConverter.java
new file mode 100644
index 00000000..b42bfa9b
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/RecordTimeConverter.java
@@ -0,0 +1,17 @@
+package com.ruoyi.ss.record.time.service;
+
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.ss.device.domain.SmDevice;
+import com.ruoyi.ss.record.time.domain.RecordTime;
+
+import java.math.BigDecimal;
+
+/**
+ * @author wjh
+ * 2024/6/6
+ */
+public interface RecordTimeConverter {
+
+    RecordTime toRecordTime(SmDevice device, BigDecimal time, String reason, LoginUser loginUser);
+
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/impl/RecordTimeConverterImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/impl/RecordTimeConverterImpl.java
new file mode 100644
index 00000000..a7d1ed40
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/impl/RecordTimeConverterImpl.java
@@ -0,0 +1,38 @@
+package com.ruoyi.ss.record.time.service.impl;
+
+import com.ruoyi.common.core.domain.model.LoginUser;
+import com.ruoyi.common.enums.LoginType;
+import com.ruoyi.common.utils.SecurityUtils;
+import com.ruoyi.ss.device.domain.SmDevice;
+import com.ruoyi.ss.record.time.domain.RecordTime;
+import com.ruoyi.ss.record.time.domain.enums.OperatorType;
+import com.ruoyi.ss.record.time.service.RecordTimeConverter;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * @author wjh
+ * 2024/6/6
+ */
+@Service
+public class RecordTimeConverterImpl implements RecordTimeConverter {
+    @Override
+    public RecordTime toRecordTime(SmDevice device, BigDecimal time, String reason, LoginUser loginUser) {
+        RecordTime record = new RecordTime();
+        record.setDeviceId(device == null ? null : device.getDeviceId());
+        record.setAmount(time);
+        record.setReason(reason);
+        record.setOperatorId(loginUser.getUserId());
+        record.setOperatorName(loginUser.getUsername());
+        record.setOperatorType(toOperatorType(loginUser.getLoginType()));
+        record.setOperatorTime(LocalDateTime.now());
+
+        return record;
+    }
+
+    private String toOperatorType(LoginType loginType) {
+        return OperatorType.parse(loginType).getType();
+    }
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/impl/RecordTimeServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/impl/RecordTimeServiceImpl.java
new file mode 100644
index 00000000..5ed753e4
--- /dev/null
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/record/time/service/impl/RecordTimeServiceImpl.java
@@ -0,0 +1,96 @@
+package com.ruoyi.ss.record.time.service.impl;
+
+import java.util.List;
+
+import com.ruoyi.ss.record.time.domain.RecordTimeQuery;
+import com.ruoyi.ss.record.time.domain.RecordTimeVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.ruoyi.ss.record.time.mapper.RecordTimeMapper;
+import com.ruoyi.ss.record.time.domain.RecordTime;
+import com.ruoyi.ss.record.time.service.IRecordTimeService;
+
+/**
+ * 设备时长变化记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2024-06-06
+ */
+@Service
+public class RecordTimeServiceImpl implements IRecordTimeService
+{
+    @Autowired
+    private RecordTimeMapper recordTimeMapper;
+
+    /**
+     * 查询设备时长变化记录
+     *
+     * @param id 设备时长变化记录主键
+     * @return 设备时长变化记录
+     */
+    @Override
+    public RecordTimeVO selectRecordTimeById(Long id)
+    {
+        return recordTimeMapper.selectRecordTimeById(id);
+    }
+
+    /**
+     * 查询设备时长变化记录列表
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 设备时长变化记录
+     */
+    @Override
+    public List<RecordTimeVO> selectRecordTimeList(RecordTimeQuery recordTime)
+    {
+        return recordTimeMapper.selectRecordTimeList(recordTime);
+    }
+
+    /**
+     * 新增设备时长变化记录
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 结果
+     */
+    @Override
+    public int insertRecordTime(RecordTime recordTime)
+    {
+        return recordTimeMapper.insertRecordTime(recordTime);
+    }
+
+    /**
+     * 修改设备时长变化记录
+     *
+     * @param recordTime 设备时长变化记录
+     * @return 结果
+     */
+    @Override
+    public int updateRecordTime(RecordTime recordTime)
+    {
+        return recordTimeMapper.updateRecordTime(recordTime);
+    }
+
+    /**
+     * 批量删除设备时长变化记录
+     *
+     * @param ids 需要删除的设备时长变化记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRecordTimeByIds(Long[] ids)
+    {
+        return recordTimeMapper.deleteRecordTimeByIds(ids);
+    }
+
+    /**
+     * 删除设备时长变化记录信息
+     *
+     * @param id 设备时长变化记录主键
+     * @return 结果
+     */
+    @Override
+    public int deleteRecordTimeById(Long id)
+    {
+        return recordTimeMapper.deleteRecordTimeById(id);
+    }
+}
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java
index f93c7d04..ed105b8e 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBill.java
@@ -43,7 +43,7 @@ public class TransactionBill extends BaseEntity
 
     /** 类型 */
     @ApiModelProperty("类型:1充值,2提现")
-    @JsonView(JsonViewProfile.AppMch.class)
+    @JsonView(JsonViewProfile.App.class)
     private String type;
 
     /** 设备 */
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java
index 4d59fa5f..4bd33243 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/TransactionBillService.java
@@ -181,10 +181,10 @@ public interface TransactionBillService
 
     /**
      * 手动设备充值
+     *
      * @param billId
-     * @param validate 是否需要校验
      */
-    boolean rechargeDevice(Long billId, boolean validate);
+    boolean rechargeDevice(Long billId);
 
     /**
      * 查询设备充值失败列表
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java
index 196266dc..ce1eead6 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/service/impl/TransactionBillServiceImpl.java
@@ -533,27 +533,26 @@ public class TransactionBillServiceImpl implements TransactionBillService {
     }
 
     /**
-     * 手动设备充值
+     * 设备充值
      *
      * @param billId
      */
     @Override
     @Transactional
-    public boolean rechargeDevice(Long billId, boolean validate) {
+    public boolean rechargeDevice(Long billId) {
         ServiceUtil.assertion(billId == null, "参数错误,billId不允许为空");
 
         TransactionBill bill = transactionBillMapper.selectSmTransactionBillByBillId(billId);
 
-        if (validate) {
-            ServiceUtil.assertion(bill == null || !TransactionBillType.RECHARGE.getType().equals(bill.getType()), "不存在的充值订单");
-            ServiceUtil.assertion(!TransactionBillStatus.SUCCESS.getStatus().equals(bill.getStatus()), "订单未支付");
-            ServiceUtil.assertion(TransactionBillDeviceRechargeStatus.SUCCESS.getStatus().equals(bill.getDeviceRechargeStatus()), "设备已充值成功,不允许再次充值");
-        }
+        ServiceUtil.assertion(bill == null || !TransactionBillType.RECHARGE.getType().equals(bill.getType()), "不存在的充值订单");
+        ServiceUtil.assertion(!TransactionBillStatus.SUCCESS.getStatus().equals(bill.getStatus()), "订单未支付");
+        ServiceUtil.assertion(TransactionBillDeviceRechargeStatus.SUCCESS.getStatus().equals(bill.getDeviceRechargeStatus()), "设备已充值成功,不允许再次充值");
+        ServiceUtil.assertion(TransactionBillDeviceRechargeStatus.BLUETOOTH.getStatus().equals(bill.getDeviceRechargeStatus()), "设备已选择蓝牙充值,请使用蓝牙进行充值");
 
         // 电表时长增加,四舍五入,保留1位小数
         boolean success = false;
         try {
-            success = deviceService.addTime(bill.getDeviceId(), bill.getSuitTime());
+            success = deviceService.addTime(bill.getDeviceId(), bill.getSuitTime(), true);
         } catch (Exception e) {
             this.handleDeviceRechargeFail(billId);
         }
@@ -614,13 +613,13 @@ public class TransactionBillServiceImpl implements TransactionBillService {
         // 商户余额增加
         userService.addBalance(bill.getMchId(), bill.getArrivalAmount());
 
-        // 设备充值
-        rechargeDevice(bill.getBillId(), false);
-
         // 记录下充值后的余额
         SmUserVo user = userService.selectSmUserByUserId(bill.getMchId());
         updateAfterBalance(bill.getBillId(), user.getBalance());
 
+        // 设备充值
+        rechargeDevice(bill.getBillId());
+
     }
 
     /**
@@ -806,7 +805,13 @@ public class TransactionBillServiceImpl implements TransactionBillService {
             ServiceUtil.assertion(!TransactionBillType.RECHARGE.getType().equals(bill.getType()), "该订单不是充值订单", 10002);
             ServiceUtil.assertion(TransactionBillDeviceRechargeStatus.SUCCESS.getStatus().equals(bill.getDeviceRechargeStatus()), "设备已充值成功,请勿重复充值", 10003);
             ServiceUtil.assertion(!TransactionBillStatus.SUCCESS.getStatus().equals(bill.getStatus()), "订单尚未充值成功", 10004);
-            return transactionBillMapper.bluetoothRechargeSuccess(billNo) == 1;
+            boolean result = transactionBillMapper.bluetoothRechargeSuccess(billNo) == 1;
+            ServiceUtil.assertion(!result, "蓝牙充值回调失败");
+
+            boolean addTime = deviceService.addTime(bill.getDeviceId(), bill.getSuitTime(), false);
+            ServiceUtil.assertion(!addTime, "修改剩余时间失败");
+
+            return result;
         });
 
         return execute != null && execute;
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppDeviceController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppDeviceController.java
index 5c1a4890..a7d6fa6f 100644
--- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppDeviceController.java
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppDeviceController.java
@@ -94,7 +94,6 @@ public class AppDeviceController extends BaseController {
         return success(device);
     }
 
-    @MchRequired
     @ApiOperation("设备通断电")
     @PutMapping("/{deviceId}/changePower")
     public AjaxResult close(@PathVariable @ApiParam("设备id") Long deviceId, String status) {
@@ -102,7 +101,6 @@ public class AppDeviceController extends BaseController {
         return success(smDeviceService.changePowerStatus(deviceId, powerStatus ));
     }
 
-    @MchRequired
     @ApiOperation("绑定设备")
     @PutMapping("/bind")
     public AjaxResult bind(@RequestBody SmDevice device) {
@@ -110,13 +108,12 @@ public class AppDeviceController extends BaseController {
             return error("设备编号和mac不能同时为空");
         }
         if (StringUtils.hasText(device.getDeviceNo())) {
-            return AjaxResult.success("操作成功", smDeviceService.bindBySn(device.getStoreId(), device.getDeviceNo()));
+            return AjaxResult.success("操作成功", smDeviceService.bindBySn(device.getStoreId(), getUserId(), device.getDeviceNo()));
         } else {
-            return AjaxResult.success("操作成功", smDeviceService.bindByMac(device.getStoreId(), device.getMac()));
+            return AjaxResult.success("操作成功", smDeviceService.bindByMac(device.getStoreId(), getUserId(), device.getMac()));
         }
     }
 
-    @MchRequired
     @ApiOperation("商户解除设备绑定")
     @DeleteMapping("/mch/unbind/{deviceId}")
     public AjaxResult mchUnbind(@PathVariable @ApiParam("设备id") Long deviceId) {
@@ -124,14 +121,12 @@ public class AppDeviceController extends BaseController {
         return success(smDeviceService.unbindStore(deviceId));
     }
 
-    @MchRequired
     @ApiOperation("设备电量归零")
     @PutMapping("{deviceId}/reset")
     public AjaxResult reset(@PathVariable @ApiParam("设备id") Long deviceId) {
         return success(smDeviceService.reset(deviceId));
     }
 
-    @MchRequired
     @ApiOperation("获取设备用电量分析")
     @GetMapping("/electric/count")
     public AjaxResult count(@Validated({ValidGroup.Query.class}) SmMeterReadingRecordQuery dto)
@@ -139,7 +134,6 @@ public class AppDeviceController extends BaseController {
         return success(smMeterReadingRecordService.selectCount(dto));
     }
 
-    @MchRequired
     @ApiOperation("设备充值时长")
     @PutMapping("/addTime/{deviceId}")
     public AjaxResult addTime(@PathVariable @ApiParam("设备id") Long deviceId, @ApiParam("电量(度)") BigDecimal amount)
@@ -147,11 +141,10 @@ public class AppDeviceController extends BaseController {
         ServiceUtil.assertion(!deviceValidator.isBelong(deviceId, getUserId()), "这不是您的设备");
         SmDeviceVo device = smDeviceService.selectSmDeviceByDeviceId(deviceId);
         ServiceUtil.assertion(device == null || !getUserId().equals(device.getUserId()), "设备不存在或您无权充值");
-        smDeviceService.addTime(deviceId, amount);
+        smDeviceService.addTimeByUser(deviceId, amount, true, "商户手动充值");
         return success(true);
     }
 
-    @MchRequired
     @ApiOperation("刷新设备信息")
     @GetMapping("/{deviceId}/refreshIot")
     public AjaxResult syncIot(@PathVariable @ApiParam("设备id") Long deviceId) {
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppSuitController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppSuitController.java
index 564bc5b2..27ccc950 100644
--- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppSuitController.java
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/app/AppSuitController.java
@@ -40,7 +40,6 @@ public class AppSuitController extends BaseController {
     private DeviceValidator deviceValidator;
 
     @ApiOperation("查询设备套餐列表")
-    @MchRequired
     @JsonView(JsonViewProfile.AppMch.class)
     @GetMapping("/listByDeviceId/{deviceId}")
     public AjaxResult list(@PathVariable Long deviceId)
@@ -52,7 +51,6 @@ public class AppSuitController extends BaseController {
 
     @ApiOperation("获取套餐详细信息")
     @JsonView(JsonViewProfile.AppMch.class)
-    @MchRequired
     @GetMapping("/{suitId}")
     public AjaxResult getInfo(@PathVariable("suitId") Long suitId) {
         return success(suitService.selectSuitBySuitId(suitId));
@@ -60,7 +58,6 @@ public class AppSuitController extends BaseController {
 
     @ApiOperation("新增套餐")
     @PostMapping
-    @MchRequired
     public AjaxResult add(@RequestBody @Validated({ValidGroup.FrontCreate.class}) SuitBO suit) {
         suit = suit.filterCreateByApp();
         ServiceUtil.assertion(suitValidator.preCreateByApp(suit));
@@ -68,7 +65,6 @@ public class AppSuitController extends BaseController {
     }
 
     @ApiOperation("修改套餐")
-    @MchRequired
     @PutMapping
     public AjaxResult edit(@RequestBody @Validated({ValidGroup.FrontUpdate.class}) SuitBO suit)
     {
@@ -77,7 +73,6 @@ public class AppSuitController extends BaseController {
         return success(suitService.updateSuit(suit));
     }
 
-    @MchRequired
     @ApiOperation("删除套餐")
     @DeleteMapping("/{suitIds}")
     public AjaxResult remove(@PathVariable @ApiParam("套餐id列表") Long[] suitIds)
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/RecordTimeController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/RecordTimeController.java
new file mode 100644
index 00000000..aed68283
--- /dev/null
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/RecordTimeController.java
@@ -0,0 +1,107 @@
+package com.ruoyi.web.controller.ss;
+
+import java.util.List;
+import javax.servlet.http.HttpServletResponse;
+
+import com.ruoyi.ss.record.time.domain.RecordTimeQuery;
+import com.ruoyi.ss.record.time.domain.RecordTimeVO;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.ruoyi.common.annotation.Log;
+import com.ruoyi.common.core.controller.BaseController;
+import com.ruoyi.common.core.domain.AjaxResult;
+import com.ruoyi.common.enums.BusinessType;
+import com.ruoyi.ss.record.time.domain.RecordTime;
+import com.ruoyi.ss.record.time.service.IRecordTimeService;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.common.core.page.TableDataInfo;
+
+/**
+ * 设备时长变化记录Controller
+ *
+ * @author ruoyi
+ * @date 2024-06-06
+ */
+@RestController
+@RequestMapping("/ss/time")
+public class RecordTimeController extends BaseController
+{
+    @Autowired
+    private IRecordTimeService recordTimeService;
+
+    /**
+     * 查询设备时长变化记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('ss:time:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(RecordTimeQuery recordTime)
+    {
+        startPage();
+        List<RecordTimeVO> list = recordTimeService.selectRecordTimeList(recordTime);
+        return getDataTable(list);
+    }
+
+    /**
+     * 导出设备时长变化记录列表
+     */
+    @PreAuthorize("@ss.hasPermi('ss:time:export')")
+    @Log(title = "设备时长变化记录", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, RecordTimeQuery recordTime)
+    {
+        List<RecordTimeVO> list = recordTimeService.selectRecordTimeList(recordTime);
+        ExcelUtil<RecordTimeVO> util = new ExcelUtil<RecordTimeVO>(RecordTimeVO.class);
+        util.exportExcel(response, list, "设备时长变化记录数据");
+    }
+
+    /**
+     * 获取设备时长变化记录详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('ss:time:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return success(recordTimeService.selectRecordTimeById(id));
+    }
+
+    /**
+     * 新增设备时长变化记录
+     */
+    @PreAuthorize("@ss.hasPermi('ss:time:add')")
+    @Log(title = "设备时长变化记录", businessType = BusinessType.INSERT)
+    @PostMapping
+    public AjaxResult add(@RequestBody RecordTime recordTime)
+    {
+        return toAjax(recordTimeService.insertRecordTime(recordTime));
+    }
+
+    /**
+     * 修改设备时长变化记录
+     */
+    @PreAuthorize("@ss.hasPermi('ss:time:edit')")
+    @Log(title = "设备时长变化记录", businessType = BusinessType.UPDATE)
+    @PutMapping
+    public AjaxResult edit(@RequestBody RecordTime recordTime)
+    {
+        return toAjax(recordTimeService.updateRecordTime(recordTime));
+    }
+
+    /**
+     * 删除设备时长变化记录
+     */
+    @PreAuthorize("@ss.hasPermi('ss:time:remove')")
+    @Log(title = "设备时长变化记录", businessType = BusinessType.DELETE)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(recordTimeService.deleteRecordTimeByIds(ids));
+    }
+}
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java
index fee3fed4..62ebcc61 100644
--- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmDeviceController.java
@@ -1,5 +1,6 @@
 package com.ruoyi.web.controller.ss;
 
+import java.math.BigDecimal;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -29,7 +30,6 @@ import com.ruoyi.common.annotation.Log;
 import com.ruoyi.common.core.controller.BaseController;
 import com.ruoyi.common.core.domain.AjaxResult;
 import com.ruoyi.common.enums.BusinessType;
-import com.ruoyi.ss.device.domain.SmDevice;
 import com.ruoyi.ss.device.service.ISmDeviceService;
 import com.ruoyi.common.utils.poi.ExcelUtil;
 import com.ruoyi.common.core.page.TableDataInfo;
@@ -163,4 +163,15 @@ public class SmDeviceController extends BaseController
         return success(smDeviceService.bindSn(deviceId, sn));
     }
 
+    @ApiOperation("设备充值时长")
+    @PutMapping("/addTime/{deviceId}")
+    public AjaxResult addTime(@PathVariable @ApiParam("设备id") Long deviceId, @ApiParam("电量(度)") BigDecimal amount) {
+        return toAjax(smDeviceService.addTimeByUser(deviceId, amount, true, "管理员手动充值"));
+    }
+
+    @ApiOperation("设备时长归零")
+    @PutMapping("/{deviceId}/reset")
+    public AjaxResult reset(@PathVariable @ApiParam("设备id") Long deviceId) {
+        return success(smDeviceService.reset(deviceId));
+    }
 }
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java
index 74a529ee..2e82a620 100644
--- a/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/controller/ss/SmTransactionBillController.java
@@ -158,7 +158,7 @@ public class SmTransactionBillController extends BaseController
     @Log(title = "手动设备充值", businessType = BusinessType.UPDATE)
     public AjaxResult rechargeDevice(@PathVariable Long billId)
     {
-        smTransactionBillService.rechargeDevice(billId, true);
+        smTransactionBillService.rechargeDevice(billId);
         return success();
     }
 
diff --git a/smart-switch-web/src/main/java/com/ruoyi/web/core/aspectj/MchRequiredAspect.java b/smart-switch-web/src/main/java/com/ruoyi/web/core/aspectj/MchRequiredAspect.java
index baeb8245..20d752d4 100644
--- a/smart-switch-web/src/main/java/com/ruoyi/web/core/aspectj/MchRequiredAspect.java
+++ b/smart-switch-web/src/main/java/com/ruoyi/web/core/aspectj/MchRequiredAspect.java
@@ -7,6 +7,7 @@ import com.ruoyi.common.enums.UserType;
 import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.ServiceUtil;
+import com.ruoyi.framework.web.service.TokenService;
 import com.ruoyi.ss.user.domain.SmUserVo;
 import com.ruoyi.ss.user.service.ISmUserService;
 import com.ruoyi.web.core.annotation.MchRequired;
@@ -35,15 +36,12 @@ public class MchRequiredAspect {
     @Autowired
     private ISmUserService smUserService;
 
-    @Value("${debug}")
-    private Boolean debug;
+    @Autowired
+    private TokenService tokenService;
 
     // 判断当前用户是否有权限访问
     @Before("@annotation(mchRequired)")
     public void doBefore(JoinPoint point, MchRequired mchRequired) {
-        if (debug) {
-            return;
-        }
         LoginUser loginUser = SecurityUtils.getLoginUser();
         SmUser user = loginUser.getSmUser();
         ServiceUtil.assertion(user == null || user.getIsMch() == null, "获取用户信息异常");
@@ -52,6 +50,7 @@ public class MchRequiredAspect {
         if (!user.getIsMch()) {
             SmUserVo dbUser = smUserService.selectSmUserByUserId(user.getUserId());
             if (dbUser.getIsMch()) {
+                tokenService.delLoginUser(loginUser.getToken());
                 throw new ServiceException("用户信息已变更,请重新登录", HttpStatus.UNAUTHORIZED);
             } else {
                 throw new ServiceException("仅商家可进行该操作,若您已成为商家,请重新登录后重试");
diff --git a/smart-switch-web/src/main/resources/application-dev.yml b/smart-switch-web/src/main/resources/application-dev.yml
index 0c76289a..7664458b 100644
--- a/smart-switch-web/src/main/resources/application-dev.yml
+++ b/smart-switch-web/src/main/resources/application-dev.yml
@@ -20,7 +20,7 @@ wx:
     # apiV3密钥
     apiV3Key: 49819e0f0abdb2df3246f7b27f264d75
     # 通知回调地址
-    notifyUrl: http://124.221.246.124:2288/dev-api/app/pay/notify/wx   # 内网穿透
+    notifyUrl: http://124.221.246.124:2290/dev-api/app/pay/notify/wx   # 内网穿透
     # 密钥所在位置
     privateKeyPath: D:/project/证书/wxpay/apiclient_key.pem
     # 证书序列号
diff --git a/smart-switch-web/src/main/resources/application-test.yml b/smart-switch-web/src/main/resources/application-test.yml
index 98911bb0..74eb34ac 100644
--- a/smart-switch-web/src/main/resources/application-test.yml
+++ b/smart-switch-web/src/main/resources/application-test.yml
@@ -20,7 +20,7 @@ wx:
     # apiV3密钥
     apiV3Key: 49819e0f0abdb2df3246f7b27f264d75
     # 通知回调地址
-    notifyUrl: https://kaiguan.chuantewulian.cn/prod-api/app/pay/notify/wx  # 测试环境
+    notifyUrl: https://kg.chuantewulian.cn/prod-api/app/pay/notify/wx  # 测试环境
     # 密钥所在位置
     privateKeyPath: /www/wwwroot/smart-switch/wxpay/apiclient_key.pem
     # 证书序列号
diff --git a/smart-switch-web/src/main/resources/application.yml b/smart-switch-web/src/main/resources/application.yml
index 8be85975..1533dab6 100644
--- a/smart-switch-web/src/main/resources/application.yml
+++ b/smart-switch-web/src/main/resources/application.yml
@@ -158,7 +158,9 @@ sm:
   # 物联网平台地址
   iotHost: https://iot-api.heclouds.com
   # 产品id 智能电表
-  productId: SnDlte5gPh
+#  productId: SnDlte5gPh
+  # 新的id
+  productId: 6EX6t0UH7g
   # 版本号 签名算法版本
   version: 2020-05-29
   # 用户资源信息  用户id