Files
KCGL/db_migrations/add_bom_child_version_columns.sql
yueli 6250fa94cb feat(bom): BOM 子件引用版本与归档 数据库迁移
- bom_table/bom_draft_table 加 child_bom_no/child_bom_version(子件引用的自制BOM版本)
- bom_table 加 is_archived 归档标记(仍启用可查看/编辑,但不再作为子件版本候选)
- 回填 60 行自制件子件引用版本,4 个多版本自制件按业务口径(79/92/226/1905)
- 3 套占位/废弃配方改标归档并恢复启用
2026-09-08 10:14:40 +08:00

73 lines
3.6 KiB
PL/PgSQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- 一次性迁移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;