import bcrypt from 'bcryptjs' import { PrismaClient, Role } from '@prisma/client' const prisma = new PrismaClient() const password = String(process.env.LOCAL_TEST_PASSWORD || '').trim() if (!password) { throw new Error('缺少 LOCAL_TEST_PASSWORD') } const users = [ { key: 'submitter', email: 'submitter@local.test', username: '测试提交者', realName: '测试提交者', dingtalkUserId: 'local-submit-ding', role: Role.USER, positionLevel: 'P3', levelType: 'P', positionTitle: '视觉设计师', jobNumber: 'LOCAL-P001', }, { key: 'manager', email: 'manager@local.test', username: '测试主管', realName: '测试主管', dingtalkUserId: 'local-manager-ding', role: Role.USER, positionLevel: 'M2', levelType: 'M', positionTitle: '视觉设计主管', jobNumber: 'LOCAL-M001', }, { key: 'finalReviewer', email: 'yuanze@local.test', username: '元泽', realName: '元泽', dingtalkUserId: 'local-yuanze-ding', role: Role.SYSTEM_ADMIN, positionLevel: 'M3', levelType: 'M', positionTitle: '终审负责人', jobNumber: 'LOCAL-YZ001', }, ] as const async function main() { const passwordHash = await bcrypt.hash(password, 10) const createdUsers = new Map() for (const item of users) { const user = await prisma.user.upsert({ where: { email: item.email }, update: { username: item.username, password: passwordHash, role: item.role, isActive: true, status: 'active', realName: item.realName, dingtalkUserId: item.dingtalkUserId, department: '测试设计部', employmentStatus: 'active', }, create: { email: item.email, username: item.username, password: passwordHash, role: item.role, isActive: true, status: 'active', realName: item.realName, dingtalkUserId: item.dingtalkUserId, department: '测试设计部', employmentStatus: 'active', }, select: { id: true }, }) createdUsers.set(item.key, user) } for (const item of users) { const user = createdUsers.get(item.key) if (!user) throw new Error(`本地测试账号创建失败: ${item.key}`) await prisma.performanceSurveyEmployeeProfile.upsert({ where: { dingtalkUserId: item.dingtalkUserId }, update: { dingEmail: item.email, jobNumber: item.jobNumber, flowerName: item.realName, realName: item.realName, displayName: item.realName, departmentName: '测试设计部', departmentPath: '测试设计部', positionTitle: item.positionTitle, positionLevel: item.positionLevel, levelType: item.levelType, isLeadership: item.levelType === 'M', managerDingtalkUserId: item.key === 'submitter' ? 'local-manager-ding' : null, managerJobNumber: item.key === 'submitter' ? 'LOCAL-M001' : null, managerName: item.key === 'submitter' ? '测试主管' : null, employmentStatus: 'active', sourcePayload: { materialUserId: user.id, localTest: true, }, syncedAt: new Date(), }, create: { dingtalkUserId: item.dingtalkUserId, dingEmail: item.email, jobNumber: item.jobNumber, flowerName: item.realName, realName: item.realName, displayName: item.realName, departmentName: '测试设计部', departmentPath: '测试设计部', positionTitle: item.positionTitle, positionLevel: item.positionLevel, levelType: item.levelType, isLeadership: item.levelType === 'M', managerDingtalkUserId: item.key === 'submitter' ? 'local-manager-ding' : null, managerJobNumber: item.key === 'submitter' ? 'LOCAL-M001' : null, managerName: item.key === 'submitter' ? '测试主管' : null, employmentStatus: 'active', sourcePayload: { materialUserId: user.id, localTest: true, }, syncedAt: new Date(), }, }) } console.log('本地作品过稿测试账号已准备完成') } main() .catch((error) => { console.error(error) process.exitCode = 1 }) .finally(async () => { await prisma.$disconnect() })