主题
管理后台 — 订单管理
上级文档:管理后台 Web
模块概述
订单管理是管理后台的核心业务模块,承载「用户购买产品 → 支付 → 生效 → 核销/使用 → 退款」全生命周期管理。运营人员在此完成订单查询、退款处理、核销记录追踪、财务对账导出等日常操作。
页面路由
| 路由 | 页面 | 说明 |
|---|---|---|
/orders | 订单列表 | 多维度筛选、批量导出 |
/orders/:id | 订单详情 | 完整信息、操作日志、退款操作 |
订单列表页
列表字段定义
| 列名 | 字段 key | 类型 | 说明 | 排序 |
|---|---|---|---|---|
| 订单编号 | id | String | 格式:YYYYMMDD + 6 位随机码,如 20260331A7X9KL | ✅ |
| 用户信息 | user | Object | 昵称 + 头像缩略图;点击跳转用户详情 | — |
| 门店 | storeName | String | 购买时所在门店;线上购买 为空 | ✅ |
| 产品名称 | productName | String | 来自 productSnapshot | — |
| 产品类型 | productType | Enum | 月卡 / 季卡 / 年卡 / 次卡 / 体验卡 | ✅ |
| 来源 | source | Enum | 微信支付 / 外部券码 | ✅ |
| 原价 | originalAmount | Decimal | 元,2 位小数 | — |
| 优惠金额 | discountAmount | Decimal | 外部券码抵扣金额;无优惠显示 — | — |
| 实付金额 | payAmount | Decimal | 元,2 位小数;外部券码显示 0.00(券码兑换) | ✅ |
| 状态 | status | Enum | 见状态定义,带颜色标签 | ✅ |
| 支付时间 | paidAt | DateTime | YYYY-MM-DD HH:mm:ss;待支付显示 — | ✅ |
| 到期时间 | expiresAt | DateTime | YYYY-MM-DD;未生效显示 — | ✅ |
| 剩余次数 | remainingTimes | Int | 仅次卡/体验卡显示;月卡/年卡显示 不限次 | — |
| 创建时间 | createdAt | DateTime | YYYY-MM-DD HH:mm:ss | ✅ |
状态枚举与视觉规范
| 状态值 | 中文标签 | 颜色标签 | 说明 |
|---|---|---|---|
PENDING | 待支付 | ⚪ 灰色 | 已创建订单,等待微信支付 |
PAID | 已支付 | 🔵 蓝色 | 支付成功,等待生效 |
ACTIVE | 使用中 | 🟢 绿色 | 会员权益生效中 |
EXPIRED | 已过期 | ⚫ 深灰 | 有效期截止或次数用完 |
CANCELLED | 已取消 | ⚪ 灰色 | 超时未支付自动取消 |
REFUNDING | 退款中 | 🟡 橙色 | 退款申请已提交,等待微信处理 |
REFUNDED | 已退款 | 🔴 红色 | 退款完成 |
筛选条件
| 筛选项 | 类型 | 说明 |
|---|---|---|
| 关键词搜索 | 输入框 | 订单编号(精确)、用户昵称(模糊)、用户手机号(精确) |
| 时间范围 | 日期区间选择器 | 按创建时间 / 支付时间筛选,默认「近 7 天」 |
| 门店 | 下拉选择 | 全部门店列表;受门店上下文自动筛选 |
| 产品类型 | 多选 | 月卡 / 季卡 / 年卡 / 次卡 / 体验卡 |
| 订单来源 | 多选 | 微信支付 / 外部券码 |
| 订单状态 | 多选 | 7 种状态全选 |
| 是否有退款 | 开关 | 快速筛选退款相关订单(REFUNDING + REFUNDED) |
列表操作
| 操作 | 说明 |
|---|---|
| 查看详情 | 点击行或「详情」按钮进入订单详情页 |
| 导出 | 按当前筛选条件导出 Excel/CSV,字段与列表列对齐 + 退款原因/退款时间 |
| 刷新 | 手动刷新列表数据 |
移动端适配
| 场景 | 方案 |
|---|---|
| 表格列过多 | 转为卡片列表,每卡片展示:用户信息 + 产品 + 状态 + 实付金额 |
| 详情入口 | 卡片右滑或点击跳转详情 |
| 筛选面板 | 底部弹出式筛选面板,支持组合筛选 |
订单详情页
Tab 设计
Tab 1:订单信息(默认)
展示订单基本信息、用户信息、产品与金额、使用情况。字段见上方线框描述。
Tab 2:支付信息
| 字段 | 说明 |
|---|---|
| 支付方式 | 微信支付 / 外部券码兑换 |
| 微信交易号 | wxTransactionId,可复制 |
| 原价 | originalAmount |
| 优惠金额 | discountAmount |
| 实付金额 | payAmount |
| 使用的优惠券 | 券码信息(如有) |
| 支付时间 | paidAt |
| 退款信息 | 仅退款订单显示:退款金额、退款原因、退款时间、微信退款单号 |
Tab 3:使用记录
仅次卡和体验卡显示。展示每次进入健身房的记录。
| 字段 | 说明 |
|---|---|
| 进入时间 | 刷脸验证通过、B 门打开的时间 |
| 离开时间 | 出门刷脸 / 超时自动离店的时间 |
| 门店 | 进入的门店名称 |
| 扣减次数 | 本次扣减的次数(通常为 1) |
| 扣减后剩余 | 扣减后的剩余次数 |
| 关联订单 | 订单编号(可跳转) |
Tab 4:操作日志
记录订单生命周期中的所有关键操作。
| 字段 | 说明 |
|---|---|
| 操作时间 | 精确到秒 |
| 操作类型 | 创建 / 支付 / 生效 / 核销 / 退款申请 / 退款完成 / 取消 |
| 操作人 | 系统 / 微信回调 / 管理员(含管理员账号) |
| 操作详情 | 补充说明(如退款原因、备注) |
退款操作
退款入口
- 订单详情页底部「申请退款」按钮
- 仅
ACTIVE和EXPIRED状态的订单可申请退款 REFUNDING状态显示「退款处理中」,不可重复操作REFUNDED状态显示「已退款」,不可重复操作PENDING/CANCELLED状态不显示退款入口
退款弹窗交互
退款金额自动计算规则 [建议值]
| 订单类型 | 状态 | 退款金额计算 |
|---|---|---|
| 月卡/季卡/年卡 | ACTIVE(使用中) | 实付金额 × (剩余天数 / 总有效期天数),向下取整到分 |
| 月卡/季卡/年卡 | ACTIVE(未使用) | 全额退款(首次进入时间 > 支付时间,视为未使用) |
| 次卡 | ACTIVE(有剩余次数) | 实付金额 × (剩余次数 / 总次数),向下取整到分 |
| 次卡 | ACTIVE(0 次剩余) | 不允许退款(应已转为 EXPIRED) |
| 次卡 | EXPIRED | 实付金额 × (剩余次数 / 总次数),向下取整到分 |
| 体验卡 | EXPIRED | 由系统自动触发(二次刷脸退款),管理后台仅展示结果,不可手动退款 |
| 体验卡 | ACTIVE | 全额退款(用户仅进入 1 次,权益仍在) |
| 外部券码订单 | 任意 | 实付为 0,不可退款(券码核销不可逆) |
退款校验
前端和服务端双重校验:
- 订单状态是否为
ACTIVE或EXPIRED - 体验卡订单不允许手动退款(仅系统自动触发)
- 外部券码来源订单不允许退款
- 退款金额 ≤ 实付金额
- 退款金额 ≥ 0
- 同一订单退款中(
REFUNDING)不可重复提交
退款确认
- 点击「确认退款」后弹出二次确认对话框,要求管理员输入操作备注
- 服务端调用微信退款 API
- 成功:订单状态 →
REFUNDING,异步等待微信回调确认 →REFUNDED - 失败:显示微信返回的具体错误信息
权限控制
Tab 可见性
| Tab | 老板 | 财务 | 店长(本店) | 客服 | 说明 |
|---|---|---|---|---|---|
| 订单信息 | ✅ | ✅ | ✅ | ✅ | 全角色可见 |
| 支付信息 | ✅ | ✅ | ✅(本店) | ✅ | 店长仅看本店订单 |
| 使用记录 | ✅ | ✅ | ✅(本店) | ✅ | — |
| 操作日志 | ✅ | ✅ | ✅(本店) | ✅ | — |
操作权限
| 操作 | 老板 | 财务 | 店长 | 客服 |
|---|---|---|---|---|
| 查看订单列表 | ✅ 全店 | ✅ 全店 | ✅ 本店 | ✅ 按策略 |
| 查看订单详情 | ✅ | ✅ | ✅ 本店 | ✅ |
| 申请退款 | ✅ | ✅ | ❌ [建议值] | ❌ |
| 导出订单 | ✅ | ✅ | ✅ 本店 | ❌ |
[建议值] 店长无退款权限,需提交退款申请给总部财务处理。理由:退款涉及资金操作,分店店长不宜直接操作;如业务需要,可通过角色权限配置单独开放。
用户故事
US-ORD-01:运营人员查看今日订单
作为运营人员,我想查看今天所有门店的订单列表,按支付时间降序排列,以便了解当日销售情况。
验收标准:
- [ ] 默认时间范围为「今天」,自动填充当前日期
- [ ] 列表按支付时间降序排列
- [ ] 状态标签颜色符合规范
- [ ] 支持按门店、产品类型、状态进一步筛选
- [ ] 店长视角仅显示本店订单
US-ORD-02:财务人员导出月度订单报表
作为财务人员,我想导出指定月份的全部订单数据(含退款信息),以便进行财务对账。
验收标准:
- [ ] 导出按钮在列表页右上角始终可见
- [ ] 导出文件包含当前筛选条件的所有订单(支持全量导出,不受分页限制)
- [ ] 导出 Excel 列名使用中文表头
- [ ] 包含退款字段:退款金额、退款原因、退款时间
- [ ] 文件名格式:
订单报表_YYYY-MM-DD_to_YYYY-MM-DD.xlsx
US-ORD-03:管理员为用户办理退款
作为管理员,我需要在订单详情页为用户申请退款,系统应自动计算建议退款金额,我确认后发起退款。
验收标准:
- [ ] ACTIVE/EXPIRED 状态的订单显示「申请退款」按钮
- [ ] 退款弹窗自动计算并展示建议退款金额及计算公式
- [ ] 管理员可手动调整退款金额(不超过实付金额)
- [ ] 必须填写退款原因
- [ ] 提交后弹出二次确认对话框
- [ ] 退款成功后订单状态变为「退款中」,等待微信回调
- [ ] 体验卡订单不显示手动退款按钮
- [ ] 外部券码来源订单不显示退款按钮
US-ORD-04:客服快速定位用户订单
作为客服,我需要通过用户手机号或昵称快速搜索到该用户的所有订单,以便处理用户投诉。
验收标准:
- [ ] 搜索框支持手机号(精确匹配)和昵称(模糊匹配)
- [ ] 搜索结果按创建时间降序排列
- [ ] 从订单详情可一键跳转到用户详情页
- [ ] 从用户详情可查看该用户的所有历史订单
数据导出规范
| 导出项 | 格式 | 字段 |
|---|---|---|
| 订单列表 | xlsx | 订单编号、用户昵称、手机号、门店、产品名称、产品类型、来源、原价、优惠金额、实付金额、状态、支付时间、到期时间、创建时间 |
| 退款记录 | xlsx | 订单编号、用户昵称、实付金额、退款金额、退款原因、退款时间、操作人 |
API 接口规划
# 订单列表
GET /api/v1/admin/orders
Query: {
keyword?, storeId?, productType[], source[], status[],
startDate?, endDate?, hasRefund?, page, pageSize, sortBy, sortOrder
}
Response: {
items: Order[], total: number, page: number, pageSize: number
}
# 订单详情
GET /api/v1/admin/orders/:id
Response: Order { ...详情全部字段, user: UserSummary, store: StoreSummary,
usageLogs: UsageLog[], operationLogs: OperationLog[] }
# 使用记录(次卡/体验卡)
GET /api/v1/admin/orders/:id/usage-logs
Response: UsageLog[]
# 操作日志
GET /api/v1/admin/orders/:id/operation-logs
Response: OperationLog[]
# 申请退款
POST /api/v1/admin/orders/:id/refund
Body: { refundAmount: number, reason: string }
Response: { success: boolean, message: string, refundId?: string }
# 计算建议退款金额
GET /api/v1/admin/orders/:id/refund-suggestion
Response: { suggestedAmount: number, calculation: string, usedDays: number,
totalDays: number, remainingTimes: number, totalTimes: number }
# 导出订单
GET /api/v1/admin/orders/export
Query: { 同列表查询参数 }
Response: { downloadUrl: string } // 异步生成,返回下载链接