fix(lastleg): 合并客户散板生产查询修复

完整客户标识按字节关联,定向测试与生产只读 SQL 验证通过。
This commit was merged in pull request #45.
This commit is contained in:
2026-11-06 17:25:31 +08:00
2 changed files with 22 additions and 1 deletions
@@ -16,7 +16,9 @@ public interface LocalLooseboardOrderMapper extends BaseMapper<LocalLooseboardOr
+ " WHERE p.source_order_id=ll_local_looseboard_order.lastleg_order_id"
+ " AND p.customer_id=ll_local_looseboard_order.customer_id";
String PICKUP = " FROM ll_warehouse_transfer_order w"
+ " JOIN ll_fleet_pickup_task t ON t.transfer_order_id=w.id AND t.customer_id=w.customer_id"
// 两表客户标识使用各自排序规则,按完整字节身份关联,512 字节覆盖 VARCHAR(128) 的 utf8mb4 上限。
+ " JOIN ll_fleet_pickup_task t ON t.transfer_order_id=w.id"
+ " AND CAST(t.customer_id AS BINARY(512))=CAST(w.customer_id AS BINARY(512))"
+ " JOIN ll_fleet_trip f ON f.trip_no=t.trip_no AND f.status IN ('PLANNED','IN_TRANSIT')"
+ " WHERE w.customer_id=ll_local_looseboard_order.customer_id"
+ " AND w.transfer_no=ll_local_looseboard_order.transfer_no";
@@ -118,6 +118,25 @@ class LocalLooseboardMerchantStatusTest {
assertStatus(1, "COMPLETED");
}
/** 取货关联按完整客户标识匹配,忽略大小写的字段排序和长多字节前缀均不能串用其他客户事实。 */
@Test
void pickupFactsMatchTheEntireCustomerIdentityAcrossTextComparisonRules() {
String customer = "客".repeat(60) + "A";
order(1, customer, "WAITING_INBOUND");
jdbc.execute("ALTER TABLE ll_warehouse_transfer_order ALTER COLUMN customer_id VARCHAR_IGNORECASE(128)");
jdbc.update("INSERT INTO ll_warehouse_transfer_order VALUES(1,'W1',?)", customer);
jdbc.update("INSERT INTO ll_fleet_trip VALUES('T1','IN_TRANSIT')");
jdbc.update("INSERT INTO ll_fleet_pickup_task VALUES(1,'T1',?,'PICKED')", customer);
assertThat(service.merchantDetail(customer, "LB1").summary().status()).isEqualTo("PICKING_UP");
for (String otherCustomer : List.of("客".repeat(60) + "a", "客".repeat(60) + "B")) {
jdbc.update("UPDATE ll_fleet_pickup_task SET customer_id=?", otherCustomer);
assertThat(service.merchantDetail(customer, "LB1").summary().status()).isEqualTo("PENDING_DISPATCH");
assertThat(service.page(customer, query(1, 20, "PICKING_UP")).total()).isZero();
assertThat(service.page(customer, query(1, 20, "PENDING_DISPATCH")).total()).isEqualTo(1);
}
}
/** 取货直送及分车派送按有效排车判断,取消排车和重复托盘关联不污染状态或总数。 */
@Test
void directDeliveryIgnoresCancelledDispatchesAndKeepsSplitDeliveryInTransit() {