"""权限模型公共能力:岗位权限表初始化与历史配置迁移。""" from services.db import query _POSITION_PERMISSION_READY = False SYSTEM_ROLES = ('super_admin', 'admin', 'viewer', '查看者') def ensure_position_permissions(): """幂等创建岗位权限表,并复制历史上误存为角色的岗位权限。""" global _POSITION_PERMISSION_READY if _POSITION_PERMISSION_READY: return query("""CREATE TABLE IF NOT EXISTS position_operation_permissions ( id BIGINT AUTO_INCREMENT PRIMARY KEY, position_code VARCHAR(80) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, page VARCHAR(100) NOT NULL, operation VARCHAR(100) NOT NULL, permission TINYINT NOT NULL DEFAULT 0, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, UNIQUE KEY uq_position_page_operation (position_code, page, operation), KEY idx_position_permission_code (position_code) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci""") # 旧版把采购计划、采购跟单、产品开发、运营专员等岗位当成 role 保存。 # INSERT IGNORE 只做首次迁移,之后管理员修改岗位权限不会被历史数据覆盖。 query("""INSERT IGNORE INTO position_operation_permissions (position_code,page,operation,permission) SELECT p.position_code,r.page,r.operation,r.permission FROM role_operation_permissions r INNER JOIN user_positions p ON BINARY p.position_code=BINARY r.role WHERE r.role NOT IN ('super_admin','admin','viewer','查看者')""") query("""INSERT IGNORE INTO position_operation_permissions (position_code,page,operation,permission) SELECT p.position_code,r.page,'view',r.permission FROM role_permissions r INNER JOIN user_positions p ON BINARY p.position_code=BINARY r.role WHERE r.role NOT IN ('super_admin','admin','viewer','查看者')""") _POSITION_PERMISSION_READY = True def user_position_code(user_id): rows = query("SELECT position FROM dashboard_users WHERE id=%s LIMIT 1", (user_id,)) return str(rows[0].get('position') or '').strip() if rows else ''