diff --git a/deploy/sql/头程数据库统一增量-MySQL8.sql b/deploy/sql/头程数据库统一增量-MySQL8.sql index 7b050e079..6c4bfd8b8 100644 --- a/deploy/sql/头程数据库统一增量-MySQL8.sql +++ b/deploy/sql/头程数据库统一增量-MySQL8.sql @@ -17494,6 +17494,140 @@ CREATE TABLE IF NOT EXISTS fl_dropship_pallet_carton ( CONSTRAINT fk_dropship_carton_label FOREIGN KEY (carton_label_id) REFERENCES fl_inbound_carton_label(id) ) ENGINE=InnoDB COMMENT='一件代发托盘内逐箱SKU和入仓单明细'; +-- 已存在开发库直接收敛到逐箱清点与整托分柜结构;新建库由上面的最新定义一次完成。 +DROP PROCEDURE IF EXISTS converge_dropship_palletization_schema; +DELIMITER $$ +CREATE PROCEDURE converge_dropship_palletization_schema() +BEGIN + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_inbound_carton_label' + AND column_name='units_per_carton') THEN + ALTER TABLE fl_inbound_carton_label + ADD COLUMN units_per_carton INT UNSIGNED NULL + COMMENT '每箱SKU数量快照;一件代发必须为正数' AFTER sku_code; + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_task' + AND column_name='counted_cartons') THEN + ALTER TABLE fl_dropship_pallet_task + ADD COLUMN counted_cartons INT UNSIGNED NOT NULL DEFAULT 0 + COMMENT '已逐箱确认实收数量的箱数' AFTER total_cartons; + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_task' + AND column_name='discrepancy_cartons') THEN + ALTER TABLE fl_dropship_pallet_task + ADD COLUMN discrepancy_cartons INT UNSIGNED NOT NULL DEFAULT 0 + COMMENT '已确认差异箱数' AFTER allocated_cartons; + END IF; + UPDATE fl_dropship_pallet_task + SET counted_cartons=GREATEST(counted_cartons,allocated_cartons); + IF EXISTS (SELECT 1 FROM information_schema.table_constraints + WHERE constraint_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_task' + AND constraint_name='chk_dropship_task_cartons') THEN + ALTER TABLE fl_dropship_pallet_task DROP CHECK chk_dropship_task_cartons; + END IF; + ALTER TABLE fl_dropship_pallet_task + ADD CONSTRAINT chk_dropship_task_cartons + CHECK (allocated_cartons<=counted_cartons AND counted_cartons<=total_cartons); + + IF EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_carton' + AND column_name='operation_id') + AND NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_carton' + AND column_name='count_operation_id') THEN + ALTER TABLE fl_dropship_pallet_carton + CHANGE COLUMN operation_id count_operation_id VARCHAR(128) NOT NULL + COMMENT '逐箱清点幂等操作ID'; + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_carton' + AND column_name='expected_sku_quantity') THEN + ALTER TABLE fl_dropship_pallet_carton + ADD COLUMN expected_sku_quantity INT UNSIGNED NULL AFTER box_code, + ADD COLUMN actual_sku_quantity INT UNSIGNED NULL AFTER expected_sku_quantity, + ADD COLUMN discrepancy_status VARCHAR(24) NULL AFTER actual_sku_quantity, + ADD COLUMN discrepancy_remark VARCHAR(500) NULL AFTER discrepancy_status, + ADD COLUMN bind_operation_id VARCHAR(128) NULL AFTER count_operation_id, + ADD COLUMN last_operation_id VARCHAR(128) NULL AFTER bind_operation_id, + ADD COLUMN counted_by BIGINT UNSIGNED NULL AFTER last_operation_id, + ADD COLUMN counted_by_name VARCHAR(64) NULL AFTER counted_by, + ADD COLUMN counted_at DATETIME(3) NULL AFTER counted_by_name; + END IF; + UPDATE fl_dropship_pallet_carton carton + LEFT JOIN fl_inbound_carton_label label ON label.id=carton.carton_label_id + SET carton.expected_sku_quantity=COALESCE(carton.expected_sku_quantity,label.units_per_carton,1), + carton.actual_sku_quantity=COALESCE(carton.actual_sku_quantity,label.units_per_carton,1), + carton.discrepancy_status=COALESCE(carton.discrepancy_status,'MATCH'), + carton.bind_operation_id=COALESCE(carton.bind_operation_id,carton.count_operation_id), + carton.last_operation_id=COALESCE(carton.last_operation_id,carton.count_operation_id), + carton.counted_by=COALESCE(carton.counted_by,carton.bound_by), + carton.counted_by_name=COALESCE(carton.counted_by_name,carton.bound_by_name), + carton.counted_at=COALESCE(carton.counted_at,carton.bound_at); + ALTER TABLE fl_dropship_pallet_carton + MODIFY COLUMN pallet_id BIGINT UNSIGNED NULL COMMENT '所属组托托盘ID;已清点待绑托时为空', + MODIFY COLUMN box_code VARCHAR(80) NOT NULL COMMENT '稳定箱码', + MODIFY COLUMN expected_sku_quantity INT UNSIGNED NOT NULL COMMENT '箱唛冻结的应收SKU数量', + MODIFY COLUMN actual_sku_quantity INT UNSIGNED NOT NULL COMMENT 'PDA确认的实收SKU数量', + MODIFY COLUMN discrepancy_status VARCHAR(24) NOT NULL COMMENT '差异状态:MATCH或ACCEPTED_VARIANCE', + MODIFY COLUMN last_operation_id VARCHAR(128) NOT NULL COMMENT '最后一次绑托或换托操作幂等号', + MODIFY COLUMN counted_by BIGINT UNSIGNED NOT NULL COMMENT '清点操作人ID', + MODIFY COLUMN counted_at DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '清点时间', + MODIFY COLUMN bound_by BIGINT UNSIGNED NULL COMMENT '上托操作人ID', + MODIFY COLUMN bound_at DATETIME(3) NULL COMMENT '上托时间'; + IF NOT EXISTS (SELECT 1 FROM information_schema.statistics + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_carton' + AND index_name='uk_dropship_carton_count_operation') THEN + ALTER TABLE fl_dropship_pallet_carton + ADD UNIQUE KEY uk_dropship_carton_count_operation (count_operation_id); + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.statistics + WHERE table_schema='baiyue_firstleg' AND table_name='fl_dropship_pallet_carton' + AND index_name='idx_dropship_carton_bind_operation') THEN + ALTER TABLE fl_dropship_pallet_carton + ADD KEY idx_dropship_carton_bind_operation (task_id,bind_operation_id); + END IF; + + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_plan_item' + AND column_name='unit_type') THEN + ALTER TABLE fl_loading_plan_item + ADD COLUMN unit_type VARCHAR(24) NOT NULL DEFAULT 'PACKAGE' AFTER product_quantity, + ADD COLUMN pallet_id BIGINT UNSIGNED NULL AFTER unit_type, + ADD COLUMN pallet_no VARCHAR(32) NULL AFTER pallet_id, + ADD COLUMN indivisible TINYINT(1) NOT NULL DEFAULT 0 AFTER pallet_no; + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.columns + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_plan_item' + AND column_name='active_assignment_key') THEN + ALTER TABLE fl_loading_plan_item + ADD COLUMN active_assignment_key VARCHAR(96) + GENERATED ALWAYS AS (CASE WHEN deleted=0 THEN CONCAT(CASE WHEN pallet_id IS NULL THEN 'D:0' ELSE CONCAT('P:',pallet_id) END,':',inbound_detail_id) ELSE NULL END) STORED + COMMENT '普通明细或已封托托盘明细的有效唯一锁' AFTER active_inbound_detail_id; + END IF; + IF EXISTS (SELECT 1 FROM information_schema.statistics + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_plan_item' + AND index_name='uk_loading_item_plan_detail') THEN + ALTER TABLE fl_loading_plan_item DROP INDEX uk_loading_item_plan_detail; + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.statistics + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_plan_item' + AND index_name='uk_loading_item_plan_assignment') THEN + ALTER TABLE fl_loading_plan_item + ADD UNIQUE KEY uk_loading_item_plan_assignment (loading_plan_id,active_assignment_key); + END IF; + IF NOT EXISTS (SELECT 1 FROM information_schema.statistics + WHERE table_schema='baiyue_firstleg' AND table_name='fl_loading_plan_item' + AND index_name='idx_loading_item_pallet') THEN + ALTER TABLE fl_loading_plan_item ADD KEY idx_loading_item_pallet (pallet_id,deleted); + END IF; +END$$ +DELIMITER ; +CALL converge_dropship_palletization_schema(); +DROP PROCEDURE IF EXISTS converge_dropship_palletization_schema; + -- Auth 登录手机号只从 IAM 中唯一归属的中国大陆手机号回填;存量重复号保持 NULL。 USE baiyue_auth; DROP PROCEDURE IF EXISTS auth_add_login_phone; diff --git a/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java b/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java index ed4ff14bd..ee11c2d60 100644 --- a/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java +++ b/firstleg/src/main/java/com/baiyue/firstleg/client/OrderCargoClient.java @@ -72,5 +72,11 @@ public interface OrderCargoClient { this(cargoId, orderId, itemNo, cargoName, null, packageCount, null, lengthCm, widthCm, heightCm, null); } + public CargoLabelBinding(Long cargoId, Long orderId, Integer itemNo, String cargoName, + String skuNo, Integer packageCount, BigDecimal lengthCm, + BigDecimal widthCm, BigDecimal heightCm, String shipmentId) { + this(cargoId, orderId, itemNo, cargoName, skuNo, + packageCount, null, lengthCm, widthCm, heightCm, shipmentId); + } } } diff --git a/firstleg/src/test/java/com/baiyue/firstleg/repository/DropshipPalletizationSqlContractTest.java b/firstleg/src/test/java/com/baiyue/firstleg/repository/DropshipPalletizationSqlContractTest.java index 6dbdf88c1..212895723 100644 --- a/firstleg/src/test/java/com/baiyue/firstleg/repository/DropshipPalletizationSqlContractTest.java +++ b/firstleg/src/test/java/com/baiyue/firstleg/repository/DropshipPalletizationSqlContractTest.java @@ -38,5 +38,10 @@ class DropshipPalletizationSqlContractTest { .doesNotContain("CREATE TABLE IF NOT EXISTS fl_loading_work_pallet (") .doesNotContain("CREATE TABLE IF NOT EXISTS fl_loading_work_pallet_carton ("); } + assertThat(unified) + .contains("CREATE PROCEDURE converge_dropship_palletization_schema()") + .contains("CHANGE COLUMN operation_id count_operation_id") + .contains("DROP INDEX uk_loading_item_plan_detail") + .contains("ADD UNIQUE KEY uk_loading_item_plan_assignment (loading_plan_id,active_assignment_key)"); } }