fix(lastleg): match looseboard pickup customer identity across collations
This commit is contained in:
+3
-1
@@ -16,7 +16,9 @@ public interface LocalLooseboardOrderMapper extends BaseMapper<LocalLooseboardOr
|
|||||||
+ " WHERE p.source_order_id=ll_local_looseboard_order.lastleg_order_id"
|
+ " WHERE p.source_order_id=ll_local_looseboard_order.lastleg_order_id"
|
||||||
+ " AND p.customer_id=ll_local_looseboard_order.customer_id";
|
+ " AND p.customer_id=ll_local_looseboard_order.customer_id";
|
||||||
String PICKUP = " FROM ll_warehouse_transfer_order w"
|
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')"
|
+ " 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"
|
+ " WHERE w.customer_id=ll_local_looseboard_order.customer_id"
|
||||||
+ " AND w.transfer_no=ll_local_looseboard_order.transfer_no";
|
+ " AND w.transfer_no=ll_local_looseboard_order.transfer_no";
|
||||||
|
|||||||
+19
@@ -118,6 +118,25 @@ class LocalLooseboardMerchantStatusTest {
|
|||||||
assertStatus(1, "COMPLETED");
|
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
|
@Test
|
||||||
void directDeliveryIgnoresCancelledDispatchesAndKeepsSplitDeliveryInTransit() {
|
void directDeliveryIgnoresCancelledDispatchesAndKeepsSplitDeliveryInTransit() {
|
||||||
|
|||||||
Reference in New Issue
Block a user