270 lines
8.2 KiB
TypeScript
270 lines
8.2 KiB
TypeScript
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();
|
|
});
|