fix(order): persist cleared courier tracking numbers

This commit is contained in:
2026-10-19 17:48:34 +08:00
parent 766e199c9b
commit bb917c954c
2 changed files with 26 additions and 0 deletions
@@ -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;
@@ -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();