# 我的订单 — 技术方案（C 端）

> **依据：** 《我的订单功能需求.md》v1.0  
> **关联：** 平台《订单管理技术方案.md》v1.0.2、《订单管理功能需求.md》v1.0.1、《会员管理技术方案.md》v1.3、《关联需求分析.md》v1.6 §12.1；C 端《确认订单页（多商品）技术方案.md》v1.1、《确认订单页（单商品）技术方案.md》v1.0、《商品详情内页技术方案.md》v1.4  
> **范围：** C 端 **`/api/order/**`** 订单列表/详情/角标、**续付**、**确认收货**、**评价**、**售后**；**复用** `biz_order` 三表；**不含** 平台履约写操作、微信 SDK 生产对接、商家售后审核 UI。  
> **原则：** 与确认订单 **同源表**；列表/详情 **读快照**；**支付成功扣库存**（O4）；**买家确认收货** 才完成（O7）；评价 **一行一评**（`order_item_id`）；售后 **C 端申请 + 店铺侧处理**（审核另册）。

---

## 1. 技术架构

| 项 | 选型 |
|----|------|
| 基础框架 | RuoYi **v3.9.2**（`springboot2` 分支） |
| 数据库 | **MySQL 5.7.39** |
| ORM / 响应 | MyBatis；列表 **`TableDataInfo`** 或 `AjaxResult` + 分页字段；`AjaxResult`（`code`、`msg`、`data`） |
| 鉴权 | 须 **会员 Token**（`MemberWebConfig` → `/api/order/**`） |
| 分页 | 订单列表、评价列表、售后列表 **分页**；角标 **计数接口** |
| 文件上传 | 评价/售后凭证复用 RuoYi **`/common/upload`** 或 OSS 配置 |
| 支付 v1 | **续付复用** `POST /api/order/{orderId}/pay`（Mock）；生产对接 **另册** |

### 1.1 与确认订单方案的关系

| 维度 | 确认订单（checkout） | **本册（我的订单）** |
|------|----------------------|----------------------|
| 包路径 | `com.ruoyi.web.modules.order` | **同一包**，扩展 Service/Controller |
| 写订单主状态 | submit → 待支付；pay → 待发货 | **confirmReceive** → 已完成；**不** 新建订单 |
| 读表 | `biz_order` + `biz_order_item` | **同源** + `biz_order_logistics_trace`（只读最新节点） |
| pay 接口 | 首次支付 + **续付共用** | 列表/详情 **展示** + 调用同一 pay |
| 评价/售后 | **不涉及** | **新建** `biz_goods_review`、`biz_order_aftersale` |

### 1.2 模块落位

```text
baqing-shop/src/main/java/com/ruoyi/web/modules/order/
├── controller/
│   ├── OrderAppController.java           # /api/order/**  扩展（已有 · 部分实现）
│   ├── OrderReviewAppController.java     # /api/order/review/**  评价（待建）
│   └── OrderAftersaleAppController.java  # /api/order/aftersale/**  售后（待建）
├── service/
│   ├── IOrderAppService.java             # 扩展 list/detail/pay/confirm/badges
│   ├── impl/OrderAppServiceImpl.java     # 已有 · 扩展
│   ├── IOrderReviewAppService.java       # 待建
│   ├── impl/OrderReviewAppServiceImpl.java
│   ├── IOrderAftersaleAppService.java    # 待建
│   └── impl/OrderAftersaleAppServiceImpl.java
├── support/
│   ├── OrderSupport.java                 # 已有 · 状态/关单文案
│   └── OrderAppSupport.java              # C 端列表摘要/角标/物流最新节点（待建）
├── constant/
│   ├── OrderConstants.java               # 已有
│   └── OrderAppConstants.java            # C 端页签/评价态/售后态（待建）
├── dto/
│   ├── OrderAppListQueryDTO.java         # tab + 分页
│   ├── OrderReviewSubmitDTO.java
│   └── OrderAftersaleSubmitDTO.java
├── vo/
│   ├── OrderAppListRowVO.java            # 已有 · 扩展商品摘要
│   ├── OrderAppDetailVO.java             # 已有 · 扩展地址/物流/关闭原因
│   ├── OrderAppBadgeVO.java
│   ├── OrderAppLogisticsVO.java
│   ├── OrderReviewListRowVO.java
│   ├── OrderReviewDetailVO.java
│   ├── OrderAftersaleListRowVO.java
│   └── OrderAftersaleDetailVO.java
├── domain/
│   ├── BizOrderAftersale.java            # 待建
│   └── BizGoodsReview.java               # 待建（与 sql 对齐）
├── mapper/
│   ├── BizOrderMapper.java               # 已有 · 扩展 C 端列表 SQL
│   ├── BizOrderItemMapper.java           # 已有
│   ├── BizOrderLogisticsTraceMapper.java # 已有 · 读最新节点
│   ├── BizGoodsReviewMapper.java         # 待建
│   └── BizOrderAftersaleMapper.java      # 待建
└── job/OrderPayTimeoutJob.java           # 已有 · O8

account/（协作）
├── MemberWebConfig.java                  # /api/order/** 已追加
├── support/MemberContext.java
└── facade/IMemberFacade.isMemberEnabled / refreshConsumption

store/（协作）
└── BizShopMapper                         # 列表读 shopAvatar（可选实时）

sql/
├── biz_order.sql                         # 已有 · 权威 DDL
├── biz_goods_review.sql                  # 已有 · 评价
└── biz_order_aftersale.sql               # 待建 · 售后
```

### 1.3 协作链

```text
【上游】确认订单 submit/pay → biz_order(0/1) + biz_order_item
    ↓
【平台】/agri/order 发货 → status=2 + biz_order_logistics_trace
    ↓
【本模块 · 读】
    GET /api/order/badges
    GET /api/order/list?tab=
    GET /api/order/{orderId}
    ↓
【本模块 · 写】
    POST /api/order/{orderId}/pay              # 续付（已有）
    POST /api/order/{orderId}/confirm-receive  # 2→3 + trace(4) + refreshConsumption
    POST /api/order/{orderId}/review           # INSERT biz_goods_review
    POST /api/order/aftersale/submit           # INSERT biz_order_aftersale
    ↓
【下游】
    商品详情 GET /api/goods/{id}               # 再买一单
    店铺后台 售后订单（待建）                    # 处理 aftersale
    IMemberFacade.refreshConsumption           # O11
```

| 关联模块 | 协作 |
|----------|------|
| **确认订单** | pay/detail **共用**；submit **不在本模块** |
| **平台订单管理** | 同源 `biz_order`；平台写发货/物流；C 端 **只读 trace** |
| **商品详情** | 再买一单跳转；四条件 **canPurchase** |
| **会员** | `member_id` 隔离；完成后 **refreshConsumption** |
| **商品评价展示** | `biz_goods_review` 写入后，详情 `/reviews` **可读** |

### 1.4 跨模块 Facade

| 接口 | 本模块用法 |
|------|------------|
| **`IMemberFacade.isMemberEnabled`** | 全部接口 |
| **`IMemberFacade.refreshConsumption(memberId)`** | 确认收货成功后（O11） |
| **`IGoodsPurchaseFacade.canPurchase`** | 再买一单 **前置**（前端或详情页） |
| **`IOrderFacade.pageOrdersByMember`** | 平台会员管理 **只读**；与 C 端列表 **SQL 同源**（可选复用 Mapper） |

---

## 2. 数据库设计

### 2.1 复用表（只读 / 少量 C 端写）

| 表 | 本模块用途 | DDL |
|----|------------|-----|
| `biz_order` | 列表/详情/角标；**confirmReceive** 更新 status、finish_time | `sql/biz_order.sql` |
| `biz_order_item` | 详情明细、列表摘要、售后关联行 | `sql/biz_order.sql` + checkout 扩展字段 |
| `biz_order_logistics_trace` | 待收货详情 **最新节点**；确认收货 **追加** trace_type=4 | `sql/biz_order.sql` |
| `biz_shop` | 列表 **店铺头像**（可读实时 `shop_avatar` 或仅用 `shop_name` 快照） | `sql/biz_shop.sql` |

**C 端列表过滤：**

```sql
WHERE member_id = #{memberId}
  AND del_flag = '0'
  AND order_status <> '5'   -- 不对 C 端展示已删除
```

**页签与 `order_status` 映射：**

| tab 参数 | SQL 条件 |
|----------|----------|
| `ALL` | 0,1,2,3,4 |
| `PENDING_PAY` | `order_status = '0'` |
| `PENDING_SHIP` | `order_status = '1'` |
| `PENDING_RECEIVE` | `order_status = '2'` |
| `COMPLETED` | `order_status = '3'` |
| `CLOSED` | `order_status = '4'` |
| `REVIEW_PENDING` | `order_status = '3'` AND **存在** 未评价的 `biz_order_item` 行 |
| `REVIEW_DONE` | `order_status = '3'` AND **全部** `biz_order_item` 行均已评价 |

### 2.2 评价表 · `biz_goods_review`

> **权威 DDL：** [`sql/biz_goods_review.sql`](../../../sql/biz_goods_review.sql)  
> **存量迁移：** [`sql/biz_goods_review_order_item_uk.sql`](../../../sql/biz_goods_review_order_item_uk.sql)（`uk_order_review` → `uk_order_item_review`）

| 要点 | 说明 |
|------|------|
| 一行一评 | `uk_order_item_review (order_item_id)`；同一明细行 **至多一条** |
| 写入时机 | 订单 **已完成** 且该 **order_item** 尚未评价 |
| 入参 | `POST .../review` Body 须带 **`orderItemId`** |
| 快照 | `member_nick_name`、`goods_main_pic`、`goods_spec` 提交时写入 |
| 晒图 | `review_pics` 英文逗号分隔 URL |
| C 端读 | 商品详情 `/reviews` 与本模块 **共用表** |

### 2.3 售后表 · `biz_order_aftersale`（待建）

> **脚本：** `sql/biz_order_aftersale.sql`（本文定义，待落库）

```sql
CREATE TABLE IF NOT EXISTS `biz_order_aftersale` (
  `aftersale_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '售后ID',
  `aftersale_no` varchar(32) NOT NULL COMMENT '售后编号；AS+yyyyMMdd+6位序号',
  `order_id` bigint(20) NOT NULL COMMENT '订单ID',
  `order_item_id` bigint(20) NOT NULL COMMENT '订单明细行ID',
  `member_id` bigint(20) NOT NULL COMMENT '买家会员ID',
  `shop_id` bigint(20) NOT NULL COMMENT '店铺ID',
  `apply_type` char(1) NOT NULL COMMENT '1仅退款-未发货 2仅退款-已发货 3退货退款',
  `apply_reason` varchar(128) NOT NULL COMMENT '售后原因文案',
  `return_quantity` int(11) DEFAULT NULL COMMENT '退货数量；类型1可为NULL',
  `apply_amount` decimal(12,2) NOT NULL COMMENT '申请退款金额',
  `description` varchar(1000) DEFAULT NULL COMMENT '补充描述',
  `evidence_pics` varchar(2000) DEFAULT NULL COMMENT '凭证图片URL，逗号分隔',
  `goods_id` bigint(20) NOT NULL COMMENT '商品ID快照',
  `goods_name` varchar(128) NOT NULL COMMENT '商品名称快照',
  `goods_spec` varchar(64) DEFAULT NULL COMMENT '规格快照',
  `goods_image` varchar(512) DEFAULT NULL COMMENT '主图快照',
  `order_no` varchar(32) NOT NULL COMMENT '订单编号快照',
  `pay_amount` decimal(12,2) NOT NULL COMMENT '订单实付快照（校验上限）',
  `member_nick_name` varchar(64) DEFAULT NULL COMMENT '会员昵称快照',
  `consignee_name` varchar(64) DEFAULT NULL COMMENT '收货人快照',
  `consignee_mobile` varchar(20) DEFAULT NULL COMMENT '手机号快照',
  `consignee_address` varchar(512) DEFAULT NULL COMMENT '收货地址快照',
  `aftersale_status` char(1) NOT NULL DEFAULT '1' COMMENT '1进行中 2已完结',
  `process_result` varchar(1000) DEFAULT NULL COMMENT '商家处理结果；完结时填写',
  `finish_time` datetime DEFAULT NULL COMMENT '售后完结时间',
  `create_time` datetime NOT NULL COMMENT '申请时间',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`aftersale_id`),
  UNIQUE KEY `uk_aftersale_no` (`aftersale_no`),
  KEY `idx_member_status` (`member_id`,`aftersale_status`,`create_time`),
  KEY `idx_order_item` (`order_id`,`order_item_id`),
  KEY `idx_shop_status` (`shop_id`,`aftersale_status`,`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='订单售后申请（C端提交；店铺后台处理）';
```

| 业务规则 | 实现 |
|----------|------|
| 售后编号 | `OrderAppSupport.nextAftersaleNo()`，格式 **AS** + yyyyMMdd + 6 位 |
| 申请类型与订单态 | 类型 **1** 仅 **待发货**；类型 **2/3** **待发货/待收货/已完成**（产品可收紧） |
| 金额上限 | `apply_amount <= pay_amount`（整单）或 `<= line_amount`（按行，以前台为准） |
| 并行售后 | v1 **同一 order_item 仅允许一条进行中**；有则拒绝重复申请 |
| 店铺侧 | 商家 **售后订单** 列表读 `shop_id`；**process_result** 完结时写入（商家模块 **待建**） |

### 2.4 确认收货写入

| 字段/表 | 动作 |
|---------|------|
| `biz_order.order_status` | `'2'` → `'3'` |
| `biz_order.finish_time` | `NOW()` |
| `biz_order_logistics_trace` | INSERT `trace_type='4'` 确认收货 |
| `IMemberFacade.refreshConsumption` | 异步或同事务末尾调用 |

---

## 3. C 端接口 · `/api/order`

**鉴权：** `Authorization: Bearer {token}`；`MemberWebConfig` 已含 **`/api/order/**`**

### 3.1 接口一览

| 方法 | 路径 | 说明 | 状态 |
|------|------|------|------|
| GET | `/api/order/badges` | 个人中心角标计数 | **待建** |
| GET | `/api/order/list` | 订单分页列表（tab） | **已实现** |
| GET | `/api/order/{orderId}` | 订单详情 | **已实现** |
| POST | `/api/order/{orderId}/pay` | 继续支付 / 首次支付 | **已实现** |
| POST | `/api/order/{orderId}/pay/cancel` | 取消支付 → 已关闭 | **已实现** |
| POST | `/api/order/{orderId}/confirm-receive` | 确认收货 → 已完成 | **已实现** |
| GET | `/api/order/review/list` | 评价列表（待评价/已评价） | **已实现** |
| GET | `/api/order/{orderId}/review` | 查看评价（按行） | **已实现** |
| POST | `/api/order/{orderId}/review` | 提交评价（按行） | **已实现** |
| GET | `/api/order/aftersale/list` | 售后列表 | **待建** |
| GET | `/api/order/aftersale/{aftersaleId}` | 售后详情 | **待建** |
| POST | `/api/order/aftersale/submit` | 提交售后申请 | **待建** |

### 3.2 角标 `GET /api/order/badges`

**`data` · `OrderAppBadgeVO`：**

| 字段 | 统计 |
|------|------|
| pendingPayCount | `order_status=0` |
| pendingShipCount | `order_status=1` |
| pendingReceiveCount | `order_status=2` |
| aftersaleInProgressCount | `aftersale_status=1` |

### 3.3 订单列表 `GET /api/order/list`

**Query · `OrderAppListQueryDTO`：**

| 参数 | 必填 | 说明 |
|------|:----:|------|
| tab | 否 | `ALL` / `PENDING_PAY` / `PENDING_SHIP` / `PENDING_RECEIVE` / `COMPLETED` / `CLOSED` / `REVIEW_PENDING` / `REVIEW_DONE`；默认 `ALL` |
| pageNum | 否 | 默认 1 |
| pageSize | 否 | 默认 10 |

**排序：** `create_time DESC`

**`rows[]` · `OrderAppListRowVO`（扩展）：**

| 字段 | 说明 |
|------|------|
| orderId / orderNo / orderStatus | |
| orderStatusText | **订单主状态**文案：待付款/待发货/待收货/交易成功/已关闭；**不因售后覆盖** |
| aftersaleStatus | **售后状态**：`null` 无售后；`1` 进行中；`2` 已完结；与 `biz_order_aftersale.aftersale_status` 一致（同订单多条售后时：**有进行中则 1**，否则 **2**） |
| shopId / shopName / shopAvatar | |
| payAmount / goodsAmount / freightAmount | |
| createTime | 下单时间；JSON **`yyyy-MM-dd HH:mm:ss`** |
| itemCount | 明细行数 |
| items | `OrderAppItemSummaryVO[]` **全部** 商品行；含 `reviewStatus` / `reviewId` |
| firstItem | **兼容字段**，等同 `items[0]` |
| payRemainSeconds | 待支付时剩余秒数 |
| reviewStatus | 订单级：`NONE` / `PENDING`（仍有未评行）/ `DONE`（全部已评） |
| actions | `PAY`、`CONFIRM_RECEIVE`、`AFTERSALE`、`BUY_AGAIN`；**不含** `REVIEW` / `VIEW_REVIEW`（改商品行按钮） |

**`items[]` 单行 · `OrderAppItemSummaryVO`：**

| 字段 | 说明 |
|------|------|
| itemId / goodsId / goodsName / goodsImage / goodsSpec | 下单快照 |
| quantity / unitPrice | |
| reviewStatus | `NONE` / `PENDING` / `DONE`（已完成订单） |
| reviewId | 已评价时有值 |

### 3.4 订单详情 `GET /api/order/{orderId}`

**校验：** `member_id` 匹配；`order_status != 5`

**`data` · `OrderAppDetailVO`（扩展）：**

| 分区 | 字段 |
|------|------|
| 主表 | orderId, orderNo, orderStatus, orderStatusText, payStatus, payType, payTypeText |
| 金额 | goodsAmount, freightAmount, payAmount |
| 店铺 | shopId, shopName, shopAvatar |
| 地址快照 | consigneeName, consigneeMobile, consigneeAddress |
| 时间 | createTime, payTime, payExpireTime, payRemainSeconds, finishTime, shipTime |
| 关闭 | closeType, closeTypeText, closeReason（已关闭时） |
| 物流 | deliveryType, logisticsCompany, trackingNo, vehicleNo, courierName, courierMobile |
| 最新物流 | latestTrace `{ traceType, traceTime, content }`（**仅一条**；无则 null） |
| 明细 | items[]：`OrderAppItemVO`（含 buyerRemark, serviceDesc, lineAmount, **reviewStatus**, **reviewId**） |
| 评价 | reviewStatus（订单级）；评价操作在 **商品行** |
| 操作 | actions[]（同列表；无整单评价按钮） |

### 3.5 继续支付 `POST /api/order/{orderId}/pay`

> **已实现** · 与确认订单 **共用** `OrderAppServiceImpl.pay`

| 项 | 说明 |
|----|------|
| 前置 | `order_status=0` 且 `now < pay_expire_time` |
| 事务 | 逐行 deductStock → updateForPay |
| 购物车 | 支付成功后删 **cart_item_id 非空** 行 |
| Mock | `trade_no = MOCK + orderNo` |

### 3.6 取消支付 `POST /api/order/{orderId}/pay/cancel`

> **已实现**

| 项 | 说明 |
|----|------|
| 前置 | `order_status=0` |
| 动作 | `order_status=4, close_type=2` |

> **扩展（可选）：** 待支付 **「取消订单」** 与 pay/cancel **同实现**；前端文案区分即可。

### 3.7 确认收货 `POST /api/order/{orderId}/confirm-receive`

| 项 | 说明 |
|----|------|
| 前置 | `order_status=2`（已发货） |
| 事务 | `updateForConfirmReceive` → INSERT trace(4) → `refreshConsumption(memberId)` |
| 失败 | 状态已变 → 400「订单状态已更新」 |

### 3.8 评价

#### 列表 `GET /api/order/review/list`

| 参数 | 说明 |
|------|------|
| tab | `PENDING` / `DONE` |
| pageNum / pageSize | 分页 |

**行字段：** 同订单列表（`items[]` 全量 + 行级 `reviewStatus`）；DONE Tab 按 **评价记录** 分页

#### 提交 `POST /api/order/{orderId}/review`

**Body · `OrderReviewSubmitDTO`：**

| 字段 | 必填 | 说明 |
|------|:----:|------|
| orderItemId | ✓ | 订单明细行 ID（`biz_order_item.item_id`） |
| score | ✓ | 1～5 |
| content | 否 | 文本 |
| pics | 否 | 图片 URL 数组；最多 9 |

**校验：**

1. 订单 **已完成**  
2. `orderItemId` 归属该订单  
3. `uk_order_item_review` **不存在**（该行未评）  
4. 写入 `biz_goods_review`（快照 member、goods）

#### 查看 `GET /api/order/{orderId}/review`

| 参数 | 必填 | 说明 |
|------|:----:|------|
| orderItemId | 建议 | 指定明细行；不传时兼容查首条（旧客户端） |

返回 `OrderReviewDetailVO`：`score, content, pics[], createTime, replyContent, replyTime`

### 3.9 售后

#### 列表 `GET /api/order/aftersale/list`

| 参数 | 说明 |
|------|------|
| tab | `IN_PROGRESS` / `FINISHED` |
| pageNum / pageSize | |

#### 详情 `GET /api/order/aftersale/{aftersaleId}`

| 分区 | 内容 |
|------|------|
| progress | `MERCHANT_PROCESS` / `FINISHED`（映射需求「商家处理→售后完结」） |
| info | 草稿 §6～§7 字段 |
| processResult | 已完结时有值 |

#### 提交 `POST /api/order/aftersale/submit`

**Body · `OrderAftersaleSubmitDTO`：**

| 字段 | 必填 | 说明 |
|------|:----:|------|
| orderId | ✓ | |
| orderItemId | ✓ | |
| applyType | ✓ | `1` / `2` / `3` |
| applyReason | ✓ | 枚举文案 |
| returnQuantity | 条件 | 类型 1 **不传**；2/3 必填 |
| applyAmount | ✓ | 默认订单实付，服务端校验 ≤ pay_amount |
| description | 否 | |
| evidencePics | 否 | URL 数组 |

**返回：** `{ aftersaleId, aftersaleNo }`

### 3.10 错误 msg（示例）

| 场景 | msg |
|------|-----|
| 非本人订单 | 订单不存在或无权访问 |
| 续付已超时 | 订单已超时，请重新下单 |
| 非待收货确认 | 当前订单不可确认收货 |
| 重复评价 | 该商品已评价 |
| 重复售后 | 该商品售后处理中 |
| 申请金额超限 | 申请金额不能超过订单金额 |

---

## 4. Service 分层

```text
OrderAppController
    → IOrderAppService
        → badges / list / getDetail / pay / cancelPay / confirmReceive
        → OrderAppSupport.buildListRow / resolveLatestTrace / toStatusText
        → BizOrderMapper / BizOrderItemMapper / BizOrderLogisticsTraceMapper

OrderReviewAppController
    → IOrderReviewAppService
        → list / getByOrder / submit
        → BizGoodsReviewMapper

OrderAftersaleAppController
    → IOrderAftersaleAppService
        → list / getDetail / submit
        → BizOrderAftersaleMapper
        → 校验 order + item 归属与状态
```

| 要点 | 说明 |
|------|------|
| memberId | **仅** `MemberContext` |
| 列表性能 | 批量 `selectByOrderIds` 查 item + review；`OrderAppSupport.enrichItemReview` |
| 最新物流 | `SELECT ... ORDER BY trace_time DESC LIMIT 1` |
| 关单文案 | `close_type` → 字典 `biz_order_close_type` 或 `OrderAppSupport` 映射 |
| 消费统计 | confirmReceive **事务后** 调 `refreshConsumption` |

---

## 5. 常量与枚举

**`OrderAppConstants.java`（建议）：**

```java
// 列表 tab
public static final String TAB_ALL = "ALL";
public static final String TAB_PENDING_PAY = "PENDING_PAY";
public static final String TAB_PENDING_SHIP = "PENDING_SHIP";
public static final String TAB_PENDING_RECEIVE = "PENDING_RECEIVE";
public static final String TAB_COMPLETED = "COMPLETED";
public static final String TAB_CLOSED = "CLOSED";
public static final String TAB_REVIEW_PENDING = "REVIEW_PENDING";
public static final String TAB_REVIEW_DONE = "REVIEW_DONE";

// 售后
public static final String AFTERSALE_TYPE_REFUND_UNSHIPPED = "1";
public static final String AFTERSALE_TYPE_REFUND_SHIPPED = "2";
public static final String AFTERSALE_TYPE_RETURN_REFUND = "3";
public static final String AFTERSALE_STATUS_IN_PROGRESS = "1";
public static final String AFTERSALE_STATUS_FINISHED = "2";

// 评价
public static final String REVIEW_TAB_PENDING = "PENDING";
public static final String REVIEW_TAB_DONE = "DONE";
```

**C 端状态文案映射（`orderStatusText`）：**

| order_status | orderStatusText |
|--------------|-----------------|
| 0 | 待付款 |
| 1 | 待发货 |
| 2 | 待收货 |
| 3 | 交易成功 |
| 4 | 已关闭 |

**列表卡片售后展示（前端，`aftersaleStatus` → 卡片角标/状态区文案）：**

| aftersaleStatus | 前端展示文案 |
|-----------------|--------------|
| null | 使用 `orderStatusText` |
| 1 | 售后处理中 |
| 2 | 售后已完成 |

> **实现：** `OrderAppServiceImpl.buildListRows` 批量 `selectAftersaleStatusByOrderIds`；**不修改** `orderStatusText`。映射见《我的订单前端技术方案》`orderDisplay.js` · `mapOrderListRow`。

---

## 6. 与平台后台联动

| 平台操作 | C 端影响 |
|----------|----------|
| 平台发货 | 列表 **待收货**；详情出现 **latestTrace** |
| 平台更新物流 | **latestTrace** 变更 |
| O8 超时关单 | 待付款消失；**已关闭**；续付失败 |
| 运营关闭 | **已关闭** + closeTypeText |
| 会员禁用 | **403**；历史单只读 **不可操作** |
| 商家完结售后 | 列表 `aftersaleStatus=2`；订单主状态可能为 **已关闭**（`order_status=4`）；售后专区 **已完结** |

---

## 7. 业务规则映射

| 需求规则 | 实现 |
|----------|------|
| MO0 须登录 | 拦截器 + `isMemberEnabled` |
| MO1 仅本人 | Mapper `member_id` 条件 |
| MO2 角标 | `/api/order/badges` |
| MO5 续付 | 复用 `pay` + `pay_remain_seconds` |
| MO6 确认收货 | `confirm-receive` + O7 |
| MO7 最新物流 | `latestTrace` 单条 |
| MO8 评价 | `biz_goods_review` + tab |
| MO9 售后 | `biz_order_aftersale` |
| MO11 快照 | 读 `biz_order` / `biz_order_item` |
| O11 消费统计 | confirmReceive → refreshConsumption |

---

## 8. 测试要点

| 编号 | 场景 | 预期 |
|------|------|------|
| T1 | badges 各计数 | 与列表 tab total 一致 |
| T2 | list tab=PENDING_PAY | 仅 status=0 |
| T3 | detail 待支付 | payRemainSeconds>0；含 items |
| T4 | pay 续付成功 | status=1；库存减 |
| T5 | pay 超时 | 400 已超时 |
| T6 | confirm-receive | status=3；finish_time；trace(4) |
| T7 | review 同行重复提交 | 400 该商品已评价 |
| T8 | aftersale 进行中重复 | 400 |
| T9 | 他人 orderId | 404/无权 |
| T10 | list REVIEW_PENDING | 已完成且存在未评 item 行 |
| T11 | list 多商品 | rows[].items 全量；行级 reviewStatus |

**建议测试类：**

| 类 | 类型 |
|----|------|
| `OrderAppServiceImplTest` | 单元（扩展 confirmReceive、list tab） |
| `OrderReviewAppServiceImplTest` | 单元 |
| `OrderAftersaleAppServiceImplTest` | 单元 |
| `OrderAppControllerTest` | 接口 MockMvc |

---

## 9. 实现分期

| 阶段 | 内容 | 状态 |
|------|------|------|
| **v1.0·基础** | pay / cancelPay / detail / list 占位 | **已实现** |
| **v1.0·列表** | tab 分页、摘要、badges、detail 扩展 | **已实现** |
| **v1.0·履约** | confirm-receive + trace + refreshConsumption | **已实现** |
| **v1.0·评价** | DDL + review 三接口 | **已实现** |
| **v1.0·售后** | DDL + aftersale 三接口 | **部分** |
| **v1.1** | 前端 shop-app 我的订单页联调 | **已实现** |
| **v1.2** | 列表 `items[]` 全量；一行一评；行内评价按钮 | **已实现** |
| **v1.3** | 商家售后审核、微信续付生产 | **另册** |

---

## 10. 非本期

| 项 | 说明 |
|----|------|
| 物流地图 | 需求 **不做** |
| 平台/商家在本 Controller 写操作 | **无** |
| 退款原路退回 | 支付/财务 **另册** |
| 追评、改评 | 需求未要求 |
| 站内消息推送 | 《站内消息》扩展 |

---

## 11. 修订记录

| 版本 | 说明 |
|------|------|
| **v1.2** | 列表返回 `items[]` 全量；评价改 **一行一评**；行级 `reviewStatus`；底部 actions 不含评价 |
| **v1.3** | 列表新增 `aftersaleStatus`（null/1/2）；`orderStatusText` 保持订单主状态；售后展示文案由 **前端** 映射 |
| **v1.0** | 首版：列表/详情/角标/确认收货/评价/售后；复用 order 模块与 checkout 已建 pay；新增 aftersale DDL 规划 |

---

*文档版本：v1.3 · 关联《我的订单功能需求.md》v1.2、《确认订单页（多商品）技术方案.md》v1.1、《订单管理技术方案.md》v1.0.2 · DDL：[`sql/biz_order.sql`](../../../sql/biz_order.sql)、[`sql/biz_goods_review.sql`](../../../sql/biz_goods_review.sql)、[`sql/biz_goods_review_order_item_uk.sql`](../../../sql/biz_goods_review_order_item_uk.sql)、`sql/biz_order_aftersale.sql`*
