2026-09-12-vendor-order-review-design.md 10 KB

供应商订单审核功能设计文档

优先级: P1
预计工时: 后端 1.5h + 前端 2h
创建日期: 2026-09-12


用户故事

  • 作为商品供应商,我希望在用户提交待支付订单后进行审核,可以修改价格、配送方式、添加优惠券和赠品,以便优化订单体验并促成成交。
  • 作为买家,我希望在供应商修改订单后看到新的金额和优惠信息,以便知晓变动原因后确认支付。

验收标准

  • 供应商在订单列表页可以查看待支付订单,并点击进入审核模式
  • 待支付订单(status=pending)允许修改价格、配送方式、优惠券、赠品
  • 已支付及之后状态的订单不可修改
  • 修改价格后自动重新计算 totalAmount / moneyAmount
  • 配送方式修改仅限商品配置允许的方式
  • 添加优惠券时自动创建一次性临时优惠券并关联订单
  • 添加赠品直接写入 product_order_gifts,无需校验库存
  • 用户端订单详情页显示供应商修改记录
  • 修改后订单状态保持 pending,用户按新金额支付

技术方案

一、后端 API 设计

1. 新增接口:供应商审核更新

端点 说明
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}]
        }
      }
    ]
  }
}

2. 权限校验逻辑

1. 查询订单,确认 status == "pending"
2. 确认供应商是该订单商品的 vendorId(或 supplierId 匹配当前userId)
3. 执行修改(见下方各字段处理逻辑)
4. 重新计算金额
5. 记录修改历史
6. 返回更新后订单信息

3. 各字段修改逻辑

单价/总价修改

  • 如果 unitPrice 不为 null:
    • totalAmount = unitPrice * quantity
    • moneyAmount = totalAmount - pointsCost(如果 pointsUsed > 0,积分抵扣不变)
    • 校验 unitPrice >= 0

配送方式修改

  • 如果 deliveryMethod 不为 null:
    • 查询商品,确认新 deliveryMethod 在商品允许的范围内
    • 如果新方式为自提(2/3):校验 pickupLocationId 和 timeSlotId 非空
    • 如果新方式为线上服务(4/5):校验 servicePersonId 和 timeSlotId 非空
    • 更新对应快照字段(pickupLocationSnapshot / timeSlotSnapshot / servicePersonSnapshot)

优惠券添加

  • 如果 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 表插入新记录
    • giftType 默认 "product",quantity 默认 1
    • 不需要校验库存或会员等级

修改历史

  • 使用 order.remark 字段记录供应商备注(已有字段)
  • 在订单详情返回时附加 reviewHistory 数组(基于 remark 解析或新建审计表)

简化方案:先通过 remark 字段记录变更信息,不新建审计表。后续如需完整变更日志再补充。

二、前端设计

1. 订单列表页增强(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}

2. 新增审核页面(pages/vendor/order-review/order-review.vue)

页面结构:

┌─────────────────────────────────┐
│  订单号:PO20260912001           │
│  订单状态:待支付                │
├─────────────────────────────────┤
│  商品信息                        │
│  [图片] 商品名称 x1             │
│  原价:¥299.00                  │
├─────────────────────────────────┤
│  修改价格  【修改】                │
│  修改配送方式  【修改】             │
│  添加优惠券  【添加】              │
│  添加赠品  【添加】               │
├─────────────────────────────────┤
│  修改记录(若有)                  │
│  2026-09-12 10:30 供应商修改价格   │
│  299 → 249,新增赠品×1            │
├─────────────────────────────────┤
│  [保存修改]                       │
└─────────────────────────────────┘

各模块交互:

  • 修改价格:弹出 modal,输入新单价,实时预览新总价
  • 修改配送方式:选择配送方式(1快递/2自提),切换后根据方式显示对应表单(地址选择/自取地点选择)
  • 添加优惠券:弹出 modal,输入优惠券名称和金额,确认后创建临时券并关联
  • 添加赠品:弹出 modal,从商品库选择赠品商品,确认后写入
  • 保存修改:调用 /api/product/order/review/update,成功后返回列表并 Toast 提示

3. 订单详情页增强(order-detail.vue)

当当前用户为订单商品的供应商时,在详情页底部增加「审核操作」入口(仅 pending 状态):

  • 跳转到 order-review 页面传入 orderNo

在费用明细区块下方增加「供应商修改记录」区块(从 remark 解析显示):

供应商备注:已为用户申请优惠券减免50元并赠送定制笔记本

三、数据模型变更

3.1 需新增的字段

ProductOrder 实体(无需新增列,复用现有字段):

  • remark 字段用于记录供应商修改备注(已存在)

无需新增实体,所有功能复用现有表:

  • 临时优惠券 → 写入 coupon + user_coupon 表
  • 赠品 → 写入 product_order_gifts 表
  • 配送方式 → 写入 deliveryMethod + 对应快照字段

3.2 数据库迁移

// 迁移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 流程:

  1. 查询订单,校验 status == "pending"
  2. 校验供应商权限(product.vendorId == userId)
  3. 逐字段处理修改(price / delivery / coupon / gift / remark)
  4. 重新计算金额
  5. 写入数据库
  6. 返回更新后的订单数据和修改历史

八、前端实现细节

审核页面交互流程:

  1. onLoad(options) 中读取 orderNo,调用 productOrderDetail 获取订单信息
  2. 校验供应商权限(当前用户是否为商品供应商)
  3. 渲染订单基本信息
  4. 各操作项(价格/配送/优惠券/赠品)点击后弹出模态框
  5. 所有修改暂存在 data 中,点击「保存修改」时统一调用 productOrderReviewUpdate
  6. 成功后 uni.navigateBack() 返回订单列表