生产更新:同步已提交的海外仓分析及业务修复(2026-10-16) #27

Merged
admin merged 138 commits from test into main 2026-10-16 18:02:59 +08:00
2 changed files with 21 additions and 8 deletions
Showing only changes of commit f7a871e3e4 - Show all commits
@@ -10,18 +10,19 @@ import java.util.List;
/** Receipt/merge projections plus immutable outbound SKU movements. */
@Mapper
public interface ReturnInventoryMovementMapper extends com.baomidou.mybatisplus.core.mapper.BaseMapper<com.baiyue.lastleg.returnreceipt.entity.ReturnInventoryOutboundMovement> {
String MOVEMENTS = "SELECT o.customer_id customerId,o.overseas_warehouse_id overseasWarehouseId,ri.sku_code skuCode,oi.product_name_zh productNameZh," +
"'RECEIPT' movementType,r.receipt_no referenceNo,ri.received_quantity totalDelta,ri.received_quantity availableDelta,r.signed_at occurredAt " +
// UNION text projections must not inherit differing source-table or connection collations.
String MOVEMENTS = "SELECT CONVERT(o.customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci customerId,CONVERT(o.overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci overseasWarehouseId,CONVERT(ri.sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci skuCode,CONVERT(oi.product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci productNameZh," +
"CONVERT('RECEIPT' USING utf8mb4) COLLATE utf8mb4_unicode_ci movementType,CONVERT(r.receipt_no USING utf8mb4) COLLATE utf8mb4_unicode_ci referenceNo,ri.received_quantity totalDelta,ri.received_quantity availableDelta,r.signed_at occurredAt " +
"FROM ll_return_receipt r JOIN ll_return_order o ON o.id=r.return_order_id JOIN ll_return_receipt_item ri ON ri.receipt_id=r.id " +
"JOIN ll_return_order_item oi ON oi.id=ri.return_order_item_id " +
"UNION ALL SELECT c.customer_id,c.overseas_warehouse_id,i.sku_code,i.product_name_zh,'MERGE',c.carton_mark,0,-i.quantity,c.created_at " +
"UNION ALL SELECT CONVERT(c.customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(c.overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(i.sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(i.product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT('MERGE' USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(c.carton_mark USING utf8mb4) COLLATE utf8mb4_unicode_ci,0,-i.quantity,c.created_at " +
"FROM ll_return_inventory_carton c JOIN ll_return_inventory_carton_item i ON i.carton_id=c.id WHERE c.source_batch_no='MERGED'" +
" UNION ALL SELECT customer_id,overseas_warehouse_id,sku_code,product_name_zh,'OUTBOUND',outbound_no," +
" UNION ALL SELECT CONVERT(customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT('OUTBOUND' USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(outbound_no USING utf8mb4) COLLATE utf8mb4_unicode_ci," +
"-quantity,-quantity,occurred_at FROM ll_return_inventory_outbound_movement" +
" UNION ALL SELECT customer_id,overseas_warehouse_id,old_sku_code,product_name_zh,'SKU_CONVERSION_OUT',relabel_no,-quantity,-quantity,completed_at FROM ll_return_sku_conversion" +
" UNION ALL SELECT customer_id,overseas_warehouse_id,new_sku_code,product_name_zh,'SKU_CONVERSION_IN',relabel_no,quantity,quantity,completed_at FROM ll_return_sku_conversion" +
" UNION ALL SELECT customer_id,overseas_warehouse_id,old_sku_code,product_name_zh,'SKU_CONVERSION_REVERSE_IN',relabel_no,quantity,quantity,reversed_at FROM ll_return_sku_conversion WHERE status='REVERSED'" +
" UNION ALL SELECT customer_id,overseas_warehouse_id,new_sku_code,product_name_zh,'SKU_CONVERSION_REVERSE_OUT',relabel_no,-quantity,-quantity,reversed_at FROM ll_return_sku_conversion WHERE status='REVERSED'";
" UNION ALL SELECT CONVERT(customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(old_sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT('SKU_CONVERSION_OUT' USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(relabel_no USING utf8mb4) COLLATE utf8mb4_unicode_ci,-quantity,-quantity,completed_at FROM ll_return_sku_conversion" +
" UNION ALL SELECT CONVERT(customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(new_sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT('SKU_CONVERSION_IN' USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(relabel_no USING utf8mb4) COLLATE utf8mb4_unicode_ci,quantity,quantity,completed_at FROM ll_return_sku_conversion" +
" UNION ALL SELECT CONVERT(customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(old_sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT('SKU_CONVERSION_REVERSE_IN' USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(relabel_no USING utf8mb4) COLLATE utf8mb4_unicode_ci,quantity,quantity,reversed_at FROM ll_return_sku_conversion WHERE status='REVERSED'" +
" UNION ALL SELECT CONVERT(customer_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(overseas_warehouse_id USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(new_sku_code USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(product_name_zh USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT('SKU_CONVERSION_REVERSE_OUT' USING utf8mb4) COLLATE utf8mb4_unicode_ci,CONVERT(relabel_no USING utf8mb4) COLLATE utf8mb4_unicode_ci,-quantity,-quantity,reversed_at FROM ll_return_sku_conversion WHERE status='REVERSED'";
@Select("<script>SELECT COUNT(*) FROM (" + MOVEMENTS + ") m WHERE 1=1 " +
"<if test='customerId != null and customerId != \"\"'>AND m.customerId=#{customerId} </if>" +
@@ -58,6 +58,18 @@ class ReturnOutboundPdaPersistenceTest {
for (Class<?> mapper : List.of(OutboundOrderMapper.class, OutboundPalletItemMapper.class,
OutboundPdaTaskMapper.class, OutboundPdaPickMapper.class, DeliveryOrderMapper.class, ReturnInventoryCartonMapper.class,
ReturnInventoryCartonItemMapper.class, ReturnInventoryBalanceMapper.class, ReturnInventoryMovementMapper.class)) configuration.addMapper(mapper);
// H2 does not implement MySQL charset/collation expressions. Preserve the real
// movement query and bindings, removing only those expressions in this H2 fixture.
for (String method : List.of("platformCount", "platformPage")) {
var statement = configuration.getMappedStatement(ReturnInventoryMovementMapper.class.getName() + "." + method);
var mysqlSource = statement.getSqlSource();
org.apache.ibatis.mapping.SqlSource h2Source = params -> {
var bound = mysqlSource.getBoundSql(params);
String sql = bound.getSql().replaceAll("CONVERT\\(([^()]+) USING utf8mb4\\) COLLATE utf8mb4_unicode_ci", "$1");
return new org.apache.ibatis.mapping.BoundSql(configuration, sql, bound.getParameterMappings(), params);
};
ReflectionTestUtils.setField(statement, "sqlSource", h2Source);
}
var factory = new MybatisSqlSessionFactoryBean(); factory.setDataSource(ds); factory.setConfiguration(configuration);
var session = new SqlSessionTemplate(factory.getObject());
movementMapper = session.getMapper(ReturnInventoryMovementMapper.class);