-- ============================================================================= -- 一次性迁移:BOM 自制件子件"选版本"落库 -- ----------------------------------------------------------------------------- -- 目标: -- 1. bom_table / bom_draft_table 增加 child_bom_no、child_bom_version 两列 -- (子件引用的自制 BOM 配方版本,外购件子件为 NULL) -- 2. 停用 3 套"占位/废弃"配方(is_enabled=false),使其退出版本下拉候选: -- - parent_id=79 (四代16线激光雷达安装套件V1J) ULR16-B2 V1.0 (仅1行: 侧面壳, 已被 ULR16-B2V1J V1.0 覆盖) -- - parent_id=226 (物联智能电源控制器V1J) TF-A4 V1.0 (挂占位件 Too9999) -- - parent_id=92 (机载SUC控制器-四代一体机V1J) UHRL-B8V1J V2.0 (挂占位件 OS9999, 未维护完) -- 3. 回填 bom_table 中所有"自制件子件引用行"的 child_bom_* 两列, -- 值 = 该子件作为父件时"最新启用配方"(version 倒序取第一条)。 -- 停用占位后: 79→ULR16-B2V1J V1.0, 226→TF-A4V1J V1.0, 92→UHRL-B8V1J V1.1; -- 1905 两版本仍启用 → 取 V1.1 (业务确认: 父件 LTFJ1-A2 V1.0/V2.0 两处引用均用子件 V1.1)。 -- 随后以 4 个多版本自制件的人工确认值显式覆盖,作为兜底与可读性依据。 -- -- 执行方式: docker exec -i inventory_db psql -U test -d inventory_system < 本文件 -- 注意: 一次性迁移,勿在生产重复执行。若后端启用 Redis 缓存(bom:tree:*), -- 部署后需清缓存或重启后端,避免 12h 内命中旧推导值。 -- ============================================================================= BEGIN; -- 1. 加列(幂等,可容忍重复执行) ALTER TABLE bom_table ADD COLUMN IF NOT EXISTS child_bom_no varchar(100); ALTER TABLE bom_table ADD COLUMN IF NOT EXISTS child_bom_version varchar(50); ALTER TABLE bom_draft_table ADD COLUMN IF NOT EXISTS child_bom_no varchar(100); ALTER TABLE bom_draft_table ADD COLUMN IF NOT EXISTS child_bom_version varchar(50); -- 2. 停用占位/废弃配方(仅退出启用,不删除数据) UPDATE bom_table SET is_enabled = FALSE WHERE is_enabled = TRUE AND ( (parent_id = 79 AND bom_no = 'ULR16-B2' AND version = 'V1.0') OR (parent_id = 226 AND bom_no = 'TF-A4' AND version = 'V1.0') OR (parent_id = 92 AND bom_no = 'UHRL-B8V1J' AND version = 'V2.0') ); -- 3a. 通用回填:引用行(child_id 作为父件存在启用配方) → 该 child 的最新启用配方 UPDATE bom_table b SET child_bom_no = t.bom_no, child_bom_version = t.version FROM ( SELECT parent_id, bom_no, version FROM ( SELECT parent_id, bom_no, version, row_number() OVER ( PARTITION BY parent_id ORDER BY version DESC, bom_no DESC ) AS rn FROM ( SELECT DISTINCT parent_id, bom_no, version FROM bom_table WHERE is_enabled = TRUE ) d ) x WHERE rn = 1 ) t WHERE b.child_bom_no IS NULL AND b.child_bom_version IS NULL AND b.child_id = t.parent_id; -- 3b. 人工确认值显式覆盖(业务口径,与 3a 结果一致,作兜底/留痕) UPDATE bom_table SET child_bom_no = 'ULR16-B2V1J', child_bom_version = 'V1.0' WHERE child_id = 79; UPDATE bom_table SET child_bom_no = 'TF-A4V1J', child_bom_version = 'V1.0' WHERE child_id = 226; UPDATE bom_table SET child_bom_no = 'UHRL-B8V1J', child_bom_version = 'V1.1' WHERE child_id = 92; UPDATE bom_table SET child_bom_no = 'TFJ1-A2V1J', child_bom_version = 'V1.1' WHERE child_id = 1905; COMMIT;