156 lines
4.2 KiB
TypeScript
156 lines
4.2 KiB
TypeScript
import { PrismaClient, UserRole, CardTypeCategory } from '@prisma/client'
|
||
|
||
const prisma = new PrismaClient()
|
||
|
||
async function main() {
|
||
console.log('🌱 Seeding database...')
|
||
|
||
// 1. Studio Config
|
||
const existingConfig = await prisma.studioConfig.findFirst()
|
||
if (!existingConfig) {
|
||
await prisma.studioConfig.create({
|
||
data: {
|
||
name: '普拉提工作室',
|
||
address: '请在管理后台设置地址',
|
||
phone: '请在管理后台设置电话',
|
||
cancelHoursLimit: 2,
|
||
photos: [],
|
||
},
|
||
})
|
||
console.log(' ✅ Studio config created')
|
||
} else {
|
||
console.log(' ⏭️ Studio config already exists')
|
||
}
|
||
|
||
// 2. Card Types
|
||
const existingCards = await prisma.cardType.count()
|
||
if (existingCards === 0) {
|
||
await prisma.cardType.createMany({
|
||
data: [
|
||
{
|
||
name: '体验课',
|
||
type: CardTypeCategory.TRIAL,
|
||
totalTimes: 1,
|
||
durationDays: 7,
|
||
price: 9900,
|
||
originalPrice: 29900,
|
||
description: '首次体验,感受普拉提的魅力',
|
||
isActive: true,
|
||
sortOrder: 0,
|
||
},
|
||
{
|
||
name: '私教10次卡',
|
||
type: CardTypeCategory.TIMES,
|
||
totalTimes: 10,
|
||
durationDays: 90,
|
||
price: 299900,
|
||
originalPrice: 399900,
|
||
description: '10节私教课,90天有效期',
|
||
isActive: true,
|
||
sortOrder: 1,
|
||
},
|
||
{
|
||
name: '私教20次卡',
|
||
type: CardTypeCategory.TIMES,
|
||
totalTimes: 20,
|
||
durationDays: 180,
|
||
price: 499900,
|
||
originalPrice: 699900,
|
||
description: '20节私教课,180天有效期,更优惠',
|
||
isActive: true,
|
||
sortOrder: 2,
|
||
},
|
||
{
|
||
name: '月卡',
|
||
type: CardTypeCategory.DURATION,
|
||
totalTimes: null,
|
||
durationDays: 30,
|
||
price: 99900,
|
||
description: '30天不限次数',
|
||
isActive: true,
|
||
sortOrder: 3,
|
||
},
|
||
{
|
||
name: '季卡',
|
||
type: CardTypeCategory.DURATION,
|
||
totalTimes: null,
|
||
durationDays: 90,
|
||
price: 249900,
|
||
originalPrice: 299700,
|
||
description: '90天不限次数,更实惠',
|
||
isActive: true,
|
||
sortOrder: 4,
|
||
},
|
||
],
|
||
})
|
||
console.log(' ✅ Card types created')
|
||
} else {
|
||
console.log(' ⏭️ Card types already exist')
|
||
}
|
||
|
||
// 3. Admin User
|
||
const existingAdmin = await prisma.user.findFirst({
|
||
where: { role: UserRole.ADMIN },
|
||
})
|
||
if (!existingAdmin) {
|
||
await prisma.user.create({
|
||
data: {
|
||
openid: 'admin_test_openid',
|
||
nickname: '教练',
|
||
role: UserRole.ADMIN,
|
||
adminBookingSubscriptionCount: 0,
|
||
},
|
||
})
|
||
console.log(' ✅ Admin user created')
|
||
} else {
|
||
console.log(' ⏭️ Admin user already exists')
|
||
}
|
||
|
||
// 4. Week Templates (weekdays 9-16, hourly slots)
|
||
const existingTemplates = await prisma.weekTemplate.count()
|
||
if (existingTemplates === 0) {
|
||
const timeSlots = [
|
||
{ startTime: '09:00', endTime: '10:00' },
|
||
{ startTime: '10:00', endTime: '11:00' },
|
||
{ startTime: '14:00', endTime: '15:00' },
|
||
{ startTime: '15:00', endTime: '16:00' },
|
||
]
|
||
|
||
const templates = []
|
||
// Monday to Friday (1-5)
|
||
for (let day = 1; day <= 5; day++) {
|
||
for (const slot of timeSlots) {
|
||
templates.push({
|
||
dayOfWeek: day,
|
||
startTime: slot.startTime,
|
||
endTime: slot.endTime,
|
||
capacity: 1,
|
||
isActive: true,
|
||
})
|
||
}
|
||
}
|
||
|
||
// Saturday (6) — morning only
|
||
templates.push(
|
||
{ dayOfWeek: 6, startTime: '09:00', endTime: '10:00', capacity: 1, isActive: true },
|
||
{ dayOfWeek: 6, startTime: '10:00', endTime: '11:00', capacity: 1, isActive: true },
|
||
)
|
||
|
||
await prisma.weekTemplate.createMany({ data: templates })
|
||
console.log(' ✅ Week templates created')
|
||
} else {
|
||
console.log(' ⏭️ Week templates already exist')
|
||
}
|
||
|
||
console.log('🌱 Seeding complete!')
|
||
}
|
||
|
||
main()
|
||
.catch((e) => {
|
||
console.error('❌ Seed failed:', e)
|
||
process.exit(1)
|
||
})
|
||
.finally(async () => {
|
||
await prisma.$disconnect()
|
||
})
|