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();