Files
KCGL/db_migrations/deploy_production.sql
yueli 4b1a86a870 fix: 对齐field_to_perm与sys_element权限码 + 税率6% + 含税总价反算
- buy/semi/product: 数量字段映射对齐sys_element实际注册码(qty_inbound/qty_stock/qty_available)
- 数据库: 补全buy(9)+semi(10)+product(13)缺失权限码
- deploy_production.sql: 同步更新
- buy.vue: 税率新增6%选项, 价格联动以含税为主输入, 税率变化保持最后编辑价格不变
- buy.vue: 新增含税总价可输入反算功能
2026-07-15 15:03:37 +08:00

207 lines
17 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.

-- ============================================================
-- 生产环境部署 SQL可直接在 DataGrip 中执行)
-- 涵盖: 表结构变更 + 权限码补全 + 默认分配
-- ============================================================
BEGIN;
-- ============================================================
-- 一、表结构变更
-- ============================================================
-- 1. 采购申请表新增 base_id关联物料基础信息
ALTER TABLE purchase_request ADD COLUMN IF NOT EXISTS base_id INTEGER;
-- 2. 采购入库表新增 request_id关联采购申请单
ALTER TABLE stock_buy ADD COLUMN IF NOT EXISTS request_id INTEGER;
-- 3. 角色权限表新增 company_name支持公司级别权限隔离
ALTER TABLE sys_role_permission ADD COLUMN IF NOT EXISTS company_name VARCHAR(255);
-- ============================================================
-- 二、补全 sys_element 权限码(确保权限分配页面可见)
-- ============================================================
-- 2.1 采购入库字段权限14个缺失码
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '基础物料ID', 'inbound_buy:base_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:base_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '全局打印ID', 'inbound_buy:global_print_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:global_print_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '强制质检标记', 'inbound_buy:isInspectionRequired', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:isInspectionRequired');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '入库数量', 'inbound_buy:in_quantity', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:in_quantity');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '当前库存', 'inbound_buy:stock_quantity', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:stock_quantity');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '当前可用', 'inbound_buy:available_quantity', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:available_quantity');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '含税单价', 'inbound_buy:post_tax_unit_price', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:post_tax_unit_price');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '采购邮箱', 'inbound_buy:purchaser_email', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:purchaser_email');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '原始链接', 'inbound_buy:source_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:source_link');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '详情链接', 'inbound_buy:detail_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:detail_link');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '到货图片', 'inbound_buy:arrival_photo', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:arrival_photo');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '检测报告', 'inbound_buy:inspection_report', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:inspection_report');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '关联采购单ID', 'inbound_buy:request_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:request_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_buy', '关联采购单号', 'inbound_buy:request_no', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_buy:request_no');
-- 2.1b 入库半成品字段权限(对齐 field_to_perm
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '基础物料ID', 'inbound_semi:base_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:base_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '批号', 'inbound_semi:batch_number', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:batch_number');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '序列号', 'inbound_semi:serial_number', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:serial_number');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', 'BOM版本', 'inbound_semi:bom_version', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:bom_version');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '人工成本', 'inbound_semi:manual_cost', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:manual_cost');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '生产开始时间', 'inbound_semi:production_start_time', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:production_start_time');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '生产结束时间', 'inbound_semi:production_end_time', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:production_end_time');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '到货图片', 'inbound_semi:arrival_photo', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:arrival_photo');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '质检报告链接', 'inbound_semi:quality_report_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:quality_report_link');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_semi', '详情链接', 'inbound_semi:detail_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_semi:detail_link');
-- 2.1c 入库成品字段权限(对齐 field_to_perm
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '基础物料ID', 'inbound_product:base_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:base_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '批号', 'inbound_product:batch_number', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:batch_number');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '条形码', 'inbound_product:barcode', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:barcode');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '序列号', 'inbound_product:serial_number', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:serial_number');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', 'BOM版本', 'inbound_product:bom_version', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:bom_version');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '人工成本', 'inbound_product:manual_cost', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:manual_cost');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '生产开始时间', 'inbound_product:production_start_time', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:production_start_time');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '生产结束时间', 'inbound_product:production_end_time', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:production_end_time');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '产品图片', 'inbound_product:product_photo', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:product_photo');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '质检报告链接', 'inbound_product:quality_report_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:quality_report_link');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '质检报告链接(入库)', 'inbound_product:inspection_report_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:inspection_report_link');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '详情链接', 'inbound_product:detail_link', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:detail_link');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'inbound_product', '入库数量', 'inbound_product:qty_inbound', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'inbound_product:qty_inbound');
-- 2.2 BOM 管理字段权限5个缺失码
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'bom_manage', '父件ID', 'bom_manage:parent_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'bom_manage:parent_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'bom_manage', '父件规格', 'bom_manage:parent_spec', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'bom_manage:parent_spec');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'bom_manage', '子件ID', 'bom_manage:child_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'bom_manage:child_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'bom_manage', '用量', 'bom_manage:dosage', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'bom_manage:dosage');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'bom_manage', '备注', 'bom_manage:remark', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'bom_manage:remark');
-- 2.3 员工管理字段权限8个缺失码
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '用户ID', 'system_user:id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '用户名', 'system_user:username', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:username');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '账号ID', 'system_user:account_id', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:account_id');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '邮箱', 'system_user:email', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:email');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '部门', 'system_user:department', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:department');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '角色', 'system_user:role', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:role');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '状态', 'system_user:status', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:status');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_user', '创建时间', 'system_user:created_at', 'column' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_user:created_at');
-- 2.4 系统管理操作权限2个
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_mgmt', '全局跨域访问', 'crossDomain', 'element' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'crossDomain');
INSERT INTO sys_element (menu_code, name, code, element_type)
SELECT 'system_mgmt', '权限分配操作', 'system_permission:operation', 'element' WHERE NOT EXISTS (SELECT 1 FROM sys_element WHERE code = 'system_permission:operation');
-- ============================================================
-- 三、补全 sys_role_permission给各角色分配新权限码
-- ============================================================
-- 3.1 BOM 权限 → 分配给已有 BOM 权限的角色
INSERT INTO sys_role_permission (role_code, target_code, type, company_name)
SELECT rp.role_code, elem.code, 'element', rp.company_name
FROM (SELECT DISTINCT role_code, company_name FROM sys_role_permission WHERE target_code LIKE 'bom_manage:%') rp
CROSS JOIN (SELECT unnest(ARRAY['bom_manage:parent_id','bom_manage:parent_spec','bom_manage:child_id','bom_manage:dosage','bom_manage:remark','bom_manage:operation']) AS code) elem
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_permission rp2
WHERE rp2.role_code = rp.role_code AND rp2.target_code = elem.code
AND COALESCE(rp2.company_name, '') = COALESCE(rp.company_name, '')
);
-- 3.2 员工管理字段权限 → 分配给 SUPER_ADMIN 和 SUPERVISOR
INSERT INTO sys_role_permission (role_code, target_code, type)
SELECT r.role, elem.code, 'element'
FROM (SELECT unnest(ARRAY['SUPER_ADMIN','SUPERVISOR']) AS role) r
CROSS JOIN (
SELECT unnest(ARRAY['system_user:id','system_user:username','system_user:account_id','system_user:email','system_user:department','system_user:role','system_user:status','system_user:created_at','system_user:operation']) AS code
) elem
WHERE NOT EXISTS (
SELECT 1 FROM sys_role_permission rp
WHERE rp.role_code = r.role AND rp.target_code = elem.code AND rp.type = 'element'
);
-- 3.3 crossDomain → 仅 SUPER_ADMIN 默认拥有(其他角色通过权限页手动勾选)
INSERT INTO sys_role_permission (role_code, target_code, type)
SELECT 'SUPER_ADMIN', 'crossDomain', 'element'
WHERE NOT EXISTS (SELECT 1 FROM sys_role_permission WHERE role_code = 'SUPER_ADMIN' AND target_code = 'crossDomain');
-- 3.4 system_permission:operation → 分配给 SUPER_ADMIN 和 SUPERVISOR
INSERT INTO sys_role_permission (role_code, target_code, type)
SELECT 'SUPER_ADMIN', 'system_permission:operation', 'element'
WHERE NOT EXISTS (SELECT 1 FROM sys_role_permission WHERE role_code = 'SUPER_ADMIN' AND target_code = 'system_permission:operation');
INSERT INTO sys_role_permission (role_code, target_code, type)
SELECT 'SUPERVISOR', 'system_permission:operation', 'element'
WHERE NOT EXISTS (SELECT 1 FROM sys_role_permission WHERE role_code = 'SUPERVISOR' AND target_code = 'system_permission:operation');
-- 3.5 system_mgmt / system_permission / system_audit → SUPERVISOR
INSERT INTO sys_role_permission (role_code, target_code, type)
SELECT 'SUPERVISOR', code, 'menu'
FROM sys_menu
WHERE code IN ('system_mgmt', 'system_permission', 'system_audit')
AND NOT EXISTS (SELECT 1 FROM sys_role_permission rp WHERE rp.role_code = 'SUPERVISOR' AND rp.target_code = sys_menu.code AND rp.type = 'menu');
-- ============================================================
-- 四、验证
-- ============================================================
SELECT '=== 验证 ===' AS info;
SELECT '表结构' AS item, column_name, data_type
FROM information_schema.columns
WHERE table_name IN ('purchase_request', 'stock_buy', 'sys_role_permission')
AND column_name IN ('base_id', 'request_id', 'company_name')
ORDER BY table_name, column_name;
SELECT '权限码总数' AS item, count(*) FROM sys_element;
SELECT '角色权限总数' AS item, count(*) FROM sys_role_permission;
COMMIT;