151 lines
4.3 KiB
TypeScript
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()
|
|
})
|