Explorar o código

fix: 修复结算后定时任务和停止充电推送覆盖订单状态的问题

EquipmentChargeStatusJob批量更新时增加WHERE条件防止竞态窗口覆盖已结算订单,
handleNotificationStopChargeResult增加终态守卫跳过已结算订单的处理。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
skyline hai 3 semanas
pai
achega
b4421a2ac8

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

@@ -69,7 +69,7 @@ public class EquipmentChargeStatusJob {
                         .eq(ChargeOrder::getStartChargeSeq, chargeOrder.getStartChargeSeq())
                         .select(ChargeOrder::getChargeStatus, ChargeOrder::getOrderStatus)
                         .one();
-                if (dbOrder != null && dbOrder.getChargeStatus().equals(ChargeOrder.CHARGE_STATUS_已结束)) {
+                if (dbOrder != null && (dbOrder.getChargeStatus().equals(ChargeOrder.CHARGE_STATUS_已结束) || dbOrder.getOrderStatus().equals(ChargeOrder.ORDER_STATUS_成功))) {
                     log.info("订单{}已在DB中结束,跳过Redis数据覆盖,清理Redis缓存", chargeOrder.getStartChargeSeq());
                     redisTemplate.opsForHash().delete(RedisKeys.CHARGE_ORDER_EQUIP_CHARGE_STATUS, chargeOrder.getStartChargeSeq());
                     return;
@@ -81,7 +81,9 @@ public class EquipmentChargeStatusJob {
             });
             if (!orderList.isEmpty()) {
                 chargeOrderService.updateBatchByQueryWrapper(orderList, order ->
-                        new QueryWrapper<ChargeOrder>().eq("start_charge_seq", order.getStartChargeSeq()));
+                        new QueryWrapper<ChargeOrder>().eq("start_charge_seq", order.getStartChargeSeq())
+                                .ne("charge_status", ChargeOrder.CHARGE_STATUS_已结束)
+                                .ne("order_status", ChargeOrder.ORDER_STATUS_成功));
             }
         }
         log.info("设备充电状态信息(订单信息)更新定时任务结束,本次更新{}条订单...", orders.size());

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

@@ -278,6 +278,19 @@ public class PlatformNotifyServiceImpl implements PlatformNotifyService {
         LOGGER.info("【{}互联互通平台推送】收到停止充电结果推送:{},解密数据:{}", platformName, json, data);
         var startChargeSeq = data.getString("StartChargeSeq");
         var chargeOrder = chargeOrderService.getChargingOrderByStartChargeSeq(startChargeSeq);
+        // 订单已结算或已到终态,跳过处理,防止覆盖已结算数据
+        if (chargeOrder == null || chargeOrder.getOrderStatus() != ChargeOrder.ORDER_STATUS_未知) {
+            LOGGER.info("【{}互联互通平台推送】停止充电结果:订单{}已到终态,跳过处理", platformName, startChargeSeq);
+            var params = """
+                    {
+                        "StartChargeSeq":"%s",
+                        "SuccStat":%d,
+                        "FailReason":%d
+                    }
+                    """.formatted(startChargeSeq, 0, 0);
+            var platform = PlatformCache.INSTANCE.getPlatformByName(platformName);
+            return PlatformAesUtil.encrypt(platform.getUserDataSecret(), platform.getUserDataSecretIv(), params);
+        }
         if (data.containsKey("SuccStat") && data.getIntValue("SuccStat") == 0) {
             chargeOrder.setChargeStatus(data.getIntValue("StartChargeSeqStat"));
             chargeOrderService.updateById(chargeOrder);