# 订单模块（business-order）

## 全站统一订单重构（路线图）

本模块将演进为**全站统一订单域**；分阶段目标、数据模型、里程碑与风险见：

- **[doc/全站统一订单改造计划.md](doc/全站统一订单改造计划.md)**
- **M1 交付**：[doc/M1-订单类型与统一主单字段定稿.md](doc/M1-订单类型与统一主单字段定稿.md)
- **M2 交付**：[doc/M2-统一订单骨架说明.md](doc/M2-统一订单骨架说明.md)
- **M3 交付**：[doc/M3-休闲试点双写与影子读.md](doc/M3-休闲试点双写与影子读.md)
- **M4 交付**：[doc/M4-休闲试点读切换.md](doc/M4-休闲试点读切换.md)
- **M5 交付**：[doc/M5-美食线统一订单接入.md](doc/M5-美食线统一订单接入.md) · [doc/M5-休闲线统一订单接入.md](doc/M5-休闲线统一订单接入.md) · [doc/M5-讲解线统一订单接入.md](doc/M5-讲解线统一订单接入.md) · [doc/M5-景区线统一订单接入.md](doc/M5-景区线统一订单接入.md) · [doc/M5-酒店线统一订单接入.md](doc/M5-酒店线统一订单接入.md) · [doc/M5-商城线统一订单接入.md](doc/M5-商城线统一订单接入.md)
- **流程与代码引用（下单 / 支付 / 回调 / 售后）**：[doc/全链路订单支付与代码引用.md](doc/全链路订单支付与代码引用.md)

> 实施过程中请同步更新该文档顶部的变更记录（若启用）。

## 模块说明

`business-order` 当前聚焦**全站统一交易单**（`TradeOrder*`、`TradeOrderItem*`）及配套应用服务。

**商城垂直订单**（`MallOrder*`、`MallOrderLog*`、`MallMemberAddress*`、`MallFirstOrderConfig*`）已迁至 **`business-mall`**（Java 包名仍为 `com.jeesharp.business.modules.mall`，与商品域同仓编排）。注入 `MallOrderApplicationService` 等、后台/移动端 HTTP 路径、双写与读切换说明，请参阅：

- **[../business-mall/README.md](../business-mall/README.md)** — 第二节「商城订单与统一交易单」

商城线 M5 设计说明（含配置开关与行为摘要）：

- [doc/M5-商城线统一订单接入.md](doc/M5-商城线统一订单接入.md)

---

## 统一交易单（本模块）

| 内容 | 位置 |
|------|------|
| 领域与 Mapper | `business-order-service` → `com.jeesharp.business.modules.trade` |
| 应用服务 | `business-order-application` → `TradeOrderApplicationService` |
| 建表脚本 | `business-order-service/src/main/resources/sql/biz_trade_order.sql` |

酒店、景区、美食等业务线接入统一单时，依赖 **`business-order-application`** 即可。**商城订单**在支付落账后若需双写统一单，由 **`business-mall-application`** 编排（该模块已声明对 `business-order-application` 的依赖）。

---

## HTTP（统一单）

> 统一交易单主数据当前以内部应用服务为主（M2）；若以扩展形式对管理端/开放网关暴露 REST，请在 `business-order-controller` 增补并与本 README 同步。

---

## 附录：跨业务线订单状态与日志规范（参考）

以下语义适用于以**商城订单主表**为载体、多业务线共用状态码时的约定；枚举与常量实现位于 **`business-mall-bean`**（如 `MallOrderStatusEnum`、`MallOrderOperateTypeConstants`）。业务模块请依赖 **`business-mall-bean`** 或经 **`business-mall-application`** 间接引用，避免魔法值。

### A.1 订单主状态（建议）

| status | 枚举名（建议） | 含义 | 典型触发点 |
|--------|----------------|------|------------|
| 0 | `PENDING_PAY` | 待支付 | 下单完成，未支付 |
| 1 | `PAID` | 已支付 | 支付回调成功 |
| 2 | `TO_FULFILL` | 待履约 | 支付成功后等待核销/发货/预约确认 |
| 3 | `FULFILLING` | 履约中 | 发货中、核销中、服务进行中 |
| 4 | `FULFILLED` | 已完成 | 用户收货/核销完成/服务完成 |
| 5 | `CLOSED` | 已关闭 | 超时关单、系统关单 |
| 6 | `REFUNDING` | 退款中 | 发起退款申请后 |
| 7 | `REFUNDED` | 已退款 | 退款完成 |
| 8 | `REFUND_REJECTED` | 退款拒绝 | 退款审核拒绝 |
| 9 | `CANCELED` | 已取消 | 用户主动取消 |

说明：

1. 状态流转示例代码请使用 `MallOrderStatusEnum` 与 `MallOrderOperateTypeConstants`（定义于 `business-mall-bean`）。
2. 若已有线上状态值，请保持兼容映射，不建议直接改历史值。

### A.2 operateType（日志操作类型）建议

`MallOrderLogApplicationService.recordOrderStatusChange(...)` 的 `operateType` 建议统一取值：

- `CREATE`：创建订单
- `PAY`：支付成功
- `CANCEL`：取消订单
- `CLOSE`：系统关单
- `REFUND`：发起退款
- `REFUND_SUCCESS`：退款完成
- `REFUND_REJECT`：退款拒绝
- `FULFILL`：履约推进（发货/核销/服务执行）
- `COMPLETE`：订单完成

### A.3 跨业务线最小落地规范

1. 下单后统一写一条 `CREATE` 日志（`null -> 0`）。
2. 支付成功统一写一条 `PAY` 日志（`0 -> 1`）。
3. 用户取消统一写一条 `CANCEL` 日志（`0/1 -> 9`，按业务限制）。
4. 退款流程至少两条日志：`REFUND`（进入退款中）+ `REFUND_SUCCESS/REFUND_REJECT`（退款结果）。
5. 每次状态变更都要求带 `operatorId`、`operatorName`、`remark`，保证可审计。
