Files
KCGL/db_migrations/phase6_material_purchase_link.sql
yueli 2f658407c3 feat(db): 基础信息新增「采购链接」字段并注册权限
需求:物料主数据增加一个可直接跳转的补货地址(淘宝/1688 等),纳入字段权限管控。

★ 设计取舍:读写**共用同一个权限码** material_list:purchaseLink
  上一轮刚修完「写用 A 码、读用 B 码」造成的读写错位(附件备注),新字段刻意
  沿用 referencePrice 的既有模式 —— 一个码同时进 field_permissions.py(读过滤)
  与 base.py 的 field_to_perm(写过滤)。单码最大的好处是**结构上不可能错位**:
  能读必然能写、反之亦然,不会再有「填了看不到」或「看得到改不了」。
  若将来要求「能看不能改」,需拆两个码并同步改三处,届时一并回归验证。

★ 列类型用 text 而非 varchar(N):外链常带很长的查询串,截断后是打不开的地址,
  且截断是静默的 —— 用户只会觉得「链接坏了」。

默认授予 SUPER_ADMIN / SUPERVISOR / WAREHOUSE_MGR / INBOUND(覆盖实际补货的人
与管理物料的人)。⚠ 这是本次取的默认值,业务可按需增删 —— 改 VALUES 再执行一次即可。

幂等;不含 psql 元命令,DataGrip 可直接整段执行;含核对段与回滚段。
2026-09-17 11:26:36 +08:00

95 lines
4.7 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.

-- =============================================================================
-- 基础信息 · 新增「采购链接」字段 + 权限注册
--
-- 需求
-- 物料主数据上增加一个可直接跳转的补货地址(淘宝 / 1688 等),
-- 并纳入字段级权限管控。
--
-- ---------------------------------------------------------------------------
-- ★ 设计取舍:读写**共用同一个权限码** material_list:purchaseLink
-- 上一轮刚修完「写用了 A 码、读用了 B 码」造成的读写错位(附件备注),
-- 新字段刻意沿用 referencePrice 的既有模式 —— 一个码同时进
-- field_permissions.py读过滤与 base.py 的 field_to_perm写过滤
-- 单码最大的好处是**结构上不可能出现口径错位**:能读必然能写、反之亦然,
-- 不会再有「填了看不到」或「看得到改不了」。
--
-- 若业务后续要求「能看不能改」,再拆成两个码并同步改三处
-- field_permissions.py / base.py 的 POST 与 PUT届时请一并回归验证。
--
-- ★ 为什么列类型用 text 而不是 varchar(N)
-- 外链尤其是电商常带很长的查询串varchar 截断后得到的是打不开的地址,
-- 而且截断是静默的 —— 用户只会觉得"链接坏了"。
--
-- 默认授予SUPER_ADMIN / SUPERVISOR / WAREHOUSE_MGR / INBOUND
-- —— 覆盖「实际补货的人」与「管理物料的人」。
-- ⚠ 这是本次取的默认值,业务可按需增删;增删只需改下面的 VALUES 再执行一次。
--
-- 幂等:带 IF NOT EXISTS / WHERE NOT EXISTS可重复执行。
-- 脚本文本不含 psql 元命令DataGrip / DBeaver 可直接整段执行。
-- 执行docker exec -i inventory_db psql -U test -d inventory_system < 本文件
-- =============================================================================
BEGIN;
-- ---------------------------------------------------------------------------
-- 一、加列
-- ---------------------------------------------------------------------------
ALTER TABLE material_base
ADD COLUMN IF NOT EXISTS purchase_link text DEFAULT '';
COMMENT ON COLUMN material_base.purchase_link IS
'采购链接:补货时直接跳转的购买地址。受 material_list:purchaseLink 字段权限管控(读写同码)';
-- ---------------------------------------------------------------------------
-- 二、注册字段权限元素
-- ---------------------------------------------------------------------------
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'material_list', '采购链接', 'material_list:purchaseLink', 'element'
WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'material_list:purchaseLink');
-- ---------------------------------------------------------------------------
-- 三、默认授予
-- ---------------------------------------------------------------------------
INSERT INTO sys_role_permission (role_code, target_code, type, company_name)
SELECT v.role_code, 'material_list:purchaseLink', 'element', NULL
FROM (VALUES ('SUPER_ADMIN'), ('SUPERVISOR'), ('WAREHOUSE_MGR'), ('INBOUND')) AS v(role_code)
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_permission r
WHERE r.role_code = v.role_code
AND r.target_code = 'material_list:purchaseLink'
AND r.type = 'element'
);
COMMIT;
-- =============================================================================
-- 执行后核对
-- =============================================================================
SELECT '=== 1) 新列已就位 ===' AS "核对项";
SELECT column_name, data_type, column_default FROM information_schema.columns
WHERE table_name = 'material_base' AND column_name = 'purchase_link';
SELECT '=== 2) 权限元素已注册 ===' AS "核对项";
SELECT code, name, menu_code, element_type FROM sys_element
WHERE code = 'material_list:purchaseLink';
SELECT '=== 3) 已授予角色(默认应为 4 个)===' AS "核对项";
SELECT role_code FROM sys_role_permission
WHERE target_code = 'material_list:purchaseLink' AND type = 'element' ORDER BY role_code;
SELECT '=== 4) 存量数据回填为空的应占多数 ===' AS "核对项";
SELECT count(*) AS ,
count(*) FILTER (WHERE coalesce(purchase_link,'') = '') AS
FROM material_base;
-- =============================================================================
-- 回滚段
-- =============================================================================
-- BEGIN;
-- DELETE FROM sys_role_permission WHERE target_code = 'material_list:purchaseLink';
-- DELETE FROM sys_element WHERE code = 'material_list:purchaseLink';
-- ALTER TABLE material_base DROP COLUMN IF EXISTS purchase_link;
-- COMMIT;