From bb917c954c07f6f208a9effbdbb4a93a6ccf6612 Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Mon, 19 Oct 2026 17:48:34 +0800 Subject: [PATCH] fix(order): persist cleared courier tracking numbers --- .../com/baiyue/order/entity/OrderEntity.java | 2 ++ .../MerchantOrderCommandTransactionTest.java | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/order/src/main/java/com/baiyue/order/entity/OrderEntity.java b/order/src/main/java/com/baiyue/order/entity/OrderEntity.java index ec298ab30..8b94f22b7 100644 --- a/order/src/main/java/com/baiyue/order/entity/OrderEntity.java +++ b/order/src/main/java/com/baiyue/order/entity/OrderEntity.java @@ -64,6 +64,8 @@ public class OrderEntity extends BaseEntity { private Long rootOrderId; private Integer splitSequence; private String expressCompany; + // 客户清空单号或改用其他交货方式时,必须把 NULL 写入数据库。 + @TableField(updateStrategy = FieldStrategy.ALWAYS) private String expressTrackingNo; private LocalDateTime submittedAt; private LocalDateTime completedAt; diff --git a/order/src/test/java/com/baiyue/order/service/MerchantOrderCommandTransactionTest.java b/order/src/test/java/com/baiyue/order/service/MerchantOrderCommandTransactionTest.java index 22c4c69df..fe71ec2e1 100644 --- a/order/src/test/java/com/baiyue/order/service/MerchantOrderCommandTransactionTest.java +++ b/order/src/test/java/com/baiyue/order/service/MerchantOrderCommandTransactionTest.java @@ -44,6 +44,30 @@ class MerchantOrderCommandTransactionTest { private OrderRequests.SaveRequest draft; private com.baiyue.order.client.FirstlegInboundClient firstleg; + /** 通过真实 MyBatis 和内存数据库验证单号更新及清空,避免空值被更新策略忽略。 */ + @Test + void courierTrackingCanBeClearedAndSwitchingPickupMethodClearsItInDatabase() { + var fields = (com.fasterxml.jackson.databind.node.ObjectNode) json.valueToTree(draft); + fields.remove("carrierSnapshotComplete"); + fields.put("expressTrackingNo", " SF-ORIGINAL "); + var filled = json.convertValue(fields, OrderRequests.SaveRequest.class); + long id = service.createDraft(11L, 7L, "operator", filled, "courier-create"); + assertThat(db.queryForObject("SELECT express_tracking_no FROM ord_order WHERE id=?", String.class, id)) + .isEqualTo("SF-ORIGINAL"); + + fields.remove("expressTrackingNo"); + var blank = json.convertValue(fields, OrderRequests.SaveRequest.class); + service.updateDraft(11L, 7L, id, new OrderRequests.DraftUpdateRequest(0, blank), "courier-clear"); + assertThat(db.queryForObject("SELECT express_tracking_no FROM ord_order WHERE id=?", String.class, id)).isNull(); + + service.updateDraft(11L, 7L, id, new OrderRequests.DraftUpdateRequest(1, filled), "courier-restore"); + fields.put("pickupMethod", "SELF_TRUCK"); + fields.put("expressTrackingNo", "SPOOFED"); + var truck = json.convertValue(fields, OrderRequests.SaveRequest.class); + service.updateDraft(11L, 7L, id, new OrderRequests.DraftUpdateRequest(2, truck), "courier-switch"); + assertThat(db.queryForObject("SELECT express_tracking_no FROM ord_order WHERE id=?", String.class, id)).isNull(); + } + @BeforeEach void prepare() throws Exception { JdbcDataSource source = new JdbcDataSource();