feat: 查积分、支付、拆弹、取消订单

This commit is contained in:
2026-07-28 18:39:34 +08:00
parent 53305757f8
commit c443109869
40 changed files with 1814 additions and 163 deletions
+118 -15
View File
@@ -8,7 +8,7 @@ datasource db {
}
model User {
id String @id @default(cuid())
id Int @id @default(autoincrement())
mobile String @unique
nickname String?
avatarUrl String?
@@ -20,22 +20,33 @@ model User {
orders Order[]
}
model Product {
id String @id @default(cuid())
model SupplierProduct {
id Int @id @default(autoincrement())
sku String @unique
number Int @default(0)
price Decimal @db.Decimal(10, 2)
name String
taxRate Decimal @default(0.13) @db.Decimal(5, 4)
picInfo Json?
description String?
detail String?
price Decimal @db.Decimal(10, 2)
originPrice Decimal? @db.Decimal(10, 2)
imageUrl String?
categoryId String?
category String?
tag String?
sales String?
stock Int @default(0)
sortOrder Int @default(0)
enabled Boolean @default(true)
deleted Int @default(0)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
carts CartItem[]
orderItems OrderItem[]
@@map("supplier_product")
}
model SupplierInfo {
@@ -56,24 +67,24 @@ model SupplierInfo {
}
model CartItem {
id String @id @default(cuid())
userId String
productId String
id Int @id @default(autoincrement())
userId Int
productId Int
skuText String?
quantity Int @default(1)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
product Product @relation(fields: [productId], references: [id], onDelete: Cascade)
product SupplierProduct @relation(fields: [productId], references: [id], onDelete: Cascade)
@@unique([userId, productId, skuText])
}
model Order {
id String @id @default(cuid())
id Int @id @default(autoincrement())
orderNo String @unique
userId String
userId Int
status OrderStatus @default(PENDING_PAYMENT)
totalAmount Decimal @db.Decimal(10, 2)
payType PayType?
@@ -86,17 +97,109 @@ model Order {
}
model OrderItem {
id String @id @default(cuid())
orderId String
productId String
id Int @id @default(autoincrement())
orderId Int
productId Int
name String
imageUrl String?
skuText String?
price Decimal @db.Decimal(10, 2)
quantity Int
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
product Product @relation(fields: [productId], references: [id])
order Order @relation(fields: [orderId], references: [id], onDelete: Cascade)
product SupplierProduct @relation(fields: [productId], references: [id])
}
model SupplierOrderMain {
id Int @id @default(autoincrement())
orderId String @unique
orderNumberId String?
supplierId String
userId String?
aplName String?
createTime DateTime?
updateTime DateTime?
deliveryTime DateTime?
orderFinishTime DateTime?
completeTime DateTime?
deliveryStatus String?
freightCost Decimal @default(0) @db.Decimal(10, 2)
wPayOrAPayFreightCost Decimal @default(0) @db.Decimal(10, 2)
refund Decimal @default(0) @db.Decimal(10, 2)
wPayOrAPayRefund Decimal @default(0) @db.Decimal(10, 2)
logisticsOrderId String?
crrgBsnNm String?
orderState Int @default(0)
totalPrice Decimal @default(0) @db.Decimal(10, 2)
wPayOrAPay Decimal @default(0) @db.Decimal(10, 2)
pointsPrice Decimal @default(0) @db.Decimal(10, 2)
invoiceCode String?
createAt DateTime @default(now())
updateAt DateTime @updatedAt
deleted Int @default(0)
subOrders SupplierOrderSub[]
@@map("supplier_order_main")
}
model SupplierOrderSub {
id Int @id @default(autoincrement())
orderId String @unique
orderNumberId String?
mainOrderId String
supplierId String
token String?
userId String?
aplName String?
createTime DateTime?
updateTime DateTime?
deliveryTime DateTime?
orderFinishTime DateTime?
completeTime DateTime?
deliveryStatus String?
freightCost Decimal @default(0) @db.Decimal(10, 2)
wPayOrAPayFreightCost Decimal @default(0) @db.Decimal(10, 2)
refund Decimal @default(0) @db.Decimal(10, 2)
wPayOrAPayRefund Decimal @default(0) @db.Decimal(10, 2)
logisticsOrderId String?
crrgBsnNm String?
orderState Int @default(0)
totalPrice Decimal @default(0) @db.Decimal(10, 2)
wPayOrAPay Decimal @default(0) @db.Decimal(10, 2)
pointsPrice Decimal @default(0) @db.Decimal(10, 2)
invoiceCode String?
createAt DateTime @default(now())
updateAt DateTime @updatedAt
deleted Int @default(0)
mainOrder SupplierOrderMain @relation(fields: [mainOrderId], references: [orderId], onDelete: Cascade)
products SupplierOrderProduct[]
@@index([mainOrderId])
@@map("supplier_order_sub")
}
model SupplierOrderProduct {
id Int @id @default(autoincrement())
subOrderId String
sku String
number Int
price Decimal @db.Decimal(10, 2)
name String
taxRate Decimal @default(0.13) @db.Decimal(5, 4)
productImgUrl String?
fileId String?
filePath String?
picInfo Json?
createAt DateTime @default(now())
updateAt DateTime @updatedAt
deleted Int @default(0)
subOrder SupplierOrderSub @relation(fields: [subOrderId], references: [orderId], onDelete: Cascade)
@@index([subOrderId])
@@map("supplier_order_product")
}
enum OrderStatus {
+96
View File
@@ -0,0 +1,96 @@
import { PrismaClient } from '@prisma/client'
const prisma = new PrismaClient()
const imagePool = [
'https://ts3.tc.mm.bing.net/th/id/OIP-C.im_WvX9bWGyvagEZp4Pz0AHaGX?w=142&h=108&c=7&qlt=90&bgcl=a01e15&r=0&o=6&dpr=1.3&pid=13.1',
'https://ts3.tc.mm.bing.net/th/id/OIP-C.MkmCbLoY2S4zqzMeHvCDMQHaHD?w=128&h=108&c=7&qlt=90&bgcl=f61537&r=0&o=6&dpr=1.3&pid=13.1',
'https://ts2.tc.mm.bing.net/th/id/OIP-C.CKSBSB33LwT9qJD_Yhb1mwHaKk?w=132&h=108&c=7&qlt=90&bgcl=2e287d&r=0&o=6&dpr=1.3&pid=13.1',
'https://tse1-mm.cn.bing.net/th/id/OIP-C.StrDRqennoZNbzSPZapKZwHaEJ?w=286&h=180&c=7&r=0&o=7&cb=thfc1falcon&dpr=1.3&pid=1.7&rm=3',
'https://tse3-mm.cn.bing.net/th/id/OIP-C.ynSetSr3z884UC6sEp4yiwHaEJ?w=331&h=186&c=7&r=0&o=7&cb=thfc1falcon&dpr=1.3&pid=1.7&rm=3'
]
const categories = {
homeLiving: '居家生活',
digitalAppliance: '数码家电',
beautyCare: '美妆个护',
foodDrink: '食品饮料',
motherBaby: '母婴玩具',
fashionBag: '服饰鞋包',
sportsOutdoor: '运动户外',
recommend: '精选推荐'
}
const rawProducts = [
['SKU001', '蓝牙耳机', '轻盈佩戴,稳定连接,通勤运动都好用', 149.99, 199.99, 'digitalAppliance', '积分兑换', '1.2万件', 2],
['SKU002', '手机壳', '防滑耐磨,贴合机身,日常保护更安心', 10.01, 19.9, 'digitalAppliance', '赠品', '5632件', 1],
['SKU003', '智能音箱 Pro', '语音唤醒,沉浸音效,适合卧室和书房', 99.0, 139.0, 'digitalAppliance', '热门推荐', '2.1万件', 1],
['SKU004', '奶油白迷你烤箱', '小巧不占地,早餐烘焙好帮手', 129.0, 169.0, 'homeLiving', '新品上架', '1.2万件', 1],
['SKU005', '北欧陶瓷餐具套装', '简约釉色,日常用餐更有仪式感', 69.9, 99.9, 'homeLiving', '品质精选', '6453件', 1],
['SKU006', '纯棉舒适四件套', '柔软亲肤,安心睡眠,四季可用', 179.0, 229.0, 'homeLiving', '积分兑换', '8321件', 1],
['SKU007', '植萃保湿护肤礼盒', '补水保湿,清爽不黏腻', 99.9, 139.9, 'beautyCare', '礼盒精选', '4820件', 1],
['SKU008', '香氛洗护旅行套装', '温和清洁,清新留香,出行便携', 59.9, 89.9, 'beautyCare', '新品上架', '7932件', 1],
['SKU009', '便携补光化妆镜', '高清镜面,柔光补妆,随身携带', 49.9, 79.9, 'beautyCare', '热门推荐', '3651件', 1],
['SKU010', '橙意零食礼盒', '精选零食组合,办公室分享刚刚好', 59.9, 89.9, 'foodDrink', '礼盒精选', '6324件', 1],
['SKU011', '咖啡随行杯组合', '锁温防漏,通勤随行更方便', 49.9, 69.9, 'foodDrink', '积分兑换', '3520件', 1],
['SKU012', '下午茶点心礼盒', '多种风味,一盒满足甜咸口味', 69.9, 99.9, 'foodDrink', '品质精选', '4891件', 1],
['SKU013', '安心儿童水杯', '轻巧易握,防摔耐用,出门好携带', 39.9, 59.9, 'motherBaby', '新品上架', '4250件', 1],
['SKU014', '益智积木套装', '色彩柔和,锻炼动手能力', 89.0, 129.0, 'motherBaby', '热门推荐', '2186件', 1],
['SKU015', '柔光儿童夜灯', '温和光线,陪伴睡前时光', 69.9, 99.9, 'motherBaby', '品质精选', '3548件', 1],
['SKU016', '大容量电脑背包', '分区收纳,通勤出行更轻松', 149.0, 199.0, 'fashionBag', '积分兑换', '1.6万件', 1],
['SKU017', '轻巧通勤斜挎包', '简洁百搭,日常出门更实用', 79.9, 109.9, 'fashionBag', '新品上架', '5321件', 1],
['SKU018', '柔软撞色丝巾礼盒', '细腻亲肤,点亮日常穿搭', 69.9, 99.9, 'fashionBag', '礼盒精选', '2680件', 1],
['SKU019', '运动保温水杯', '长效锁温,户外运动随行', 49.9, 79.9, 'sportsOutdoor', '热门推荐', '7342件', 1],
['SKU020', '筋膜放松按摩仪 Mini', '轻巧便携,缓解久坐酸胀', 99.0, 149.0, 'sportsOutdoor', '积分兑换', '3921件', 1],
['SKU021', '户外露营灯', '多档照明,露营夜晚更安心', 79.0, 119.0, 'sportsOutdoor', '新品上架', '2568件', 1],
['SKU022', '悦享精选礼包', '多场景精选好物,福利兑换优选', 59.9, 89.9, 'recommend', '精选推荐', '8820件', 1],
['SKU023', '品质生活组合装', '居家、通勤、日用好物组合', 119.0, 159.0, 'recommend', '热门推荐', '6902件', 1],
['SKU024', '积分兑换惊喜盒', '随机精选商品,兑换更有新鲜感', 39.9, 69.9, 'recommend', '限时秒杀', '5310件', 1]
]
const products = rawProducts.map(([sku, name, description, price, originPrice, categoryId, tag, sales, number], index) => {
const imageUrl = imagePool[index % imagePool.length]
const nextImageUrl = imagePool[(index + 1) % imagePool.length]
return {
sku,
number,
price,
name,
taxRate: 0.13,
picInfo: [imageUrl, nextImageUrl],
description,
detail: `${description}。精选品质商品,适合积分商城兑换和日常福利采购场景。`,
originPrice,
imageUrl,
categoryId,
category: categories[categoryId],
tag,
sales,
stock: 180 + index * 7,
sortOrder: index + 1,
enabled: true,
deleted: 0
}
})
const main = async () => {
for (const product of products) {
await prisma.supplierProduct.upsert({
where: { sku: product.sku },
update: product,
create: product
})
}
}
main()
.then(async () => {
await prisma.$disconnect()
console.log(`已导入 ${products.length} 条商品数据`)
})
.catch(async error => {
console.error(error)
await prisma.$disconnect()
process.exit(1)
})
@@ -0,0 +1,115 @@
CREATE TABLE IF NOT EXISTS `supplier_product` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '商品主键ID',
`sku` VARCHAR(191) NOT NULL COMMENT '商品SKU编码',
`number` INT NOT NULL DEFAULT 0 COMMENT '默认购买数量或导入数量',
`price` DECIMAL(10, 2) NOT NULL COMMENT '商品销售价格',
`name` VARCHAR(191) NOT NULL COMMENT '商品名称',
`taxRate` DECIMAL(5, 4) NOT NULL DEFAULT 0.1300 COMMENT '商品税率',
`picInfo` JSON NULL COMMENT '商品图片列表,JSON数组',
`description` VARCHAR(191) NULL COMMENT '商品简短描述',
`detail` VARCHAR(191) NULL COMMENT '商品详情描述',
`originPrice` DECIMAL(10, 2) NULL COMMENT '商品原价',
`imageUrl` VARCHAR(191) NULL COMMENT '商品主图地址',
`categoryId` VARCHAR(191) NULL COMMENT '商品分类ID',
`category` VARCHAR(191) NULL COMMENT '商品分类名称',
`tag` VARCHAR(191) NULL COMMENT '商品标签',
`sales` VARCHAR(191) NULL COMMENT '商品销量展示文案',
`stock` INT NOT NULL DEFAULT 0 COMMENT '商品库存',
`sortOrder` INT NOT NULL DEFAULT 0 COMMENT '排序值,越小越靠前',
`enabled` BOOLEAN NOT NULL DEFAULT true COMMENT '是否启用',
`deleted` INT NOT NULL DEFAULT 0 COMMENT '删除状态:0未删除,1已删除',
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间',
`updatedAt` DATETIME(3) NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `supplier_product_sku_key` (`sku`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='供应商商品信息表';
CREATE TABLE IF NOT EXISTS `supplier_order_main` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '主单主键ID',
`orderId` VARCHAR(191) NOT NULL COMMENT '主订单ID',
`orderNumberId` VARCHAR(191) NULL COMMENT '主订单编号',
`supplierId` VARCHAR(191) NOT NULL COMMENT '供应商ID',
`userId` VARCHAR(191) NULL COMMENT '平台用户ID',
`aplName` VARCHAR(191) NULL COMMENT '应用名称',
`createTime` DATETIME(3) NULL COMMENT '订单创建时间',
`updateTime` DATETIME(3) NULL COMMENT '订单更新时间',
`deliveryTime` DATETIME(3) NULL COMMENT '发货时间',
`orderFinishTime` DATETIME(3) NULL COMMENT '订单完成时间',
`completeTime` DATETIME(3) NULL COMMENT '交易完成时间',
`deliveryStatus` VARCHAR(191) NULL COMMENT '配送状态',
`freightCost` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '运费积分金额',
`wPayOrAPayFreightCost` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '微信或支付宝支付运费金额',
`refund` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '积分退款金额',
`wPayOrAPayRefund` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '微信或支付宝退款金额',
`logisticsOrderId` VARCHAR(191) NULL COMMENT '物流单号',
`crrgBsnNm` VARCHAR(191) NULL COMMENT '承运商名称',
`orderState` INT NOT NULL DEFAULT 0 COMMENT '订单状态',
`totalPrice` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '订单总金额',
`wPayOrAPay` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '微信或支付宝支付金额',
`pointsPrice` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '积分支付金额',
`invoiceCode` VARCHAR(191) NULL COMMENT '发票编码',
`createAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间',
`updateAt` DATETIME(3) NOT NULL COMMENT '记录更新时间',
`deleted` INT NOT NULL DEFAULT 0 COMMENT '删除状态:0未删除,1已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `supplier_order_main_orderId_key` (`orderId`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='供应商主订单表';
CREATE TABLE IF NOT EXISTS `supplier_order_sub` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '子单主键ID',
`orderId` VARCHAR(191) NOT NULL COMMENT '子订单ID',
`orderNumberId` VARCHAR(191) NULL COMMENT '子订单编号',
`mainOrderId` VARCHAR(191) NOT NULL COMMENT '所属主订单ID',
`supplierId` VARCHAR(191) NOT NULL COMMENT '供应商ID',
`token` VARCHAR(191) NULL COMMENT '平台桥接访问令牌快照',
`userId` VARCHAR(191) NULL COMMENT '平台用户ID',
`aplName` VARCHAR(191) NULL COMMENT '应用名称',
`createTime` DATETIME(3) NULL COMMENT '订单创建时间',
`updateTime` DATETIME(3) NULL COMMENT '订单更新时间',
`deliveryTime` DATETIME(3) NULL COMMENT '发货时间',
`orderFinishTime` DATETIME(3) NULL COMMENT '订单完成时间',
`completeTime` DATETIME(3) NULL COMMENT '交易完成时间',
`deliveryStatus` VARCHAR(191) NULL COMMENT '配送状态',
`freightCost` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '运费积分金额',
`wPayOrAPayFreightCost` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '微信或支付宝支付运费金额',
`refund` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '积分退款金额',
`wPayOrAPayRefund` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '微信或支付宝退款金额',
`logisticsOrderId` VARCHAR(191) NULL COMMENT '物流单号',
`crrgBsnNm` VARCHAR(191) NULL COMMENT '承运商名称',
`orderState` INT NOT NULL DEFAULT 0 COMMENT '订单状态',
`totalPrice` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '子订单总金额',
`wPayOrAPay` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '微信或支付宝支付金额',
`pointsPrice` DECIMAL(10, 2) NOT NULL DEFAULT 0.00 COMMENT '积分支付金额',
`invoiceCode` VARCHAR(191) NULL COMMENT '发票编码',
`createAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间',
`updateAt` DATETIME(3) NOT NULL COMMENT '记录更新时间',
`deleted` INT NOT NULL DEFAULT 0 COMMENT '删除状态:0未删除,1已删除',
PRIMARY KEY (`id`),
UNIQUE KEY `supplier_order_sub_orderId_key` (`orderId`),
KEY `supplier_order_sub_mainOrderId_idx` (`mainOrderId`),
CONSTRAINT `supplier_order_sub_mainOrderId_fkey`
FOREIGN KEY (`mainOrderId`) REFERENCES `supplier_order_main` (`orderId`)
ON DELETE CASCADE ON UPDATE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='供应商子订单表';
CREATE TABLE IF NOT EXISTS `supplier_order_product` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '子单商品主键ID',
`subOrderId` VARCHAR(191) NOT NULL COMMENT '所属子订单ID',
`sku` VARCHAR(191) NOT NULL COMMENT '商品SKU编码',
`number` INT NOT NULL COMMENT '商品购买数量',
`price` DECIMAL(10, 2) NOT NULL COMMENT '商品成交单价',
`name` VARCHAR(191) NOT NULL COMMENT '商品名称快照',
`taxRate` DECIMAL(5, 4) NOT NULL DEFAULT 0.1300 COMMENT '商品税率快照',
`productImgUrl` VARCHAR(191) NULL COMMENT '商品图片地址',
`fileId` VARCHAR(191) NULL COMMENT '平台文件ID或图片ID',
`filePath` VARCHAR(191) NULL COMMENT '文件存储路径',
`picInfo` JSON NULL COMMENT '商品图片列表快照,JSON数组',
`createAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '记录创建时间',
`updateAt` DATETIME(3) NOT NULL COMMENT '记录更新时间',
`deleted` INT NOT NULL DEFAULT 0 COMMENT '删除状态:0未删除,1已删除',
PRIMARY KEY (`id`),
KEY `supplier_order_product_subOrderId_idx` (`subOrderId`),
CONSTRAINT `supplier_order_product_subOrderId_fkey`
FOREIGN KEY (`subOrderId`) REFERENCES `supplier_order_sub` (`orderId`)
ON DELETE CASCADE ON UPDATE CASCADE
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT='供应商子订单商品表';