import { PrismaClient } from '@prisma/client'; import { PrismaPg } from '@prisma/adapter-pg'; import argon2 from 'argon2'; import { DEMO_DEFAULT_REPORT_CONTENT, DEMO_SYSTEM_SETTINGS, DEMO_TEMPLATE_ID, } from '../src/demo/demo-defaults.js'; 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 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: DEMO_TEMPLATE_ID }, update: { name: '腹腔镜胆囊切除术报告', description: '标准手术记录模板', content: DEMO_DEFAULT_REPORT_CONTENT, fields: [], scope: 'DEPARTMENT', ownerDepartmentId: surgeryDepartment.id, ownerUserId: null, }, create: { id: DEMO_TEMPLATE_ID, tenantId: tenant.id, name: '腹腔镜胆囊切除术报告', description: '标准手术记录模板', content: DEMO_DEFAULT_REPORT_CONTENT, 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, }, }); const existingSystemSettings = await prisma.systemSetting.findFirst({ where: { tenantId: tenant.id, scope: 'global', departmentId: null, key: 'systemSettings' }, }); if (existingSystemSettings) { await prisma.systemSetting.update({ where: { id: existingSystemSettings.id }, data: { value: DEMO_SYSTEM_SETTINGS }, }); } else { await prisma.systemSetting.create({ data: { tenantId: tenant.id, scope: 'global', key: 'systemSettings', value: DEMO_SYSTEM_SETTINGS, }, }); } 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); });