From 471e50ffe1e7d01d1e7264ed47c304eb563815ca Mon Sep 17 00:00:00 2001 From: liuyihe <2513762445@qq.com> Date: Wed, 14 Oct 2026 18:01:25 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- deploy/sql/README.md | 2 + .../V25__cargo_discard_generic_inventory.sql | 24 +++ deploy/sql/海外区域统一增量-MySQL8.sql | 34 ++++- .../service/DeliveryTransferService.java | 1 + .../discard/dto/CargoDiscardRequests.java | 9 +- .../discard/dto/CargoDiscardResponses.java | 27 +++- .../discard/entity/CargoDiscardCarton.java | 1 + .../discard/entity/CargoDiscardItem.java | 3 + .../mapper/CargoDiscardInventoryMapper.java | 60 ++++++++ .../model/CargoDiscardStockCartonRow.java | 12 ++ .../controller/PdaCargoDiscardController.java | 2 +- .../discard/pda/dto/PdaCargoDiscardDtos.java | 12 +- .../pda/service/PdaCargoDiscardService.java | 80 +++++++--- ...argoDiscardInventoryAdjustmentService.java | 6 + .../service/CargoDiscardOutboundService.java | 123 +++++++++++++++ .../discard/service/CargoDiscardService.java | 104 ++++++++++--- .../service/CargoDiscardStockService.java | 142 ++++++++++++++++++ .../mapper/DispatchCandidateMapper.java | 4 +- .../dispatch/service/DispatchService.java | 6 +- .../service/InventoryCommandService.java | 34 +++++ .../pda/service/PdaRelabelService.java | 4 +- .../service/RelabelApplicationService.java | 10 +- .../relabel/service/RelabelBindingGuard.java | 4 +- .../src/main/resources/db/lastleg.sql | 9 +- .../openapi/cargo-discard-photos-v1.yaml | 28 +++- .../openapi/overseas-business-v1.yaml | 2 +- .../openapi/overseas-pda-operations-v1.yaml | 3 +- .../service/PdaCargoDiscardServiceTest.java | 58 ++++++- .../CargoDiscardOutboundServiceTest.java | 98 ++++++++++++ .../service/CargoDiscardServiceTest.java | 32 +++- .../service/CargoDiscardStockServiceTest.java | 132 ++++++++++++++++ .../command/InventoryCommandServiceTest.java | 29 ++++ .../pda/service/PdaRelabelServiceTest.java | 34 +++++ scripts/db/incremental.sql | 30 ++++ 34 files changed, 1088 insertions(+), 71 deletions(-) create mode 100644 deploy/sql/migrations/overseas/baiyue_lastleg/V25__cargo_discard_generic_inventory.sql create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/discard/model/CargoDiscardStockCartonRow.java create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/discard/service/CargoDiscardOutboundService.java create mode 100644 lastleg-service/src/main/java/com/baiyue/lastleg/discard/service/CargoDiscardStockService.java create mode 100644 lastleg-service/src/test/java/com/baiyue/lastleg/discard/service/CargoDiscardOutboundServiceTest.java create mode 100644 lastleg-service/src/test/java/com/baiyue/lastleg/discard/service/CargoDiscardStockServiceTest.java diff --git a/deploy/sql/README.md b/deploy/sql/README.md index c2464d426..4f4473640 100644 --- a/deploy/sql/README.md +++ b/deploy/sql/README.md @@ -149,3 +149,5 @@ node --test scripts/admin-test-env-modules/initialization-baseline-contract.test 码头车队邮件配置见 [Firstleg 车队邮件](../../firstleg/docs/terminal-drayage-mail.md)。 `migrations/overseas/baiyue_lastleg/V24__cargo_discard_photos.sql` 仅新增废弃照片关联表,按客户、申请和托盘关联文件及提交时间。与 Lastleg、File 和三端照片功能共同发布;不回填历史废弃单,不修改库存。脚本存在不表示目标环境已执行。 + +货物废弃通用库存与散箱字段迁移:`migrations/overseas/baiyue_lastleg/V25__cargo_discard_generic_inventory.sql`。新增库存仓位关联及箱唛快照,须先迁移再部署 Lastleg;不回填历史废弃单。 diff --git a/deploy/sql/migrations/overseas/baiyue_lastleg/V25__cargo_discard_generic_inventory.sql b/deploy/sql/migrations/overseas/baiyue_lastleg/V25__cargo_discard_generic_inventory.sql new file mode 100644 index 000000000..4e79aa929 --- /dev/null +++ b/deploy/sql/migrations/overseas/baiyue_lastleg/V25__cargo_discard_generic_inventory.sql @@ -0,0 +1,24 @@ +-- 货物废弃支持所有入库来源及散箱全量作业;不回填或修改历史单据。 +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND column_name='inventory_position_id'), + 'ALTER TABLE ll_cargo_discard_item ADD COLUMN inventory_position_id BIGINT NULL COMMENT ''废弃来源库存仓位ID''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND column_name='carton_marks_json'), + 'ALTER TABLE ll_cargo_discard_item ADD COLUMN carton_marks_json TEXT NULL COMMENT ''本次废弃所选真实箱唛快照JSON数组''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND index_name='uk_ll_discard_position_sku'), + 'ALTER TABLE ll_cargo_discard_item ADD UNIQUE KEY uk_ll_discard_position_sku(application_id,inventory_position_id,sku_code)', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +ALTER TABLE ll_cargo_discard_item MODIFY COLUMN source_type VARCHAR(32) NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON、通用库存INVENTORY'; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND column_name='carton_scan_required'), + 'ALTER TABLE ll_cargo_discard_item ADD COLUMN carton_scan_required TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否需要逐箱核对本次所选箱子''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; +ALTER TABLE ll_cargo_discard_item MODIFY COLUMN carton_marks_json TEXT NULL COMMENT '本次废弃所选真实箱唛快照JSON数组'; +ALTER TABLE ll_inbound_plan_carton MODIFY COLUMN status VARCHAR(32) NOT NULL COMMENT '箱唛状态:未绑定UNASSIGNED、已绑托ON_PALLET、整票收货BULK_RECEIVED、可用AVAILABLE、待废弃DISCARD_PENDING、已废弃DISCARDED'; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_carton' AND column_name='source_type'), + 'ALTER TABLE ll_cargo_discard_carton ADD COLUMN source_type VARCHAR(32) NOT NULL DEFAULT ''DROPSHIP'' COMMENT ''箱子来源:一件代发DROPSHIP、入仓箱INBOUND、转运箱TRANSFER''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; diff --git a/deploy/sql/海外区域统一增量-MySQL8.sql b/deploy/sql/海外区域统一增量-MySQL8.sql index f97c1dbad..851f80d61 100644 --- a/deploy/sql/海外区域统一增量-MySQL8.sql +++ b/deploy/sql/海外区域统一增量-MySQL8.sql @@ -48,6 +48,7 @@ CREATE TABLE ll_cargo_discard_carton ( customer_id varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户租户ID', carton_id bigint NOT NULL COMMENT '箱唛记录ID', carton_mark varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '箱唛', + source_type VARCHAR(32) NOT NULL DEFAULT 'DROPSHIP' COMMENT '箱子来源:一件代发DROPSHIP、入仓箱INBOUND、转运箱TRANSFER', created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uk_ll_cargo_discard_carton (application_id,carton_id), @@ -60,13 +61,16 @@ CREATE TABLE ll_cargo_discard_item ( application_id bigint NOT NULL COMMENT '申请单ID', customer_id varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '客户租户ID', order_id bigint DEFAULT NULL COMMENT '一件代发订单ID', - source_type varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON', + source_type varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON、通用库存INVENTORY', return_carton_id bigint DEFAULT NULL COMMENT '退货库存箱ID', inbound_code varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '入仓单号快照', profile_id bigint DEFAULT NULL COMMENT '托盘档案ID', sku_inventory_id bigint DEFAULT NULL COMMENT 'SKU库存记录ID', sku_code varchar(128) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'SKU编码', product_name varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '产品名称', + inventory_position_id BIGINT NULL COMMENT '废弃来源库存仓位ID', + carton_marks_json TEXT NULL COMMENT '本次废弃所选真实箱唛快照JSON数组', + carton_scan_required TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否需要逐箱核对本次所选箱子', available_packages_snapshot int NOT NULL COMMENT '可用箱数快照', discard_packages int NOT NULL COMMENT '申请废弃箱数', completion_photo_file_ids text COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT 'PDA完工照片文件ID JSON数组', @@ -77,6 +81,7 @@ CREATE TABLE ll_cargo_discard_item ( created_at datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', PRIMARY KEY (id), UNIQUE KEY uk_ll_cargo_discard_item (application_id,profile_id,sku_code), + UNIQUE KEY uk_ll_discard_position_sku(application_id,inventory_position_id,sku_code), KEY idx_ll_cargo_discard_item_list (customer_id,application_id), KEY idx_ll_cargo_discard_item_inbound (customer_id,inbound_code,sku_code) ,KEY idx_ll_cargo_discard_return_carton (customer_id,return_carton_id) @@ -1072,7 +1077,7 @@ CREATE TABLE ll_inbound_plan_carton ( warehouse_pallet_id bigint DEFAULT NULL COMMENT '海外实物托盘ID', warehouse_location_id bigint DEFAULT NULL COMMENT '海外库位ID', pda_task_id bigint DEFAULT NULL COMMENT '首次扫码PDA任务ID', - status varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '箱唛状态:UNASSIGNED、ON_PALLET、BULK_RECEIVED、AVAILABLE', + status varchar(32) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '箱唛状态:未绑定UNASSIGNED、已绑托ON_PALLET、整票收货BULK_RECEIVED、可用AVAILABLE、待废弃DISCARD_PENDING、已废弃DISCARDED', version int NOT NULL DEFAULT '0' COMMENT '乐观锁版本', bound_at datetime(3) DEFAULT NULL COMMENT '绑定托盘时间', received_at datetime(3) DEFAULT NULL COMMENT '完成入库时间', @@ -4321,6 +4326,31 @@ CREATE TABLE IF NOT EXISTS ll_cargo_discard_photo ( KEY idx_cargo_discard_photo_application (customer_id, application_id, pallet_no) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; +-- 货物废弃支持所有入库来源及散箱全量作业;不回填或修改历史单据。 +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND column_name='inventory_position_id'), + 'ALTER TABLE ll_cargo_discard_item ADD COLUMN inventory_position_id BIGINT NULL COMMENT ''废弃来源库存仓位ID''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND column_name='carton_marks_json'), + 'ALTER TABLE ll_cargo_discard_item ADD COLUMN carton_marks_json TEXT NULL COMMENT ''本次废弃所选真实箱唛快照JSON数组''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.statistics WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND index_name='uk_ll_discard_position_sku'), + 'ALTER TABLE ll_cargo_discard_item ADD UNIQUE KEY uk_ll_discard_position_sku(application_id,inventory_position_id,sku_code)', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + +ALTER TABLE ll_cargo_discard_item MODIFY COLUMN source_type VARCHAR(32) NOT NULL DEFAULT 'DROPSHIP' COMMENT '库存来源:一件代发DROPSHIP、退货箱RETURN_CARTON、通用库存INVENTORY'; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_item' AND column_name='carton_scan_required'), + 'ALTER TABLE ll_cargo_discard_item ADD COLUMN carton_scan_required TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''是否需要逐箱核对本次所选箱子''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; +ALTER TABLE ll_cargo_discard_item MODIFY COLUMN carton_marks_json TEXT NULL COMMENT '本次废弃所选真实箱唛快照JSON数组'; +ALTER TABLE ll_inbound_plan_carton MODIFY COLUMN status VARCHAR(32) NOT NULL COMMENT '箱唛状态:未绑定UNASSIGNED、已绑托ON_PALLET、整票收货BULK_RECEIVED、可用AVAILABLE、待废弃DISCARD_PENDING、已废弃DISCARDED'; + +SET @ddl = IF(NOT EXISTS (SELECT 1 FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='ll_cargo_discard_carton' AND column_name='source_type'), + 'ALTER TABLE ll_cargo_discard_carton ADD COLUMN source_type VARCHAR(32) NOT NULL DEFAULT ''DROPSHIP'' COMMENT ''箱子来源:一件代发DROPSHIP、入仓箱INBOUND、转运箱TRANSFER''', 'SELECT 1'); +PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; + CREATE TABLE ll_selfop_owner ( id BIGINT NOT NULL COMMENT '主键', run_id BIGINT NOT NULL COMMENT '完整资料采集版本', diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/service/DeliveryTransferService.java b/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/service/DeliveryTransferService.java index 6f68db6d1..d5ac0f284 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/service/DeliveryTransferService.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/delivery/service/DeliveryTransferService.java @@ -1158,6 +1158,7 @@ public class DeliveryTransferService { required(request == null ? null : request.reason(), "取消原因不能为空"); OutboundOrder observed = outboundOrders.findGlobalByNo(trim(outboundNo)); if (observed == null) throw notFound("Outbound order not found"); + if ("DISCARD_OUTBOUND".equals(observed.getOutboundType())) throw conflict("请通过废弃单取消,废弃出库单随申请同步取消"); // Match dispatch picking and relabel confirmation lock order before locking outbound. DispatchOrder dispatch = observed.getDispatchOrderId() == null ? null : dispatchOrders.lockById(observed.getCustomerId(), observed.getDispatchOrderId()); diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardRequests.java b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardRequests.java index f368e7224..8cbac94b8 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardRequests.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardRequests.java @@ -20,7 +20,14 @@ public final class CargoDiscardRequests { @Size(max = 1000) String remark) {} public record Item(Long orderId, Long returnCartonId, @NotBlank @Size(max = 128) String skuCode, - @Positive int discardPackages) {} + @Positive int discardPackages, Long inventoryPositionId, @Size(max = 5000) List<@NotNull @Positive Long> cartonIds) { + public Item(Long orderId, Long returnCartonId, String skuCode, int discardPackages, Long inventoryPositionId) { + this(orderId, returnCartonId, skuCode, discardPackages, inventoryPositionId, null); + } + public Item(Long orderId, Long returnCartonId, String skuCode, int discardPackages) { + this(orderId, returnCartonId, skuCode, discardPackages, null, null); + } + } public record Review(@NotBlank String decision, @Size(max = 1000) String remark) {} diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardResponses.java b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardResponses.java index 168140564..1e850e319 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardResponses.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/dto/CargoDiscardResponses.java @@ -11,16 +11,37 @@ public final class CargoDiscardResponses { String inboundCode, String inboundOrderNo, String overseasWarehouseId, String overseasWarehouseName, LocalDateTime inboundCreatedAt, long availablePackages, - List skus) {} + List skus, Long inventoryPositionId, String palletNo, List cartons, boolean cartonSelectionSupported, String cartonSelectionBlockReason) { + public Candidate(Long orderId, String sourceType, Long returnCartonId, String cartonMark, + String inboundCode, String inboundOrderNo, String overseasWarehouseId, + String overseasWarehouseName, LocalDateTime inboundCreatedAt, long availablePackages, + List skus, Long inventoryPositionId, String palletNo) { + this(orderId, sourceType, returnCartonId, cartonMark, inboundCode, inboundOrderNo, + overseasWarehouseId, overseasWarehouseName, inboundCreatedAt, availablePackages, skus, + inventoryPositionId, palletNo, List.of(), false, "当前库存缺少可核对的箱级记录,可按全部库存废弃"); + } + public Candidate(Long orderId, String sourceType, Long returnCartonId, String cartonMark, + String inboundCode, String inboundOrderNo, String overseasWarehouseId, + String overseasWarehouseName, LocalDateTime inboundCreatedAt, long availablePackages, + List skus) { + this(orderId, sourceType, returnCartonId, cartonMark, inboundCode, inboundOrderNo, + overseasWarehouseId, overseasWarehouseName, inboundCreatedAt, availablePackages, skus, null, null); + } + } + public record Box(Long cartonId, String cartonMark, String palletNo, List skus) {} public record CandidateSku(String skuCode, String productName, long availablePackages) {} public record Summary(Long id, String customerId, String discardNo, String inboundCodes, String overseasWarehouseId, String overseasWarehouseName, int totalPackages, BigDecimal totalFee, String currency, String status, - String createdBy, LocalDateTime createdAt, LocalDateTime reviewedAt) {} + String createdBy, LocalDateTime createdAt, LocalDateTime reviewedAt, String outboundNo) {} public record Item(Long id, Long orderId, String inboundCode, String skuCode, - String productName, int availablePackagesSnapshot, int discardPackages) {} + String productName, int availablePackagesSnapshot, int discardPackages, List cartonMarks) { + public Item(Long id, Long orderId, String inboundCode, String skuCode, String productName, int availablePackagesSnapshot, int discardPackages) { + this(id, orderId, inboundCode, skuCode, productName, availablePackagesSnapshot, discardPackages, List.of()); + } + } public record History(String fromStatus, String toStatus, String operatorId, String remark, LocalDateTime createdAt) {} diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardCarton.java b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardCarton.java index b8319c505..2e4f89bbb 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardCarton.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardCarton.java @@ -15,6 +15,7 @@ public class CargoDiscardCarton { private Long itemId; private String customerId; private Long cartonId; + private String sourceType; private String cartonMark; private LocalDateTime createdAt; } diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardItem.java b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardItem.java index bd21d4164..eb89faa2f 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardItem.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/entity/CargoDiscardItem.java @@ -16,6 +16,9 @@ public class CargoDiscardItem { private Long orderId; private String sourceType; private Long returnCartonId; + private Long inventoryPositionId; + private String cartonMarksJson; + private Boolean cartonScanRequired; private String inboundCode; private Long profileId; private Long skuInventoryId; diff --git a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/mapper/CargoDiscardInventoryMapper.java b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/mapper/CargoDiscardInventoryMapper.java index 6b642d1da..67cad5b89 100644 --- a/lastleg-service/src/main/java/com/baiyue/lastleg/discard/mapper/CargoDiscardInventoryMapper.java +++ b/lastleg-service/src/main/java/com/baiyue/lastleg/discard/mapper/CargoDiscardInventoryMapper.java @@ -12,6 +12,66 @@ import java.util.List; @Mapper public interface CargoDiscardInventoryMapper { + + @Select("SELECT p.* FROM ll_inventory_position p WHERE p.customer_id=#{customerId} AND p.id=#{positionId} FOR UPDATE") + com.baiyue.lastleg.inventory.entity.InventoryPosition lockGenericPosition(@Param("customerId") String customerId, @Param("positionId") Long positionId); + + @Select(""" + SELECT c.id,c.carton_mark,c.sku_code,'INBOUND' source_type + FROM ll_inbound_plan_carton c + JOIN ll_inventory_balance b ON b.customer_id=c.customer_id AND b.inbound_order_id=c.order_id + JOIN ll_inventory_position p ON p.customer_id=b.customer_id AND p.balance_id=b.id AND p.pallet_id=c.warehouse_pallet_id + WHERE p.customer_id=#{customerId} AND p.id=#{positionId} AND c.status='AVAILABLE' AND c.received_at IS NOT NULL + AND COALESCE(b.destination_warehouse_code,'')=COALESCE(c.destination_warehouse_code,'') + UNION ALL + SELECT c.id,c.carton_mark,i.sku_code,'TRANSFER' source_type + FROM ll_inventory_position p + JOIN ll_inventory_balance b ON b.customer_id=p.customer_id AND b.id=p.balance_id + JOIN ll_warehouse_transfer_order t ON t.customer_id=p.customer_id AND t.inbound_order_id=b.inbound_order_id + AND t.transfer_no=p.batch_no AND t.operating_warehouse_id=p.overseas_warehouse_id + JOIN ll_warehouse_transfer_carton c ON c.customer_id=t.customer_id AND c.transfer_order_id=t.id AND c.status='EXPECTED' + JOIN ll_warehouse_transfer_item i ON i.customer_id=c.customer_id AND i.id=c.transfer_item_id + WHERE p.customer_id=#{customerId} AND p.id=#{positionId} + AND (SELECT COUNT(*) FROM ll_inventory_position current_position + WHERE current_position.customer_id=p.customer_id AND current_position.balance_id=p.balance_id + AND current_position.batch_no=p.batch_no AND current_position.overseas_warehouse_id=p.overseas_warehouse_id + AND current_position.available_packages+current_position.hold_packages+current_position.allocated_packages+current_position.picked_packages>0)=1 + ORDER BY id + """) + List genericCartons(@Param("customerId") String customerId, @Param("positionId") Long positionId); + + @Update("UPDATE ll_warehouse_transfer_carton SET status=#{toStatus},updated_at=NOW(3) " + + "WHERE customer_id=#{customerId} AND id=#{cartonId} AND status=#{fromStatus}") + int changeTransferCartonStatus(@Param("customerId") String customerId, @Param("cartonId") Long cartonId, + @Param("fromStatus") String fromStatus, @Param("toStatus") String toStatus); + + @Update("UPDATE ll_inbound_plan_carton SET status=#{toStatus},version=version+1,updated_at=NOW(3) " + + "WHERE customer_id=#{customerId} AND id=#{cartonId} AND status=#{fromStatus}") + int changeGenericCartonStatus(@Param("customerId") String customerId, @Param("cartonId") Long cartonId, + @Param("fromStatus") String fromStatus, @Param("toStatus") String toStatus); + + @Select("SELECT c.* FROM ll_dropship_carton c WHERE c.customer_id=#{customerId} AND c.order_id=#{orderId} AND c.status='AVAILABLE' ORDER BY c.profile_id,c.id") + List availableOrderCartons(@Param("customerId") String customerId, @Param("orderId") Long orderId); + + @Select("") + List lockSelected(@Param("customerId") String customerId, @Param("orderId") Long orderId, + @Param("skuCode") String skuCode, @Param("cartonIds") List cartonIds); + + @Select("") + List genericPositions(@Param("customerId") String customerId, @Param("keyword") String keyword); + + @Select("SELECT COUNT(*) FROM ll_dropship_order_profile WHERE customer_id=#{customerId} AND inventory_position_id=#{positionId}") + long isDropshipPosition(@Param("customerId") String customerId, @Param("positionId") Long positionId); + + @Select("SELECT DISTINCT carton_mark FROM ll_inventory_ledger WHERE customer_id=#{customerId} AND position_id=#{positionId} " + + "AND business_type IN ('STOCK_IN','RETURN_STOCK_IN') AND carton_mark IS NOT NULL AND carton_mark<>'' ORDER BY carton_mark") + List looseCartonMarks(@Param("customerId") String customerId, @Param("positionId") Long positionId); @Select("