import { PrismaClient } from '@prisma/client'; const prisma = new PrismaClient(); const permissions = [ ['caller_analytics.view', 'caller_analytics', 'view', '查看授权客户的主叫分析'], ['caller_analytics.view_all', 'caller_analytics', 'view_all', '查看全部客户的主叫分析'], ['dashboard.view', 'dashboard', 'view', '查看 Dashboard 指标'], ['active_calls.view', 'active_calls', 'view', '查看当前通话'], ['active_calls.manage', 'active_calls', 'manage', '强制挂断当前通话'], ['customers.view', 'customers', 'view', '查看客户'], ['customers.manage', 'customers', 'manage', '管理客户'], ['customer_gateways.view', 'customer_gateways', 'view', '查看客户网关'], ['customer_gateways.manage', 'customer_gateways', 'manage', '管理客户网关和策略'], ['vendors.view', 'vendors', 'view', '查看供应商'], ['vendors.manage', 'vendors', 'manage', '管理供应商'], ['vendor_gateways.view', 'vendor_gateways', 'view', '查看落地网关'], ['vendor_gateways.manage', 'vendor_gateways', 'manage', '管理落地网关'], ['line_groups.view', 'line_groups', 'view', '查看落地线路组'], ['line_groups.manage', 'line_groups', 'manage', '管理落地线路组'], ['number_library.view', 'number_library', 'view', '查看号码库'], ['number_library.manage', 'number_library', 'manage', '管理号码库'], ['recharges.view', 'recharges', 'view', '查看充值流水'], ['recharges.manage', 'recharges', 'manage', '执行客户或供应商充值'], ['cdr.view', 'cdr', 'view', '查看话单'], ['recordings.play', 'recordings', 'play', '播放录音'], ['quality.view', 'quality', 'view', '查看质检任务'], ['quality.manage', 'quality', 'manage', '保存质检结果'], ['users.view', 'users', 'view', '查看用户'], ['users.manage', 'users', 'manage', '管理用户'], ['roles.view', 'roles', 'view', '查看角色权限'], ['roles.manage', 'roles', 'manage', '管理角色权限'], ['audit.view', 'audit', 'view', '查看操作日志'] ] as const; const roles = [ { id: 'ROLE_SUPER_ADMIN', name: '超级管理员', description: '系统内置最高权限角色', permissionIds: permissions.map(([id]) => id) }, { id: 'ROLE_OPERATOR', name: '运营管理员', description: '客户、网关、线路和话单运营', permissionIds: [ 'dashboard.view', 'active_calls.view', 'customers.view', 'customers.manage', 'customer_gateways.view', 'customer_gateways.manage', 'vendors.view', 'vendor_gateways.view', 'line_groups.view', 'line_groups.manage', 'number_library.view', 'number_library.manage', 'cdr.view', 'recordings.play' ] }, { id: 'ROLE_FINANCE', name: '财务', description: '充值、余额和财务流水', permissionIds: ['dashboard.view', 'customers.view', 'vendors.view', 'recharges.view', 'recharges.manage', 'cdr.view'] }, { id: 'ROLE_QUALITY', name: '质检', description: '录音抽检和质检结果维护', permissionIds: ['dashboard.view', 'cdr.view', 'recordings.play', 'quality.view', 'quality.manage'] }, { id: 'ROLE_TECH_OPS', name: '技术运维', description: '网关、线路、信令和审计排障', permissionIds: [ 'dashboard.view', 'customer_gateways.view', 'vendors.view', 'vendor_gateways.view', 'vendor_gateways.manage', 'line_groups.view', 'number_library.view', 'number_library.manage', 'cdr.view', 'recordings.play', 'audit.view', 'active_calls.view', 'active_calls.manage' ] } ]; async function main(): Promise { await prisma.$transaction( async (tx) => { for (const [id, module, action, description] of permissions) { await tx.permission.upsert({ where: { id }, update: { module, action, description }, create: { id, module, action, description } }); } for (const role of roles) { await tx.role.upsert({ where: { id: role.id }, update: { name: role.name, description: role.description, builtIn: true, status: 'ENABLED' }, create: { id: role.id, name: role.name, description: role.description, builtIn: true, status: 'ENABLED' } }); for (const permissionId of role.permissionIds) { await tx.rolePermission.upsert({ where: { roleId_permissionId: { roleId: role.id, permissionId } }, update: {}, create: { roleId: role.id, permissionId } }); } } }, { timeout: 30000 } ); } main() .finally(async () => { await prisma.$disconnect(); }) .catch((error) => { console.error(error); process.exit(1); });