import { PrismaClient, ResourceBizType, ResourceMediaType, ResourceOwnerType } from '@prisma/client'; import { DEFAULT_PRODUCT_DETAIL_TEMPLATES } from './seeds/product-detail-templates.default'; const prisma = new PrismaClient(); async function createMockResource( ownerType: ResourceOwnerType, ownerId: bigint, bizType: ResourceBizType, url: string, ) { return prisma.commonResource.create({ data: { ownerType, ownerId, bizType, mediaType: ResourceMediaType.IMAGE, ossBucket: 'mock-dukang', ossKey: `mock/${ownerType.toLowerCase()}/${ownerId}/${bizType.toLowerCase()}`, url, }, }); } async function main() { console.log('Seeding v3.1 data...'); await prisma.logUserAnalytics.deleteMany(); await prisma.logThirdParty.deleteMany(); await prisma.storePayout.deleteMany(); await prisma.storeRating.deleteMany(); await prisma.redeemRecord.deleteMany(); await prisma.benefitCoupon.deleteMany(); await prisma.orderDelivery.deleteMany(); await prisma.order.deleteMany(); await prisma.commonEvent.deleteMany(); await prisma.commonTicket.deleteMany(); await prisma.userPromoAttribution.deleteMany(); await prisma.userCityPreference.deleteMany(); await prisma.userAddress.deleteMany(); await prisma.user.deleteMany(); await prisma.storeAccount.deleteMany(); await prisma.store.deleteMany(); await prisma.partnerBill.deleteMany(); await prisma.partnerAccount.deleteMany(); await prisma.commonCityCommissionRule.deleteMany(); await prisma.commonCity.deleteMany(); await prisma.partner.deleteMany(); await prisma.commonProductItem.deleteMany(); await prisma.commonProductDetailTemplate.deleteMany(); await prisma.commonStoreCategory.deleteMany(); await prisma.commonPromoCode.deleteMany(); await prisma.commonResource.deleteMany(); await prisma.hqAccount.deleteMany(); const partner = await prisma.partner.create({ data: { companyName: '郑州城市合伙人', address: '河南省郑州市金水区', contactPhone: '13700000001', bankAccountName: '郑州合伙人公司', bankAccountNo: '6222021234567890', bankBranch: '工商银行郑州分行', }, }); const city = await prisma.commonCity.create({ data: { code: '410100', name: '郑州市', province: '河南省', status: 'ACTIVE', partnerId: partner.id, localMinQty: 2, crossMinQty: 6, }, }); await prisma.commonCityCommissionRule.create({ data: { cityId: city.id, orderCommissionRate: 0.05, redeemCommissionRate: 0.03, partnerProfitRate: 0.35, storeSettlementRate: 0.6, }, }); const categories = await Promise.all([ prisma.commonStoreCategory.create({ data: { code: 'HOTPOT', name: '火锅', sort: 1 } }), prisma.commonStoreCategory.create({ data: { code: 'LOCAL', name: '地方菜', sort: 2 } }), ]); for (const tpl of DEFAULT_PRODUCT_DETAIL_TEMPLATES) { await prisma.commonProductDetailTemplate.create({ data: { code: tpl.code, name: tpl.name, description: tpl.description, aromaType: tpl.aromaType as 'QINGXIANG' | 'JIANGXIANG' | 'NONGXIANG' | null, storyTitle: tpl.storyTitle, storyText: tpl.storyText, features: tpl.features, detailImageUrls: [], suggestedDetailImageCount: tpl.suggestedDetailImageCount, sortOrder: tpl.sortOrder, status: 'ACTIVE', }, }); } const productDefs = [ { skuCode: 'QX-001', name: '杜康·白水古酿 500ml', subtitle: '清香型 52度 礼盒装', price: 599, sortOrder: 1, img: 'https://picsum.photos/seed/dukang1/400/400' }, { skuCode: 'QX-002', name: '杜康·年份陈酿(十年)', subtitle: '清香型 42度 纯粮酿造', price: 880, sortOrder: 2, img: 'https://picsum.photos/seed/dukang2/400/400' }, { skuCode: 'QX-003', name: '杜康·御享1号 珍藏版', subtitle: '高端定制 限量发售', price: 1299, sortOrder: 3, img: 'https://picsum.photos/seed/dukang3/400/400' }, { skuCode: 'QX-004', name: '杜康·经典传承', subtitle: '清香型 纯粮固态', price: 399, sortOrder: 4, img: 'https://picsum.photos/seed/dukang4/400/400' }, ]; const products = []; for (const [i, def] of productDefs.entries()) { const product = await prisma.commonProductItem.create({ data: { skuCode: def.skuCode, barcode69: `69000000000${i + 1}`, name: def.name, subtitle: def.subtitle, aromaType: 'QINGXIANG', spec: def.skuCode === 'QX-002' ? '500ml | 42度' : def.skuCode === 'QX-004' ? '500ml | 46度' : '500ml | 52度', price: def.price, benefitAmount: def.price, status: 'ON_SALE', sortOrder: def.sortOrder, }, }); const cover = await createMockResource(ResourceOwnerType.PRODUCT, product.id, ResourceBizType.COVER, def.img); await prisma.commonProductItem.update({ where: { id: product.id }, data: { coverResourceId: cover.id }, }); products.push(product); } await prisma.partnerAccount.create({ data: { partnerId: partner.id, phone: '13700000001', name: '郑州合伙人主账号', isPrimary: 1, staffRole: 'PARTNER', }, }); const storeDefs = [ { name: '郑州老城店', phone: '0371-88880001', district: '金水区', address: '花园路100号', intro: '正宗河南菜,欢迎核销好客权益', img: 'https://picsum.photos/seed/store1/400/300', categoryId: categories[0].id, accountPhone: '13900000001', accountName: '老城店店长', }, { name: '郑州美食城店', phone: '0371-88880002', district: '二七区', address: '大学路200号', intro: '地方特色餐饮', img: 'https://picsum.photos/seed/store2/400/300', categoryId: categories[1].id, accountPhone: '13900000002', accountName: '美食城店长', }, ]; for (const def of storeDefs) { const store = await prisma.store.create({ data: { cityId: city.id, partnerId: partner.id, categoryId: def.categoryId, name: def.name, phone: def.phone, province: '河南省', cityName: '郑州市', district: def.district, address: def.address, intro: def.intro, status: 'OPEN', openTime: '10:00', closeTime: '22:00', bankAccountName: def.name, bankAccountNo: '6222029876543210', bankBranch: '建设银行郑州分行', }, }); const cover = await createMockResource(ResourceOwnerType.STORE, store.id, ResourceBizType.COVER, def.img); await prisma.store.update({ where: { id: store.id }, data: { coverResourceId: cover.id } }); await prisma.storeAccount.create({ data: { storeId: store.id, phone: def.accountPhone, name: def.accountName }, }); } await prisma.user.create({ data: { userNo: 'DK88293401', phone: '13800000001', phoneVerifiedAt: new Date(), nickname: '测试用户', cityPreference: { create: { selectedCityCode: '410100', selectedDistrict: '郑州市', locateCityCode: '410100', locateDistrict: '金水区', }, }, }, }); await prisma.hqAccount.create({ data: { phone: '13600000001', name: '总部管理员', adminRole: 'SUPER_ADMIN', }, }); const now = new Date(); const periodStart = new Date(now.getFullYear(), now.getMonth(), 1); const periodEnd = new Date(now.getFullYear(), now.getMonth() + 1, 0); await prisma.partnerBill.create({ data: { billNo: `PB${Date.now()}`, partnerId: partner.id, periodStart, periodEnd, orderCommission: 1200, redeemCommission: 800, totalAmount: 2000, status: 'CONFIRMED', confirmedAt: now, }, }); console.log('Seed complete:', { city: city.name, detailTemplates: DEFAULT_PRODUCT_DETAIL_TEMPLATES.length, products: products.length, stores: storeDefs.length, testPhones: { user: '13800000001', store: '13900000001', partner: '13700000001', hq: '13600000001', }, }); } main() .catch((e) => { console.error(e); process.exit(1); }) .finally(async () => { await prisma.$disconnect(); });