Files
dukang/server/dukang-api/prisma/seed-prev1.ts
T
jacy b392c28787
CI / verify (pull_request) Has been cancelled
feat(settlement): redesign factory/partner/store statement bills
Add WineryBill/StoreBill tables, partner review-send-confirm flow, daily/monthly cron, and admin multi-select confirm with status filters.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-22 17:25:49 +08:00

246 lines
6.5 KiB
TypeScript

import { PrismaClient } from '@prisma/client';
const prisma = new PrismaClient();
async function main() {
console.log('Seeding preV1 data...');
await prisma.partnerBill.deleteMany();
await prisma.storePayout.deleteMany();
await prisma.redeemRecord.deleteMany();
await prisma.benefitLedger.deleteMany();
await prisma.benefitCoupon.deleteMany();
await prisma.orderStatusLog.deleteMany();
await prisma.orderDelivery.deleteMany();
await prisma.payment.deleteMany();
await prisma.orderItem.deleteMany();
await prisma.order.deleteMany();
await prisma.storeAudit.deleteMany();
await prisma.storeAccount.deleteMany();
await prisma.storeMedia.deleteMany();
await prisma.store.deleteMany();
await prisma.userCityPreference.deleteMany();
await prisma.userAddress.deleteMany();
await prisma.user.deleteMany();
await prisma.partnerAccount.deleteMany();
await prisma.cityCommissionRule.deleteMany();
await prisma.city.deleteMany();
await prisma.partner.deleteMany();
await prisma.product.deleteMany();
await prisma.storeCategory.deleteMany();
await prisma.hqAccount.deleteMany();
const partner = await prisma.partner.create({
data: {
companyName: '郑州城市合伙人',
address: '河南省郑州市金水区',
contactPhone: '13700000001',
bankAccountName: '郑州合伙人公司',
bankAccountNo: '6222021234567890',
bankBranch: '工商银行郑州分行',
},
});
const city = await prisma.city.create({
data: {
code: '410100',
name: '郑州市',
province: '河南省',
status: 'ACTIVE',
partnerId: partner.id,
localMinQty: 2,
crossMinQty: 6,
},
});
await prisma.cityCommissionRule.create({
data: {
cityId: city.id,
orderCommissionRate: 0.05,
redeemCommissionRate: 0.03,
partnerProfitRate: 0.35,
storeSettlementRate: 0.6,
},
});
const categories = await Promise.all([
prisma.storeCategory.create({ data: { code: 'HOTPOT', name: '火锅', sort: 1 } }),
prisma.storeCategory.create({ data: { code: 'LOCAL', name: '地方菜', sort: 2 } }),
]);
const products = await Promise.all([
prisma.product.create({
data: {
skuCode: 'QX-001',
name: '杜康·白水古酿 500ml',
subtitle: '清香型 52度 礼盒装',
aromaType: 'QINGXIANG',
spec: '500ml | 52度',
price: 599,
benefitAmount: 599,
status: 'ON_SALE',
sortOrder: 1,
mainImageUrl: 'https://picsum.photos/seed/dukang1/400/400',
},
}),
prisma.product.create({
data: {
skuCode: 'QX-002',
name: '杜康·年份陈酿(十年)',
subtitle: '清香型 42度 纯粮酿造',
aromaType: 'QINGXIANG',
spec: '500ml | 42度',
price: 880,
benefitAmount: 880,
status: 'ON_SALE',
sortOrder: 2,
mainImageUrl: 'https://picsum.photos/seed/dukang2/400/400',
},
}),
prisma.product.create({
data: {
skuCode: 'QX-003',
name: '杜康·御享1号 珍藏版',
subtitle: '高端定制 限量发售',
aromaType: 'QINGXIANG',
spec: '500ml | 52度',
price: 1299,
benefitAmount: 1299,
status: 'ON_SALE',
sortOrder: 3,
mainImageUrl: 'https://picsum.photos/seed/dukang3/400/400',
},
}),
prisma.product.create({
data: {
skuCode: 'QX-004',
name: '杜康·经典传承',
subtitle: '清香型 纯粮固态',
aromaType: 'QINGXIANG',
spec: '500ml | 46度',
price: 399,
benefitAmount: 399,
status: 'ON_SALE',
sortOrder: 4,
mainImageUrl: 'https://picsum.photos/seed/dukang4/400/400',
},
}),
]);
await prisma.partnerAccount.create({
data: {
partnerId: partner.id,
phone: '13700000001',
name: '郑州合伙人主账号',
isPrimary: 1,
staffRole: 'PARTNER',
},
});
const store1 = await prisma.store.create({
data: {
cityId: city.id,
partnerId: partner.id,
categoryId: categories[0].id,
name: '郑州老城店',
phone: '13910000001',
province: '河南省',
cityName: '郑州市',
district: '金水区',
address: '花园路100号',
intro: '正宗河南菜,欢迎核销好客权益',
coverUrl: 'https://picsum.photos/seed/store1/400/300',
status: 'OPEN',
openTime: '10:00',
closeTime: '22:00',
bankAccountName: '郑州老城店',
bankAccountNo: '6222029876543210',
bankBranch: '建设银行郑州分行',
},
});
const store2 = await prisma.store.create({
data: {
cityId: city.id,
partnerId: partner.id,
categoryId: categories[1].id,
name: '郑州美食城店',
phone: '13910000002',
province: '河南省',
cityName: '郑州市',
district: '二七区',
address: '大学路200号',
intro: '地方特色餐饮',
coverUrl: 'https://picsum.photos/seed/store2/400/300',
status: 'OPEN',
openTime: '10:00',
closeTime: '22:00',
},
});
await prisma.storeAccount.create({
data: { storeId: store1.id, phone: '13910000001', name: '郑州老城店' },
});
await prisma.user.create({
data: {
userNo: 'DK88293401',
phone: '13800000001',
nickname: '测试用户',
cityPref: {
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: 'UNPAID',
confirmedAt: now,
},
});
console.log('Seed complete:', {
city: city.name,
products: products.length,
stores: 2,
testPhones: {
user: '13800000001',
store: '13910000001',
partner: '13700000001',
},
});
}
main()
.catch((e) => {
console.error(e);
process.exit(1);
})
.finally(async () => {
await prisma.$disconnect();
});