From 023b28e31f72569efffc023ab3b3b981e971b14d Mon Sep 17 00:00:00 2001 From: ouyangxq <775153912@qq.com> Date: Fri, 9 Oct 2026 16:31:19 +0800 Subject: [PATCH] fix(lastleg): normalize source key comparisons across MySQL collations --- .../baiyue/lastleg/mapper/LastlegOrderMapper.java | 15 +++++++++++++-- .../lastleg/service/LastlegOrderService.java | 4 ++-- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java index eb19f1692..103c4d6c9 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/mapper/LastlegOrderMapper.java @@ -17,13 +17,24 @@ import java.math.BigDecimal; @Mapper public interface LastlegOrderMapper extends BaseMapper { // Correlate both order identity and customer; never infer a business source from remarks. + // CHAR(128) uses the connection character set/collation on both sides. These keys + // have at most 128 characters; table defaults differ between the fleet and order schemas. String POOL_SOURCE_WHERE = " FROM ll_fleet_pool_order_link l WHERE l.lastleg_order_id=ll_order.id " + - "AND l.customer_id=ll_order.customer_id AND ll_order.order_type='WAREHOUSE_TRANSFER'"; + "AND CAST(l.customer_id AS CHAR(128))=CAST(ll_order.customer_id AS CHAR(128)) " + + "AND ll_order.order_type='WAREHOUSE_TRANSFER'"; String BUSINESS_TYPE_SQL = "COALESCE((SELECT l.business_type" + POOL_SOURCE_WHERE + "),ll_order.order_type)"; String BUSINESS_ORDER_NO_SQL = "COALESCE((SELECT l.business_order_no" + POOL_SOURCE_WHERE + "),CASE WHEN ll_order.order_type='LOCAL_LOOSEBOARD' THEN ll_order.source_order_no END)"; + // Compare each authoritative column separately: MySQL COALESCE across these tables + // has no single collation and cannot safely be compared with a bound string. + String BUSINESS_TYPE_FILTER_SQL = "(EXISTS(SELECT 1" + POOL_SOURCE_WHERE + " AND l.business_type={0}) OR " + + "(ll_order.order_type={0} AND NOT EXISTS(SELECT 1" + POOL_SOURCE_WHERE + ")))"; + String BUSINESS_ORDER_NO_FILTER_SQL = "(EXISTS(SELECT 1" + POOL_SOURCE_WHERE + + " AND l.business_order_no LIKE CONCAT('%',{0},'%')) OR (ll_order.order_type='LOCAL_LOOSEBOARD' " + + "AND ll_order.source_order_no LIKE CONCAT('%',{0},'%')))"; String EXTERNAL_BOOKING_NO_SQL = "(SELECT b.booking_no FROM ll_fleet_external_booking b " + - "WHERE b.customer_id=ll_order.customer_id AND b.incoming_no=ll_order.source_order_no " + + "WHERE CAST(b.customer_id AS CHAR(128))=CAST(ll_order.customer_id AS CHAR(128)) " + + "AND CAST(b.incoming_no AS CHAR(128))=CAST(ll_order.source_order_no AS CHAR(128)) " + "AND ll_order.order_type='WAREHOUSE_TRANSFER')"; @Select("