import { PrismaClient } from '@prisma/client'; import { PrismaPg } from '@prisma/adapter-pg'; import argon2 from 'argon2'; if (!process.env.DATABASE_URL) { throw new Error('DATABASE_URL is required to seed the database'); } const prisma = new PrismaClient({ adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL, }), }); const defaultTemplateContent = `

手术记录

患者姓名:

住院号:

手术名称:

请在此处填写手术步骤。

`; const main = async () => { const tenant = await prisma.tenant.upsert({ where: { code: 'default' }, update: {}, create: { code: 'default', name: '默认医院', }, }); const adminDepartment = await prisma.department.upsert({ where: { tenantId_code: { tenantId: tenant.id, code: 'admin' } }, update: {}, create: { tenantId: tenant.id, code: 'admin', name: '管理部门', }, }); const surgeryDepartment = await prisma.department.upsert({ where: { tenantId_code: { tenantId: tenant.id, code: 'surgery' } }, update: {}, create: { tenantId: tenant.id, code: 'surgery', name: '外科', }, }); const passwordHash = await argon2.hash('123456'); const adminUser = await prisma.user.upsert({ where: { tenantId_username: { tenantId: tenant.id, username: 'admin' } }, update: {}, create: { tenantId: tenant.id, departmentId: adminDepartment.id, username: 'admin', passwordHash, role: 'SUPER', name: '超级管理员', }, }); await prisma.user.upsert({ where: { tenantId_username: { tenantId: tenant.id, username: 'manager' } }, update: {}, create: { tenantId: tenant.id, departmentId: surgeryDepartment.id, username: 'manager', passwordHash, role: 'ADMIN', name: '科室管理员', }, }); await prisma.user.upsert({ where: { tenantId_username: { tenantId: tenant.id, username: '0001' } }, update: {}, create: { tenantId: tenant.id, departmentId: surgeryDepartment.id, username: '0001', passwordHash, role: 'DOCTOR', name: '张医生', }, }); const defaultTemplate = await prisma.template.upsert({ where: { id: 'tpl_default_surgery' }, update: {}, create: { id: 'tpl_default_surgery', tenantId: tenant.id, name: '腹腔镜胆囊切除术报告', description: '标准手术记录模板', content: defaultTemplateContent, fields: [], scope: 'DEPARTMENT', ownerDepartmentId: surgeryDepartment.id, ownerUserId: null, }, }); await prisma.templateDepartmentPermission.upsert({ where: { templateId_departmentId: { templateId: defaultTemplate.id, departmentId: surgeryDepartment.id, }, }, update: { canUse: true, canManage: true, }, create: { templateId: defaultTemplate.id, departmentId: surgeryDepartment.id, canUse: true, canManage: true, }, }); await prisma.auditLog.create({ data: { tenantId: tenant.id, actorUserId: adminUser.id, actorRole: 'super', action: 'seed.default_template', targetType: 'template', targetId: defaultTemplate.id, departmentId: surgeryDepartment.id, metadata: { name: defaultTemplate.name }, }, }).catch(() => {}); }; main() .then(async () => { await prisma.$disconnect(); }) .catch(async (error) => { console.error(error); await prisma.$disconnect(); process.exit(1); });