From 3d8fb198c519e8dda2196223c545edcac64431bc Mon Sep 17 00:00:00 2001 From: yueli Date: Thu, 10 Sep 2026 09:46:52 +0800 Subject: [PATCH] =?UTF-8?q?feat(scrap):=20=E6=8A=A5=E5=BA=9F=E5=AE=A1?= =?UTF-8?q?=E6=89=B9=E6=B5=81=20DB=20=E8=BF=81=E7=A7=BB=EF=BC=88=E5=BB=BA?= =?UTF-8?q?=E8=A1=A8=20+=20=E6=9D=83=E9=99=90=E7=A0=81=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - scrap_approval 表(申请单,items_json 携带 source_table+stock_id 精准实物) - trans_scrap 增加 scrap_request_no 关联申请单 - 注册权限码 scrap_apply / scrap_approval / scrap_execute 并按现有报废角色授予 --- db_migrations/add_scrap_approval.sql | 31 +++++++++++++++ db_migrations/add_scrap_perm.sql | 57 ++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 db_migrations/add_scrap_approval.sql create mode 100644 db_migrations/add_scrap_perm.sql diff --git a/db_migrations/add_scrap_approval.sql b/db_migrations/add_scrap_approval.sql new file mode 100644 index 0000000..f5353ad --- /dev/null +++ b/db_migrations/add_scrap_approval.sql @@ -0,0 +1,31 @@ +-- ============================================================================= +-- 报废审批流 + 按单报废(镜像 借库/出库 审批框架) +-- 1) 新表 scrap_approval(申请单) +-- 2) trans_scrap 增加 scrap_request_no,关联申请单号 +-- 执行: docker exec -i inventory_db psql -U test -d inventory_system < 本文件 +-- ============================================================================= +BEGIN; + +CREATE TABLE IF NOT EXISTS scrap_approval ( + id SERIAL PRIMARY KEY, + request_no varchar(100) UNIQUE NOT NULL, + applicant_id integer NOT NULL, + remark text, + status integer NOT NULL DEFAULT 0, -- 0待审 1已通过(待执行) 2驳回 3已执行 + allowed_approvers text, + actual_approver_id integer, + approved_at timestamptz, + reject_reason text, + items_json text NOT NULL, + executed_at timestamptz, + executor_name varchar(100), + created_at timestamptz NOT NULL DEFAULT now(), + updated_at timestamptz NOT NULL DEFAULT now() +); +CREATE INDEX IF NOT EXISTS ix_scrap_approval_status ON scrap_approval(status); +CREATE INDEX IF NOT EXISTS ix_scrap_approval_applicant ON scrap_approval(applicant_id); + +ALTER TABLE trans_scrap ADD COLUMN IF NOT EXISTS scrap_request_no varchar(100); +CREATE INDEX IF NOT EXISTS ix_trans_scrap_req_no ON trans_scrap(scrap_request_no); + +COMMIT; diff --git a/db_migrations/add_scrap_perm.sql b/db_migrations/add_scrap_perm.sql new file mode 100644 index 0000000..0146971 --- /dev/null +++ b/db_migrations/add_scrap_perm.sql @@ -0,0 +1,57 @@ +-- ============================================================================= +-- 报废审批流权限码(动态权限,不硬编码角色) +-- scrap_apply 提交报废申请 / 预检 +-- scrap_approval 查看审批列表 / 审批(通过/驳回) +-- scrap_execute 按单报废执行(扣减库存) +-- 授予:apply/execute 复制现有持 'scrap_create:operation' 的角色; +-- approval 复制现有持 'scrap_list:operation' 的角色 + 超管/主管。 +-- 执行: docker exec -i inventory_db psql -U test -d inventory_system < 本文件 +-- ============================================================================= +BEGIN; + +-- 1) 注册权限元素 +INSERT INTO sys_element (menu_code, name, code, element_type) +SELECT 'scrap_create', '报废申请(提交)', 'scrap_apply', 'operation' +WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'scrap_apply'); + +INSERT INTO sys_element (menu_code, name, code, element_type) +SELECT 'scrap_create', '按单报废(执行)', 'scrap_execute', 'operation' +WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'scrap_execute'); + +INSERT INTO sys_element (menu_code, name, code, element_type) +SELECT 'scrap_list', '报废审批(查看/审批)', 'scrap_approval', 'operation' +WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'scrap_approval'); + +-- 2) scrap_apply / scrap_execute ← 现有持 scrap_create:operation 的角色 +INSERT INTO sys_role_permission (role_code, target_code, type, company_name) +SELECT DISTINCT sp.role_code, v.target_code, 'element', sp.company_name +FROM sys_role_permission sp +CROSS JOIN (VALUES ('scrap_apply'), ('scrap_execute')) AS v(target_code) +WHERE sp.target_code = 'scrap_create:operation' AND sp.type = 'element' + AND NOT EXISTS ( + SELECT 1 FROM sys_role_permission r + WHERE r.role_code = sp.role_code AND r.target_code = v.target_code + AND r.type = 'element' AND COALESCE(r.company_name,'') = COALESCE(sp.company_name,'') + ); + +-- 3) scrap_approval ← 现有持 scrap_list:operation 的角色 +INSERT INTO sys_role_permission (role_code, target_code, type, company_name) +SELECT DISTINCT sp.role_code, 'scrap_approval', 'element', sp.company_name +FROM sys_role_permission sp +WHERE sp.target_code = 'scrap_list:operation' AND sp.type = 'element' + AND NOT EXISTS ( + SELECT 1 FROM sys_role_permission r + WHERE r.role_code = sp.role_code AND r.target_code = 'scrap_approval' + AND r.type = 'element' AND COALESCE(r.company_name,'') = COALESCE(sp.company_name,'') + ); + +-- 4) 超管 / 主管 兜底持有审批权 +INSERT INTO sys_role_permission (role_code, target_code, type, company_name) +SELECT v.role_code, 'scrap_approval', 'element', NULL +FROM (VALUES ('SUPER_ADMIN'), ('SUPERVISOR')) 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 = 'scrap_approval' AND r.type = 'element' +); + +COMMIT;