From 93feb7da67557daf056eb93547bc8ba31633fd43 Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Sat, 22 Aug 2026 10:16:45 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../event/FirstLegLoadingPlanCompletedV2.java | 2 +- deploy/sql/头程数据库统一增量-MySQL8.sql | 17 ++++++++ deploy/sql/海外区域统一增量-MySQL8.sql | 8 ++-- .../mapper/LoadingCartonManifestMapper.java | 2 +- .../LoadingCompletedOutboxService.java | 14 +++++-- .../LoadingCompletedOutboxServiceTest.java | 19 +++++++++ lastleg-service/AGENTS.md | 2 +- .../inboundplan/entity/InboundPlanCarton.java | 2 +- .../service/InventoryCommandService.java | 39 +++++++++++++------ .../mapper/InventoryBalanceMapper.java | 10 ++--- .../service/LoadingCompletedConsumer.java | 10 ++--- .../src/main/resources/db/lastleg.sql | 8 ++-- .../InventorySchemaContractTest.java | 5 ++- .../command/InventoryCommandServiceTest.java | 30 +++++++++++--- .../service/LoadingCompletedConsumerTest.java | 3 +- scripts/db/incremental.sql | 23 +++++++++++ 16 files changed, 150 insertions(+), 44 deletions(-) diff --git a/common-event-contract/src/main/java/com/baiyue/common/event/FirstLegLoadingPlanCompletedV2.java b/common-event-contract/src/main/java/com/baiyue/common/event/FirstLegLoadingPlanCompletedV2.java index 07e473d43..cb0d36542 100644 --- a/common-event-contract/src/main/java/com/baiyue/common/event/FirstLegLoadingPlanCompletedV2.java +++ b/common-event-contract/src/main/java/com/baiyue/common/event/FirstLegLoadingPlanCompletedV2.java @@ -47,7 +47,7 @@ public record FirstLegLoadingPlanCompletedV2( String shipmentNo, String shippingMark, String customerRemark, String internalRemark, String warehouseRemark, String palletNo, - /** 头程箱唛二维码中的箱号;这些箱号均对应本明细的 skuCode。 */ + /** 按实装箱数稳定随机冻结的头程箱号;数量与 packageCount 相等且均对应本明细 SKU。 */ List cartonMarks) { public Item { cartonMarks = cartonMarks == null ? List.of() : cartonMarks; diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index a8dd32542..04ffdcd30 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -16229,6 +16229,23 @@ PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_dispatch_pallet_lock' AND column_name='dispatch_order_id' AND is_nullable='YES'), 'SELECT 1', 'ALTER TABLE ll_dispatch_pallet_lock MODIFY COLUMN dispatch_order_id BIGINT NULL COMMENT ''正式派车单ID,草稿锁阶段为空''')); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; +-- 尾程库存余额按客户入仓单与海外目的仓汇总箱数,SKU仅保留为快照。 +SET @ddl = (SELECT CASE + WHEN EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() + AND table_name='ll_inventory_balance' AND index_name='uk_ll_inventory_dimension' AND column_name='sku_code') + THEN 'ALTER TABLE ll_inventory_balance DROP INDEX uk_ll_inventory_dimension, ADD UNIQUE KEY uk_ll_inventory_dimension (customer_id,overseas_warehouse_id,destination_warehouse_code,inbound_order_id,inbound_code)' + WHEN NOT EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() + AND table_name='ll_inventory_balance' AND index_name='uk_ll_inventory_dimension') + THEN 'ALTER TABLE ll_inventory_balance ADD UNIQUE KEY uk_ll_inventory_dimension (customer_id,overseas_warehouse_id,destination_warehouse_code,inbound_order_id,inbound_code)' + ELSE 'SELECT 1' END); +PREPARE lastleg_inventory_dimension_stmt FROM @ddl; EXECUTE lastleg_inventory_dimension_stmt; DEALLOCATE PREPARE lastleg_inventory_dimension_stmt; +SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() + AND table_name='ll_inventory_balance' AND column_name='sku_code'), + 'ALTER TABLE ll_inventory_balance MODIFY COLUMN sku_code VARCHAR(128) NOT NULL DEFAULT ''UNSPECIFIED'' COMMENT ''SKU快照;多SKU汇总时为MIXED,不参与当前库存唯一维度''', + 'SELECT 1')); +PREPARE lastleg_inventory_dimension_stmt FROM @ddl; EXECUTE lastleg_inventory_dimension_stmt; DEALLOCATE PREPARE lastleg_inventory_dimension_stmt; +ALTER TABLE ll_inventory_balance COMMENT='客户入仓单与海外目的仓维度实时库存余额'; + CALL baiyue_firstleg.assert_unified_final_schema(); DROP PROCEDURE IF EXISTS baiyue_firstleg.assert_unified_final_schema; SELECT 'PASS' AS migration_status, diff --git a/deploy/sql/海外区域统一增量-MySQL8.sql b/deploy/sql/海外区域统一增量-MySQL8.sql index 2d11c36ba..cc337567d 100644 --- a/deploy/sql/海外区域统一增量-MySQL8.sql +++ b/deploy/sql/海外区域统一增量-MySQL8.sql @@ -235,7 +235,8 @@ SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE PREPARE phase4_inbound_stmt FROM @ddl; EXECUTE phase4_inbound_stmt; DEALLOCATE PREPARE phase4_inbound_stmt; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inventory_balance' AND column_name='sku_code'), - 'SELECT 1', 'ALTER TABLE ll_inventory_balance ADD COLUMN sku_code VARCHAR(128) NOT NULL DEFAULT ''UNSPECIFIED'' COMMENT ''SKU编码;无SKU使用UNSPECIFIED'' AFTER inbound_code')); + 'ALTER TABLE ll_inventory_balance MODIFY COLUMN sku_code VARCHAR(128) NOT NULL DEFAULT ''UNSPECIFIED'' COMMENT ''SKU快照;多SKU汇总时为MIXED,不参与当前库存唯一维度''', + 'ALTER TABLE ll_inventory_balance ADD COLUMN sku_code VARCHAR(128) NOT NULL DEFAULT ''UNSPECIFIED'' COMMENT ''SKU快照;多SKU汇总时为MIXED,不参与当前库存唯一维度'' AFTER inbound_code')); PREPARE phase4_inventory_stmt FROM @ddl; EXECUTE phase4_inventory_stmt; DEALLOCATE PREPARE phase4_inventory_stmt; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_inventory_balance' AND column_name='product_name_zh'), 'SELECT 1', 'ALTER TABLE ll_inventory_balance ADD COLUMN product_name_zh VARCHAR(255) NULL COMMENT ''中文品名快照'' AFTER sku_code')); @@ -248,8 +249,9 @@ SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE 'ALTER TABLE ll_inventory_balance DROP INDEX uk_ll_inventory_dimension', 'SELECT 1')); PREPARE phase4_inventory_stmt FROM @ddl; EXECUTE phase4_inventory_stmt; DEALLOCATE PREPARE phase4_inventory_stmt; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_inventory_balance' AND index_name='uk_ll_inventory_dimension'), - 'SELECT 1', 'ALTER TABLE ll_inventory_balance ADD UNIQUE KEY uk_ll_inventory_dimension (customer_id,overseas_warehouse_id,destination_warehouse_code,inbound_order_id,inbound_code,sku_code)')); + 'SELECT 1', 'ALTER TABLE ll_inventory_balance ADD UNIQUE KEY uk_ll_inventory_dimension (customer_id,overseas_warehouse_id,destination_warehouse_code,inbound_order_id,inbound_code)')); PREPARE phase4_inventory_stmt FROM @ddl; EXECUTE phase4_inventory_stmt; DEALLOCATE PREPARE phase4_inventory_stmt; +ALTER TABLE ll_inventory_balance COMMENT='客户入仓单与海外目的仓维度实时库存余额'; SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_inventory_balance' AND index_name='idx_ll_inventory_sku'), 'SELECT 1', 'ALTER TABLE ll_inventory_balance ADD KEY idx_ll_inventory_sku (customer_id,sku_code,updated_at)')); PREPARE phase4_inventory_stmt FROM @ddl; EXECUTE phase4_inventory_stmt; DEALLOCATE PREPARE phase4_inventory_stmt; @@ -270,4 +272,4 @@ SET @ddl = (SELECT IF(EXISTS (SELECT 1 FROM information_schema.statistics WHERE 'SELECT 1', 'ALTER TABLE ll_inbound_stock_receipt ADD UNIQUE KEY uk_ll_stock_receipt_task_allocation_sku (customer_id,task_id,allocation_id,sku_code)')); PREPARE phase4_inventory_stmt FROM @ddl; EXECUTE phase4_inventory_stmt; DEALLOCATE PREPARE phase4_inventory_stmt; -SELECT 'PASS' AS migration_status, '海外仓报价、月度汇率、车辆主数据、海外业务与SKU库存结构已就绪' AS message; +SELECT 'PASS' AS migration_status, '海外仓报价、月度汇率、车辆主数据、海外业务与入仓单目的仓库存结构已就绪' AS message; diff --git a/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingCartonManifestMapper.java b/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingCartonManifestMapper.java index 4ee4e2079..70eecdaf7 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingCartonManifestMapper.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/mapper/LoadingCartonManifestMapper.java @@ -6,7 +6,7 @@ import org.apache.ibatis.annotations.Select; import java.util.List; -/** 读取国内已打印的稳定箱唛池;普通装柜不在国内逐箱确认归属。 */ +/** 读取国内已打印的稳定箱唛池,供装柜完成事件按实装箱数抽取冻结。 */ @Mapper public interface LoadingCartonManifestMapper { @Select(""" diff --git a/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java b/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java index c0abb9c50..2249da91b 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/service/LoadingCompletedOutboxService.java @@ -24,6 +24,7 @@ import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; import java.time.Instant; import java.time.LocalDateTime; import java.util.ArrayList; @@ -102,9 +103,7 @@ public class LoadingCompletedOutboxService { sum(sorted, Row::getVolumeCbm), items, string(first.getAccountId()), orderType, pallets); } - /** - * 国内只确认本柜实装箱数,不扫每张箱唛。事件携带全量可用标签池,海外首扫才确权具体箱唛。 - */ + /** 国内按实装箱数从可用标签池稳定随机抽取箱唛,重复发布同一计划时结果不变。 */ private Map> cartonLabelPools(List rows) { Map> result = new java.util.LinkedHashMap<>(); for (Row row : rows) { @@ -122,7 +121,14 @@ public class LoadingCompletedOutboxService { if (labels.size() < Objects.requireNonNullElse(row.getPackageCount(), 0)) { throw new BizException(ResultCode.CONFLICT, "装柜明细箱唛数量少于实装箱数,不能生成海外交接事件"); } - result.put(row.getLoadingPlanItemId(), labels); + int loadedPackages = Objects.requireNonNullElse(row.getPackageCount(), 0); + String seed = row.getLoadingPlanId() + ":" + row.getLoadingPlanItemId(); + List selected = labels.stream() + .sorted(Comparator.comparing(label -> EventPayloadHash.sha256( + (seed + ":" + label).getBytes(StandardCharsets.UTF_8)))) + .limit(loadedPackages) + .toList(); + result.put(row.getLoadingPlanItemId(), selected); } return result; } diff --git a/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java b/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java index 46bf81b01..0a3156576 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/service/LoadingCompletedOutboxServiceTest.java @@ -68,6 +68,25 @@ class LoadingCompletedOutboxServiceTest { .hasMessageContaining("缺少 SKU"); } + @Test void freezesExactlyLoadedPackagesFromLabelPoolDeterministically() throws Exception { + Row value = row(11, 100, 101); + value.setPackageCount(2); + when(snapshots.rows(90L)).thenReturn(List.of(value)); + when(manifests.labelPool(11L, 100L, 101L)).thenReturn( + List.of("BOX-001", "BOX-002", "BOX-003", "BOX-004")); + + service.publish(90L); + service.publish(90L); + + ArgumentCaptor captor = ArgumentCaptor.forClass(InboundOutboxEntity.class); + verify(outbox, org.mockito.Mockito.times(2)).insert(captor.capture()); + EventEnvelope first = mapper.readValue(captor.getAllValues().get(0).getPayloadJson(), EventEnvelope.class); + EventEnvelope second = mapper.readValue(captor.getAllValues().get(1).getPayloadJson(), EventEnvelope.class); + assertThat(first.payload().at("/orders/0/items/0/cartonMarks")).hasSize(2); + assertThat(first.payload().at("/orders/0/items/0/cartonMarks")) + .isEqualTo(second.payload().at("/orders/0/items/0/cartonMarks")); + } + @Test void snapshotOnlyPublishesFinalizedLoadedInbounds() throws Exception { String sql = String.join(" ", LoadingCompletedEventMapper.class.getMethod("rows", long.class) .getAnnotation(Select.class).value()).replaceAll("\\s+", " "); diff --git a/lastleg-service/AGENTS.md b/lastleg-service/AGENTS.md index 610dcc444..797c96a9c 100644 --- a/lastleg-service/AGENTS.md +++ b/lastleg-service/AGENTS.md @@ -76,7 +76,7 @@ - 平台查询范围由可信身份/平台权限决定;商户查询只能使用认证身份中的客户 ID。 - 尾程平台只读查询接口的 `customerId` 为可选筛选条件:平台身份省略时查询全部客户数据,传入时按指定客户过滤;商户身份忽略客户端传入值并始终按 Token 中的自身客户隔离。创建、编辑、审核等需要明确目标客户的写接口仍必须传入 `customerId`。 -- 常规入仓库存余额以客户、海外仓、目的仓、入仓单和 SKU 为唯一业务维度;PDA 完成入库时按冻结商品明细精确拆分 SKU 箱数,转仓收货继承来源库存 SKU,不得回退为仅按入仓单汇总。 +- 常规入仓库存余额以客户、海外仓、目的仓和入仓单为唯一业务维度并汇总箱数;SKU 继续保存在箱唛、实收和流水快照中,余额 SKU 仅作单 SKU 展示或以 `MIXED` 标识多 SKU,不参与当前唯一维度。 - 列表、详情、导出和更新必须使用同一租户边界,不能仅在列表过滤而让详情或更新越权。 - 目的仓变更必须写状态/操作历史或审计证据,并使用版本控制防止并发覆盖。 - 货物废弃只使用可核对 SKU 和箱唛的一件代发库存。创建申请只能将箱从 `AVAILABLE` 锁定为 `DISCARD_PENDING`,不得扣减 SKU 箱数;实际扣库存节点固定为具备 `lastleg:cargo-discard:approve` 权限的仓库/PDA 审核人确认废弃时,并且必须在审核事务内调用专用 discard adjustment。该 adjustment 必须将箱改为 `DISCARDED`、写逐箱业务流水及唯一幂等键,并校验 `扣减前箱数 - 废弃箱数 = 扣减后箱数` 且逐箱数等于申请总箱数;任一环节失败须整体回滚。拒绝申请只释放锁箱,不得扣库存。 diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/entity/InboundPlanCarton.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/entity/InboundPlanCarton.java index 7229b4498..eea6b53da 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/entity/InboundPlanCarton.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inboundplan/entity/InboundPlanCarton.java @@ -7,7 +7,7 @@ import lombok.Data; import java.time.LocalDateTime; -/** 本柜在国内冻结、由海外首次扫码确权的箱级作业事实。 */ +/** 头程装柜完成时冻结并关联尾程订单、由海外扫码补充托盘归属的箱级事实。 */ @Data @TableName("ll_inbound_plan_carton") public class InboundPlanCarton { diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/command/service/InventoryCommandService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/command/service/InventoryCommandService.java index 0dfdb2e1e..cc8d917af 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/command/service/InventoryCommandService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/command/service/InventoryCommandService.java @@ -48,7 +48,7 @@ public class InventoryCommandService { balance.setInTransitPackages(before + request.packages()); touch(balance); balances.updateById(balance); - ledger(customerId, operatorId, operation.getId(), balance, null, "IN_TRANSIT", + ledger(customerId, operatorId, operation.getId(), balance, null, sku(request.skuCode()), "IN_TRANSIT", "OUTSIDE", "IN_TRANSIT", before, request.packages(), before + request.packages(), request.businessOrderNo(), request.inboundOrderNo(), null, request.sourceEventId(), request.idempotencyKey(), request.remark()); @@ -74,7 +74,7 @@ public class InventoryCommandService { balance.setAvailablePackages(value(balance.getAvailablePackages()) + request.packages()); touch(balance); balances.updateById(balance); - ledger(customerId, operatorId, operation.getId(), balance, position, "STOCK_IN", + ledger(customerId, operatorId, operation.getId(), balance, position, sku(request.skuCode()), "STOCK_IN", transferred == request.packages() ? "IN_TRANSIT" : "OUTSIDE", "AVAILABLE", before, request.packages(), before + request.packages(), request.businessOrderNo(), request.inboundOrderNo(), null, request.sourceEventId(), @@ -138,7 +138,7 @@ public class InventoryCommandService { balances.updateById(balance); boolean palletEmpty = commands.palletPackages(customerId, position.getPalletId()) == 0; if (palletEmpty) warehouseGateway.scrapPallet(customerId, position.getPalletId()); - ledger(customerId, operatorId, operation.getId(), balance, position, "SHIP", + ledger(customerId, operatorId, operation.getId(), balance, position, balance.getSkuCode(), "SHIP", "PICKED", "SHIPPED", before, -request.packages(), before - request.packages(), request.businessOrderNo(), null, request.outboundOrderNo(), request.sourceEventId(), request.idempotencyKey(), request.remark()); @@ -170,7 +170,7 @@ public class InventoryCommandService { balance.setAvailablePackages(balanceAfter); touch(balance); balances.updateById(balance); - ledger(customerId, operatorId, operation.getId(), balance, position, "ADJUST", + ledger(customerId, operatorId, operation.getId(), balance, position, balance.getSkuCode(), "ADJUST", "AVAILABLE", "AVAILABLE", before, request.packageDelta(), after, request.businessOrderNo(), null, null, null, request.idempotencyKey(), request.reason() + remarkSuffix(request.remark())); @@ -202,7 +202,7 @@ public class InventoryCommandService { packages(balance, to, packages(balance, to) + request.packages()); touch(balance); balances.updateById(balance); - ledger(customerId, operatorId, operation.getId(), balance, position, operationType, + ledger(customerId, operatorId, operation.getId(), balance, position, balance.getSkuCode(), operationType, from.name(), to.name(), beforeTarget, request.packages(), beforeTarget + request.packages(), request.businessOrderNo(), null, request.outboundOrderNo(), request.sourceEventId(), request.idempotencyKey(), request.remark()); @@ -234,8 +234,11 @@ public class InventoryCommandService { String productNameEn) { String skuCode = sku(requestedSkuCode); InventoryBalance balance = balances.lockDimension(customerId, overseasWarehouseId, - destinationWarehouseCode, inboundOrderId, inboundCode, skuCode); - if (balance != null) return balance; + destinationWarehouseCode, inboundOrderId, inboundCode); + if (balance != null) { + mergeSkuSnapshot(balance, skuCode); + return balance; + } balance = new InventoryBalance(); balance.setId(IdWorker.getId()); balance.setCustomerId(customerId); @@ -261,8 +264,11 @@ public class InventoryCommandService { return balance; } catch (DuplicateKeyException exception) { InventoryBalance concurrent = balances.lockDimension(customerId, overseasWarehouseId, - destinationWarehouseCode, inboundOrderId, inboundCode, skuCode); - if (concurrent != null) return concurrent; + destinationWarehouseCode, inboundOrderId, inboundCode); + if (concurrent != null) { + mergeSkuSnapshot(concurrent, skuCode); + return concurrent; + } throw exception; } } @@ -365,7 +371,7 @@ public class InventoryCommandService { } private void ledger(String customerId, String operatorId, Long operationId, InventoryBalance balance, - InventoryPosition position, String businessType, String from, String to, + InventoryPosition position, String skuCode, String businessType, String from, String to, long beforePackages, long deltaPackages, long afterPackages, String businessOrderNo, String inboundOrderNo, String outboundOrderNo, String sourceEventId, String idempotencyKey, String remark) { @@ -381,7 +387,7 @@ public class InventoryCommandService { ledger.setPalletNo(position == null ? null : position.getPalletNo()); ledger.setBatchNo(position == null ? null : position.getBatchNo()); ledger.setWarehouseLocationCode(position == null ? null : position.getWarehouseLocationCode()); - ledger.setSkuCode(balance.getSkuCode()); + ledger.setSkuCode(skuCode); ledger.setBusinessType(businessType); ledger.setBusinessOrderId(balance.getInboundOrderId()); ledger.setBusinessOrderNo(trim(businessOrderNo)); @@ -406,6 +412,17 @@ public class InventoryCommandService { ledgers.insert(ledger); } + private static void mergeSkuSnapshot(InventoryBalance balance, String skuCode) { + String existing = trim(balance.getSkuCode()); + if (existing == null) { + balance.setSkuCode(skuCode); + } else if (!existing.equals(skuCode) && !"MIXED".equals(existing)) { + balance.setSkuCode("MIXED"); + balance.setProductNameZh(null); + balance.setProductNameEn(null); + } + } + private InventoryCommandResponse response(InventoryOperation operation, InventoryBalance balance, InventoryPosition position, boolean palletEmpty) { return new InventoryCommandResponse(operation.getId(), operation.getOperationType(), balance.getId(), diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/mapper/InventoryBalanceMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/mapper/InventoryBalanceMapper.java index 16cd696b0..437a9dcab 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/mapper/InventoryBalanceMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/inventory/mapper/InventoryBalanceMapper.java @@ -12,24 +12,22 @@ public interface InventoryBalanceMapper extends BaseMapper { @Select("SELECT * FROM ll_inventory_balance WHERE customer_id=#{customerId} " + "AND overseas_warehouse_id=#{overseasWarehouseId} " + "AND destination_warehouse_code=#{destinationWarehouseCode} " + - "AND inbound_order_id=#{inboundOrderId} AND inbound_code=#{inboundCode} AND sku_code=#{skuCode} LIMIT 1") + "AND inbound_order_id=#{inboundOrderId} AND inbound_code=#{inboundCode} LIMIT 1") InventoryBalance findDimension(@Param("customerId") String customerId, @Param("overseasWarehouseId") String overseasWarehouseId, @Param("destinationWarehouseCode") String destinationWarehouseCode, @Param("inboundOrderId") Long inboundOrderId, - @Param("inboundCode") String inboundCode, - @Param("skuCode") String skuCode); + @Param("inboundCode") String inboundCode); @Select("SELECT * FROM ll_inventory_balance WHERE customer_id=#{customerId} " + "AND overseas_warehouse_id=#{overseasWarehouseId} " + "AND destination_warehouse_code=#{destinationWarehouseCode} " + - "AND inbound_order_id=#{inboundOrderId} AND inbound_code=#{inboundCode} AND sku_code=#{skuCode} LIMIT 1 FOR UPDATE") + "AND inbound_order_id=#{inboundOrderId} AND inbound_code=#{inboundCode} LIMIT 1 FOR UPDATE") InventoryBalance lockDimension(@Param("customerId") String customerId, @Param("overseasWarehouseId") String overseasWarehouseId, @Param("destinationWarehouseCode") String destinationWarehouseCode, @Param("inboundOrderId") Long inboundOrderId, - @Param("inboundCode") String inboundCode, - @Param("skuCode") String skuCode); + @Param("inboundCode") String inboundCode); @Select("