ソースを参照

fix: 订单更新事件防乱序覆盖,事件 topic 解析增加长度校验

- OrderUpdateEventHandler 增加条件更新(设备上报金额 >= 当前记录金额才保存),
  实现 javadoc 承诺的防旧金额覆盖逻辑,乱序/重复事件不再回退金额
- 四个事件处理器(order_update/order_create/boot/device_state)topic 解析
  前增加长度校验,格式异常消息直接跳过而非 AIOOBE 导致无限重投

Co-Authored-By: Claude <noreply@anthropic.com>
skyline 3 週間 前
コミット
da782d8fe2

+ 4 - 0
car-wash-service/src/main/java/com/kym/service/awoara/event/handle/BootEventHandler.java

@@ -39,6 +39,10 @@ public class BootEventHandler implements AwoaraEventHandler<DeviceStateObject> {
         log.info("BootEventHandler: {}", message);
 
         var topic = message.getTopic().split("/");
+        if (topic.length < 3) {
+            log.warn("设备启动事件 topic 格式异常,跳过处理:{}", message.getTopic());
+            return;
+        }
         var productKey = topic[1];
         var deviceName = topic[2];
 

+ 4 - 0
car-wash-service/src/main/java/com/kym/service/awoara/event/handle/DeviceStateEventHandler.java

@@ -32,6 +32,10 @@ public class DeviceStateEventHandler implements AwoaraEventHandler<DeviceStateOb
         log.debug("DeviceStateEventHandler: {}", message);
 
         var topic = message.getTopic().split("/");
+        if (topic.length < 3) {
+            log.warn("设备状态事件 topic 格式异常,跳过处理:{}", message.getTopic());
+            return;
+        }
         var productKey = topic[1];
         var deviceName = topic[2];
         var deviceState = message.getPayload().getData().getDevice_state();

+ 4 - 0
car-wash-service/src/main/java/com/kym/service/awoara/event/handle/OrderCreateEventHandler.java

@@ -38,6 +38,10 @@ public class OrderCreateEventHandler implements AwoaraEventHandler<OrderInfoObje
         // 获取设备信息 从topic中获取
         log.debug("topic:{}", message.getTopic());
         var topic = message.getTopic().split("/");
+        if (topic.length < 3) {
+            log.warn("订单创建事件 topic 格式异常,跳过处理:{}", message.getTopic());
+            return;
+        }
         var productKey = topic[1];
         var deviceName = topic[2];
         log.debug("productKey:{},deviceName:{}", productKey, deviceName);

+ 8 - 0
car-wash-service/src/main/java/com/kym/service/awoara/event/handle/OrderUpdateEventHandler.java

@@ -40,12 +40,18 @@ public class OrderUpdateEventHandler implements AwoaraEventHandler<OrderInfoObje
         log.info("收到订单更新事件");
 
         var topic = message.getTopic().split("/");
+        if (topic.length < 3) {
+            log.warn("订单更新事件 topic 格式异常,跳过处理:{}", message.getTopic());
+            return;
+        }
         var productKey = topic[1];
         var deviceName = topic[2];
 
         var orderInfo = message.getPayload().getData().getOrder_info();
         log.info("订单:{},更新信息:{}", orderInfo.getOrder_id(), orderInfo);
 
+        // 防乱序覆盖:设备上报金额低于当前已记录金额时不更新(消费金额随时间只增不减),
+        // 与 javadoc 承诺的"消费金额大于等于当前记录才保存"保持一致
         washOrderService.lambdaUpdate()
                 .set(WashOrder::getOpenType, orderInfo.getOpen_type())
                 .set(WashOrder::getCloseType, orderInfo.getClose_type())
@@ -61,6 +67,8 @@ public class OrderUpdateEventHandler implements AwoaraEventHandler<OrderInfoObje
                 .eq(WashOrder::getOrderId, orderInfo.getOrder_id())
                 .eq(WashOrder::getProductKey, productKey)
                 .eq(WashOrder::getDeviceName, deviceName)
+                .and(w -> w.le(WashOrder::getAmount, orderInfo.getAmount())
+                        .or().isNull(WashOrder::getAmount))
                 .update();
 
     }