gongxiangp2/scripts/seed-work-review-local-test.ts

151 lines
4.3 KiB
TypeScript

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<string, { id: string }>()
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()
})