优先级: P1
预计工时: 后端 1.5h + 前端 2h
创建日期: 2026-09-12
| 端点 | 说明 |
|---|---|
POST /api/product/order/review/update |
供应商审核修改订单(统一入口) |
请求体:
{
"orderNo": "PO20260912001",
"unitPrice": 29900, // 新单价(分),null=不修改
"deliveryMethod": 2, // 新配送方式,null=不修改
"couponId": null, // 供应商创建的临时优惠券ID
"couponType": "ONE_TIME", // 临时券类型: ONE_TIME/VENDOR_SPECIAL
"couponValue": 500, // 临时券金额(分)
"giftItems": [ // 新增赠品列表
{
"giftType": "product",
"giftProductId": 123,
"giftProductName": "赠品名称",
"giftProductImage": "https://...",
"quantity": 1
}
],
"remark": "供应商备注:已为用户申请了优惠券和赠品"
}
响应:
{
"code": 200,
"message": "订单已更新",
"data": {
"orderNo": "PO20260912001",
"totalAmount": 24900,
"moneyAmount": 24900,
"pointsCost": 0,
"deliveryMethod": 2,
"giftItems": [...],
"reviewHistory": [
{
"reviewerId": 456,
"reviewerName": "供应商名称",
"reviewedAt": "2026-09-12T10:30:00",
"changes": {
"price": {"before": 39900, "after": 29900},
"delivery": {"before": 1, "after": 2},
"gifts": [{"added": "赠品名称", "quantity": 1}]
}
}
]
}
}
1. 查询订单,确认 status == "pending"
2. 确认供应商是该订单商品的 vendorId(或 supplierId 匹配当前userId)
3. 执行修改(见下方各字段处理逻辑)
4. 重新计算金额
5. 记录修改历史
6. 返回更新后订单信息
单价/总价修改
unitPrice 不为 null:
totalAmount = unitPrice * quantitymoneyAmount = totalAmount - pointsCost(如果 pointsUsed > 0,积分抵扣不变)配送方式修改
deliveryMethod 不为 null:
pickupLocationId 和 timeSlotId 非空servicePersonId 和 timeSlotId 非空优惠券添加
couponType == "ONE_TIME" 或 couponValue 不为 null:
coupon 表创建一条一次性优惠券记录(name="供应商临时券" + 订单号,type="ONE_TIME",value=couponValue,minSpend=0,discountRate=null,status="ACTIVE",validFrom=当前,validUntil=订单取消时间后7天)user_coupon 表创建一条用户可用记录(couponId=新券id,userId=order.buyerId,status="AVAILABLE",orderId=order.id)couponId 指向新券discountAmount:根据优惠券的 value 或 discountRate 计算moneyAmount = totalAmount - discountAmount赠品添加
giftItems 不为空:
product_order_gifts 表插入新记录修改历史
order.remark 字段记录供应商备注(已有字段)reviewHistory 数组(基于 remark 解析或新建审计表)简化方案:先通过
remark字段记录变更信息,不新建审计表。后续如需完整变更日志再补充。
pages/vendor/orders/orders.vue)在 pending 状态的订单卡片上增加「审核」按钮:
<button v-if="item.status === 'pending'" class="btn-review" @click.stop="onReview(item)">
审核修改
</button>
跳转路径:/pages/vendor/order-review/order-review?orderNo={orderNo}
pages/vendor/order-review/order-review.vue)页面结构:
┌─────────────────────────────────┐
│ 订单号:PO20260912001 │
│ 订单状态:待支付 │
├─────────────────────────────────┤
│ 商品信息 │
│ [图片] 商品名称 x1 │
│ 原价:¥299.00 │
├─────────────────────────────────┤
│ 修改价格 【修改】 │
│ 修改配送方式 【修改】 │
│ 添加优惠券 【添加】 │
│ 添加赠品 【添加】 │
├─────────────────────────────────┤
│ 修改记录(若有) │
│ 2026-09-12 10:30 供应商修改价格 │
│ 299 → 249,新增赠品×1 │
├─────────────────────────────────┤
│ [保存修改] │
└─────────────────────────────────┘
各模块交互:
/api/product/order/review/update,成功后返回列表并 Toast 提示order-detail.vue)当当前用户为订单商品的供应商时,在详情页底部增加「审核操作」入口(仅 pending 状态):
order-review 页面传入 orderNo在费用明细区块下方增加「供应商修改记录」区块(从 remark 解析显示):
供应商备注:已为用户申请优惠券减免50元并赠送定制笔记本
ProductOrder 实体(无需新增列,复用现有字段):
remark 字段用于记录供应商修改备注(已存在)无需新增实体,所有功能复用现有表:
coupon + user_coupon 表product_order_gifts 表deliveryMethod + 对应快照字段// 迁移48: product_orders 添加 review_remark 字段(供应商审核备注)
ensureColumn("product_orders", "review_remark", "TEXT COMMENT '供应商审核修改备注'");
(如果复用 remark 字段则无需迁移,remark 字段已存在)
ProductOrderService.reviewAndUpdate() — 审核修改核心逻辑ProductOrderController.reviewUpdate() — 审核修改接口pages/vendor/order-review/order-review.vue — 审核页面utils/api.js — 新增 productOrderReviewUpdate() 封装pending (待支付)
├── 供应商审核修改 ──→ pending (待支付,金额已变)
├── 用户支付 ──→ paid (已支付)
└── 取消/超时 ──→ cancelled (已取消)
关键约束:供应商审核只能在 pending 状态下执行。已支付后不可修改。
| 场景 | 处理 |
|---|---|
| 供应商修改了配送方式,但原订单的自提地点/服务者已失效 | 重新选择时校验有效性,无效则拒绝 |
| 修改后价格比原价低 | 允许,提示"已降价" |
| 修改后价格比原价高 | 允许,提示"已加价" |
| 用户已支付后才看到修改通知 | 用户已在原金额支付,修改不生效(pending 状态下才修改) |
| 同一订单多次审核修改 | 每次修改都记录,remark 追加备注 |
Controller 新增:
@PostMapping("/review/update")
public Result<Map<String, Object>> reviewUpdate(@RequestBody Map<String, Object> params,
@RequestAttribute("userId") Long userId) {
return orderService.reviewUpdate(params, userId);
}
Service 核心方法 reviewUpdate 流程:
审核页面交互流程:
onLoad(options) 中读取 orderNo,调用 productOrderDetail 获取订单信息productOrderReviewUpdateuni.navigateBack() 返回订单列表