Prechádzať zdrojové kódy

优化订单可能反复启动的问题

skyline 21 hodín pred
rodič
commit
a7ebc790a3

+ 15 - 3
charge-front/src/pages-charge/ordering/ordering.vue

@@ -137,12 +137,15 @@ const startStartTimer = () => {
 };
 const startStatusTimer = () => {
   statusTimer = setTimeout(() => {
+    if (status.value.cancel) {
+      return;
+    }
     fetchChargeStatus()
       .then((res) => {
         if (status.value.cancel) {
           return;
         }
-        if (res.isStarted) {
+        if (res && res.isStarted) {
           setChargeData(res);
         }
         startStatusTimer();
@@ -602,12 +605,21 @@ const onImgLoad = () => {
           },
         });
       } else {
-        start();
+        reLaunch();
       }
     })
     .catch((err) => {
       console.log(err);
-      start();
+      uni.showModal({
+        title: "温馨提示",
+        content: "查询充电状态异常,请返回重试",
+        showCancel: false,
+        confirmText: "知道了",
+        confirmColor: "#2d9e95",
+        success: () => {
+          reLaunch();
+        },
+      });
     });
 };
 

+ 14 - 2
miniapp/src/main/java/com/kym/miniapp/jobs/EquipmentChargeStatusJob.java

@@ -64,13 +64,25 @@ public class EquipmentChargeStatusJob {
             var orderList = new ArrayList<ChargeOrder>();
             orders.forEach(order -> {
                 var chargeOrder = JSONObject.parseObject(order.toString(), ChargeOrder.class);
+                // 检查DB中该订单的当前状态,防止用Redis脏数据覆盖已结束的订单
+                var dbOrder = chargeOrderService.lambdaQuery()
+                        .eq(ChargeOrder::getStartChargeSeq, chargeOrder.getStartChargeSeq())
+                        .select(ChargeOrder::getChargeStatus, ChargeOrder::getOrderStatus)
+                        .one();
+                if (dbOrder != null && dbOrder.getChargeStatus().equals(ChargeOrder.CHARGE_STATUS_已结束)) {
+                    log.info("订单{}已在DB中结束,跳过Redis数据覆盖,清理Redis缓存", chargeOrder.getStartChargeSeq());
+                    redisTemplate.opsForHash().delete(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, chargeOrder.getStartChargeSeq());
+                    return;
+                }
                 orderList.add(chargeOrder);
                 if (chargeOrder.getChargeStatus().equals(ChargeOrder.CHARGE_STATUS_停止中) || chargeOrder.getChargeStatus().equals(ChargeOrder.CHARGE_STATUS_已结束)) {
                     redisTemplate.opsForHash().delete(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, chargeOrder.getStartChargeSeq());
                 }
             });
-            chargeOrderService.updateBatchByQueryWrapper(orderList, order ->
-                    new QueryWrapper<ChargeOrder>().eq("start_charge_seq", order.getStartChargeSeq()));
+            if (!orderList.isEmpty()) {
+                chargeOrderService.updateBatchByQueryWrapper(orderList, order ->
+                        new QueryWrapper<ChargeOrder>().eq("start_charge_seq", order.getStartChargeSeq()));
+            }
         }
         log.info("设备充电状态信息(订单信息)更新定时任务结束,本次更新{}条订单...", orders.size());
     }

+ 2 - 0
service/src/main/java/com/kym/service/platform/impl/PlatformNotifyServiceImpl.java

@@ -281,6 +281,8 @@ public class PlatformNotifyServiceImpl implements PlatformNotifyService {
         if (data.containsKey("SuccStat") && data.getIntValue("SuccStat") == 0) {
             chargeOrder.setChargeStatus(data.getIntValue("StartChargeSeqStat"));
             chargeOrderService.updateById(chargeOrder);
+            // 删除Redis缓存,防止定时任务用脏数据覆盖DB
+            redisTemplate.opsForHash().delete(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, startChargeSeq);
         }
         var params = """
                 {