# 007 - 订单操作日志

**Feature Branch**: `007-order-log`
**Created**: 2026-05-19
**Status**: Done
**Input**: 平台管理端新增订单操作日志页面，记录所有订单状态变更的完整审计轨迹。

## 背景

订单状态已拆分为四字段（state/deliveryStatus/payStatus/afterSaleStatus），状态变更涉及多方角色（平台管理员、商家、骑手、用户、系统）。需要独立的日志表记录每次变更，用于问题排查和运营审计。

## 需求概览

新增 `pos_order_log` 表，在每次订单状态变更时自动写入一条日志。平台管理端提供日志查询页面，支持按订单号、操作人筛选和导出。

## 数据库设计

### 新表：pos_order_log

| 字段 | 类型 | 说明 |
|------|------|------|
| id | BIGINT (AUTO_INCREMENT) | 主键 |
| dd_id | VARCHAR(64) | 订单号（关联 pos_order.dd_id） |
| operator_type | TINYINT | 操作人类型：0 系统, 1 平台管理员, 2 商家, 3 骑手, 4 用户 |
| operator_id | BIGINT | 操作人ID（对应各角色表的主键） |
| operator_name | VARCHAR(128) | 操作人名称（冗余存储，避免查询时 JOIN） |
| content | VARCHAR(512) | 操作内容描述（如"平台管理员tongdai修改订单状态: 取餐中 → 配送中"） |
| create_time | DATETIME | 操作时间 |

```sql
-- 2026-05-19 新增订单操作日志表
CREATE TABLE pos_order_log (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  dd_id VARCHAR(64) NOT NULL COMMENT '订单号',
  operator_type TINYINT NOT NULL COMMENT '操作人类型：0系统,1平台管理员,2商家,3骑手,4用户',
  operator_id BIGINT COMMENT '操作人ID',
  operator_name VARCHAR(128) COMMENT '操作人名称',
  content VARCHAR(512) NOT NULL COMMENT '操作内容',
  create_time DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '操作时间',
  INDEX idx_dd_id (dd_id),
  INDEX idx_operator_id (operator_id),
  INDEX idx_create_time (create_time)
) COMMENT='订单操作日志';
```

### operator_type 枚举

| 值 | 含义 | 说明 |
|----|------|------|
| 0 | 系统 | 定时任务、自动取消等系统触发 |
| 1 | 平台管理员 | 后台管理端操作 |
| 2 | 商家 | 商家端操作（接单、出餐、完成等） |
| 3 | 骑手 | 骑手端操作（接单、取餐、送达等） |
| 4 | 用户 | 用户端操作（下单、取消、确认取餐等） |

## 日志写入时机

在以下操作执行成功后写入日志（由 Service 层统一处理）：

### 商家操作（operator_type=2）
| 操作 | content 模板 |
|------|-------------|
| 接单 | `商家{名称}已接单` |
| 出餐 | `商家{名称}已出餐` |
| 完成（自取/堂食） | `商家{名称}已完成订单` |
| 取消订单 | `商家{名称}取消订单` |

### 骑手操作（operator_type=3）
| 操作 | content 模板 |
|------|-------------|
| 接单 | `骑手{名称}接单成功` |
| 取餐 | `骑手{名称}已取餐` |
| 送达 | `骑手{名称}已送达` |

### 用户操作（operator_type=4）
| 操作 | content 模板 |
|------|-------------|
| 下单 | `用户{名称}创建订单` |
| 取消订单 | `用户{名称}取消订单` |
| 确认取餐 | `用户{名称}确认取餐` |
| 申请退款 | `用户{名称}申请退款` |

### 平台管理员操作（operator_type=1）
| 操作 | content 模板 |
|------|-------------|
| 修改订单状态 | `平台管理员{名称}修改订单状态: {旧状态} → {新状态}` |
| 修改配送状态 | `平台管理员{名称}修改配送状态: {旧状态} → {新状态}` |

### 系统操作（operator_type=0）
| 操作 | content 模板 |
|------|-------------|
| 超时自动取消 | `系统自动取消超时未接单订单` |
| 超时自动完成 | `系统自动完成超时订单` |
| 支付回调 | `系统收到支付成功回调` |

## 平台管理端页面

### 页面位置
`E:\QtwCode\foodie\foodie-admin-vue\src\views\system\order\log.vue`（新增页面）

### 搜索条件

| 搜索字段 | 类型 | 说明 |
|---------|------|------|
| 订单号 | 输入框 | 模糊搜索 dd_id |
| 操作人ID | 输入框 | 精确匹配 operator_id |
| 操作人名称 | 输入框 | 模糊搜索 operator_name |

### 表格列

| 列名 | 字段 | 说明 |
|------|------|------|
| 主键ID | id | |
| 订单号 | ddId | |
| 操作人类型 | operatorType | 显示中文名称（系统/平台/商家/骑手/用户） |
| 操作人ID | operatorId | |
| 操作人名称 | operatorName | |
| 操作内容 | content | |
| 时间 | createTime | |
| 操作 | - | 查看按钮（跳转订单详情或弹窗显示详情） |

### 操作按钮
- **搜索**：按筛选条件查询
- **重置**：清空筛选条件
- **导出**：导出当前筛选结果为 Excel

### 菜单配置
在平台管理端的"订单管理"菜单下新增"订单日志"子菜单。

## 后端接口

### 日志列表接口
**接口**：`GET /system/orderLog/list`
**权限**：`system:orderLog:list`

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| ddId | String | 否 | 订单号（模糊搜索） |
| operatorId | Long | 否 | 操作人ID |
| operatorName | String | 否 | 操作人名称（模糊搜索） |
| pageNum | int | 是 | 页码，默认1 |
| pageSize | int | 是 | 每页条数，默认10 |

### 日志详情接口
**接口**：`GET /system/orderLog/{id}`
**权限**：`system:orderLog:query`

### 导出接口
**接口**：`POST /system/orderLog/export`
**权限**：`system:orderLog:export`

## 实现范围

### 本次实现（P1）
1. 新建 `pos_order_log` 表
2. 新建 PosOrderLog 实体类、Mapper、Service、Controller
3. 在所有订单状态变更处插入日志记录
4. 平台管理端新增日志查询页面

### 后续扩展（P2）
- 按时间范围筛选
- 按操作人类型筛选
- 订单详情弹窗中展示该订单的操作日志时间线
