diff --git a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/WxLoginBody.java b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/WxLoginBody.java
index 52cda4b3..bba95f35 100644
--- a/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/WxLoginBody.java
+++ b/smart-switch-ruoyi/smart-switch-common/src/main/java/com/ruoyi/common/core/domain/model/WxLoginBody.java
@@ -1,10 +1,7 @@
 package com.ruoyi.common.core.domain.model;
 
-import com.ruoyi.common.enums.UserType;
-import com.ruoyi.common.valid.EnumValid;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
-import io.swagger.annotations.ApiOperation;
 import lombok.Data;
 
 import javax.validation.constraints.NotNull;
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java
index 8598f1b2..51d339c7 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/device/service/impl/DeviceServiceImpl.java
@@ -28,6 +28,7 @@ import com.ruoyi.ss.record.time.service.RecordTimeConverter;
 import com.ruoyi.ss.store.domain.StoreVo;
 import com.ruoyi.ss.store.service.IStoreService;
 import com.ruoyi.ss.suit.service.SuitService;
+import com.ruoyi.ss.transactionBill.domain.TransactionBillQuery;
 import com.ruoyi.ss.transactionBill.domain.TransactionBillVo;
 import com.ruoyi.ss.transactionBill.service.TransactionBillService;
 import com.ruoyi.ss.user.domain.SmUserVo;
@@ -604,6 +605,9 @@ public class DeviceServiceImpl implements DeviceService
         form.setStatus(DeviceStatus.NORMAL.getStatus());
         smDeviceMapper.updateSmDevice(form);
 
+        // 关闭该设备未结束的所有订单
+        transactionBillService.batchEndBillByDevice(deviceId);
+
         // 物联网设备归零
         CommandResponse commandResponse = iotService.setTime(device.getMac(), BigDecimal.ONE);
         ServiceUtil.assertion(!commandResponse.isSuccess(), "设备归零失败,请检查设备是否在线或联系管理员");
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java
index 98b040a7..6fec6189 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/domain/Suit.java
@@ -33,7 +33,7 @@ public class Suit extends BaseEntity
 
     /** 设备id */
     @Excel(name = "设备id")
-    @NotNull(message = "设备ID不允许为空", groups = {ValidGroup.Create.class, ValidGroup.FrontCreate.class})
+//    @NotNull(message = "设备ID不允许为空", groups = {ValidGroup.Create.class, ValidGroup.FrontCreate.class})
     @JsonView(JsonViewProfile.AppMch.class)
     private Long deviceId;
 
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java
index 97158437..97199c8b 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/suit/service/impl/SuitValidatorImpl.java
@@ -70,7 +70,7 @@ public class SuitValidatorImpl extends BaseValidator implements SuitValidator {
         }
 
         // 设备校验
-        if (!deviceValidator.isBelong(suit.getDeviceId(), SecurityUtils.getUserId())) {
+        if (suit.getDeviceId() != null && !deviceValidator.isBelong(suit.getDeviceId(), SecurityUtils.getUserId())) {
             return error("该设备不属于该用户");
         }
 
@@ -96,10 +96,8 @@ public class SuitValidatorImpl extends BaseValidator implements SuitValidator {
         }
 
         // 设备校验
-        if (suit.getDeviceId() != null) {
-            if (!deviceValidator.isBelong(suit.getDeviceId(), userId)) {
-                return error("该设备不属于该用户");
-            }
+        if ( suit.getDeviceId() != null && !deviceValidator.isBelong(suit.getDeviceId(), userId)) {
+            return error("该设备不属于该用户");
         }
 
         return success();
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 c52017be..3244756b 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
@@ -97,6 +97,7 @@ public class TransactionBill extends BaseEntity
     private BigDecimal afterBalance;
 
     @ApiModelProperty("支付成功的时间")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date payTime;
 
     @ApiModelProperty("支付过期时间")
@@ -162,4 +163,13 @@ public class TransactionBill extends BaseEntity
     @JsonView(JsonViewProfile.App.class)
     private String deviceMac;
 
+    @ApiModelProperty("总计退款金额")
+    private BigDecimal refundAmount;
+
+    @ApiModelProperty("商户退款金额")
+    private BigDecimal refundMchAmount;
+
+    @ApiModelProperty("服务费退款金额")
+    private BigDecimal refundServiceAmount;
+
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java
index e3d17c8c..e121a6c3 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/domain/TransactionBillQuery.java
@@ -8,6 +8,7 @@ import lombok.Data;
 import lombok.EqualsAndHashCode;
 import org.springframework.format.annotation.DateTimeFormat;
 
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -76,4 +77,7 @@ public class TransactionBillQuery extends TransactionBill {
 
     @ApiModelProperty("是否使用中")
     private Boolean using;
+
+    @ApiModelProperty("套餐结束时间(结束)")
+    private LocalDateTime endSuitEndTime;
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java
index dd16ab1d..07ebf5c8 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.java
@@ -164,4 +164,9 @@ public interface TransactionBillMapper
                         @Param("refundMchAmount") BigDecimal refundMchAmount,
                         @Param("refundServiceAmount") BigDecimal refundServiceAmount
     );
+
+    /**
+     * 批量更新套餐结束时间
+     */
+    int batchUpdateSuitEndTime(@Param("billIds") List<Long> billIds,@Param("time") LocalDateTime time);
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml
index 4b3cab02..7c27bc9c 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/transactionBill/mapper/TransactionBillMapper.xml
@@ -42,6 +42,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                stb.device_no,
                stb.suit_name,
                stb.device_mac,
+               stb.refund_amount,
+               stb.refund_mch_amount,
+               stb.refund_service_amount,
                su.user_name as user_name,
                su1.user_name as mch_name,
                su1.phonenumber as mch_mobile
@@ -73,6 +76,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="query.deviceRechargeStatus != null"> and stb.device_recharge_status = #{query.deviceRechargeStatus} </if>
         <if test="query.suitId != null"> and stb.suit_id = #{query.suitId} </if>
         <if test="query.storeId != null"> and stb.store_id = #{query.storeId} </if>
+        <if test="query.endSuitEndTime != null"> and stb.suit_end_time >= #{query.endSuitEndTime}</if>
         <if test="query.using != null">
             <if test="query.using">
                 and now() >= stb.suit_start_time and now() &lt;= stb.suit_end_time and now() &lt;= stb.suit_expire_time
@@ -224,6 +228,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deviceNo != null ">device_no,</if>
             <if test="suitName != null ">suit_name,</if>
             <if test="deviceMac != null ">device_mac,</if>
+            <if test="refundAmount != null">refund_amount,</if>
+            <if test="refundMchAmount != null">refund_mch_amount,</if>
+            <if test="refundServiceAmount != null">refund_service_amount,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="billNo != null">#{billNo},</if>
@@ -258,6 +265,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="deviceNo != null ">#{deviceNo},</if>
             <if test="suitName != null ">#{suitName},</if>
             <if test="deviceMac != null ">#{deviceMac},</if>
+            <if test="refundAmount != null">#{refundAmount},</if>
+            <if test="refundMchAmount != null">#{refundMchAmount},</if>
+            <if test="refundServiceAmount != null">#{refundServiceAmount},</if>
          </trim>
     </insert>
 
@@ -309,6 +319,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <if test="data.deviceNo != null ">device_no = #{data.deviceNo},</if>
         <if test="data.suitName != null ">suit_name = #{data.suitName},</if>
         <if test="data.deviceMac != null ">device_mac = #{data.deviceMac},</if>
+        <if test="data.refundAmount != null">refund_amount = #{data.refundAmount},</if>
+        <if test="data.refundMchAmount != null">refund_mch_amount = #{data.refundMchAmount},</if>
+        <if test="data.refundServiceAmount != null">refund_service_amount = #{data.refundServiceAmount},</if>
     </sql>
 
     <update id="updateByQuery">
@@ -417,4 +430,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where bill_no = #{billNo} and type = '1' and device_recharge_status = '3' and status = '2'
     </update>
 
+    <update id="batchUpdateSuitEndTime">
+        update sm_transaction_bill
+        set suit_end_time = #{time}
+        where bill_id in
+        <foreach collection="billIds" separator="," item="item" close=")" open="(">
+            #{item}
+        </foreach>
+    </update>
+
 </mapper>
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 a3ad29ae..d569780e 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
@@ -259,4 +259,14 @@ public interface TransactionBillService
      * 查询用户正在使用中的订单
      */
     List<TransactionBillVo> selectUsingBill(Long userId);
+
+    /**
+     * 查询正在使用中的订单
+     */
+    List<TransactionBillVo> selectUsingBill(TransactionBillQuery query);
+
+    /**
+     * 根据设备ID批量结束订单
+     */
+    int batchEndBillByDevice(Long deviceId);
 }
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 36b19375..08e31f7b 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
@@ -581,7 +581,7 @@ public class TransactionBillServiceImpl implements TransactionBillService {
     }
 
     /**
-     * 在设备充值成功后,更新套餐时间
+     * 在设备充值成功前,更新套餐时间
      * 开始时间 = 设备过期时间 - 套餐时间,过期时间 = 设备过期时间
      */
     private int updateSuitTimeBeforeDevice(Long billId, LocalDateTime deviceExpireTime) {
@@ -589,11 +589,14 @@ public class TransactionBillServiceImpl implements TransactionBillService {
         if (bill == null) {
             return 0;
         }
+        // 计算开始使用的时间
+        LocalDateTime now = LocalDateTime.now();
+        LocalDateTime startTime = now.isAfter(deviceExpireTime) ? now : deviceExpireTime;
 
-        LocalDateTime endTime = deviceExpireTime.plusMinutes(bill.getSuitTime().longValue());
+        LocalDateTime endTime = startTime.plusMinutes(bill.getSuitTime().longValue());
         TransactionBill data = new TransactionBill();
         data.setBillId(billId);
-        data.setSuitStartTime(deviceExpireTime);
+        data.setSuitStartTime(startTime);
         data.setSuitEndTime(endTime);
         data.setSuitExpireTime(endTime);
         return transactionBillMapper.updateSmTransactionBill(data);
@@ -958,8 +961,30 @@ public class TransactionBillServiceImpl implements TransactionBillService {
     @Override
     public List<TransactionBillVo> selectUsingBill(Long userId) {
         TransactionBillQuery query = new TransactionBillQuery();
+        query.setUserId(userId);
+        return this.selectUsingBill(query);
+    }
+
+    @Override
+    public List<TransactionBillVo> selectUsingBill(TransactionBillQuery query) {
         query.setUsing(true);
         query.setStatus(TransactionBillStatus.SUCCESS.getStatus());
         return this.selectSmTransactionBillList(query);
     }
+
+    @Override
+    public int batchEndBillByDevice(Long deviceId) {
+        if (deviceId == null) {
+            return 0;
+        }
+        LocalDateTime now = LocalDateTime.now();
+        TransactionBillQuery query = new TransactionBillQuery();
+        query.setDeviceId(deviceId);
+        query.setEndSuitEndTime(now);   // 套餐结束时间在这之后的,都会被关闭
+        List<TransactionBillVo> billList = this.selectSmTransactionBillList(query);
+        if (CollectionUtils.isNotEmptyElement(billList)) {
+            return transactionBillMapper.batchUpdateSuitEndTime(billList.stream().map(TransactionBill::getBillId).collect(Collectors.toList()), now);
+        }
+        return 0;
+    }
 }
diff --git a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/bo/UserUpdateServiceRateBO.java b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/bo/UserUpdateServiceRateBO.java
index 8f94031a..b1a832a1 100644
--- a/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/bo/UserUpdateServiceRateBO.java
+++ b/smart-switch-service/src/main/java/com/ruoyi/ss/user/domain/bo/UserUpdateServiceRateBO.java
@@ -21,7 +21,7 @@ public class UserUpdateServiceRateBO {
     private Long userId;
 
     @ApiModelProperty("服务费费率")
-    @Range(min = 1, max = 100, message = "服务费费率范围1-100")
+    @Range(min = 0, max = 100, message = "服务费费率范围0-100")
     private BigDecimal serviceRate;
 
     @ApiModelProperty("是否刷新用户所有设备的服务费")