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 可直接整段执行;含核对段与回滚段。
This commit is contained in:
yueli
2026-09-17 11:26:36 +08:00
parent 2f7a81ff3d
commit 2f658407c3

View File

@ -0,0 +1,94 @@
-- =============================================================================
-- 基础信息 · 新增「采购链接」字段 + 权限注册
--
-- 需求
-- 物料主数据上增加一个可直接跳转的补货地址(淘宝 / 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;