# Tasks: 订单操作日志

**Input**: specs/007-orderlog/spec.md, specs/007-orderlog/plan.md
**Prerequisites**: plan.md, spec.md
**Tests**: 无自动化测试，通过手动操作验证（商家/骑手/用户操作后查看日志页面）。

**Organization**: 按 Phase 分组——基础设施 → 日志写入集成 → 前端页面 → 部署验证。

## Format: `[ID] [P?] Description`

- **[P]**: 可并行（不同文件，无依赖）
- 包含具体文件路径

## Path Conventions

- 后端源码: `ruoyi-system/src/main/java/com/ruoyi/system/`、`ruoyi-admin/src/main/java/com/ruoyi/`
- MyBatis XML: `ruoyi-system/src/main/resources/mapper/system/`
- SQL: `updatesql/sql.md`
- 前端: `E:\QtwCode\foodie\foodie-admin-vue\src\`

---

## Phase 1: 数据基础设施（表 + Entity + Mapper + Service）

**Purpose**: 新建 pos_order_log 表和完整的数据访问层，是所有后续任务的基础。

- [x] T001 在 `updatesql/sql.md` 末尾追加 CREATE TABLE pos_order_log 语句（id, dd_id, operator_type, operator_id, operator_name, content, create_time + 索引）
- [x] T002 [P] 创建 `ruoyi-system/src/main/java/com/ruoyi/system/domain/PosOrderLog.java` 实体类（id, ddId, operatorType, operatorId, operatorName, content, logTime），继承 BaseEntity，添加 @Excel 导出注解
- [x] T003 [P] 创建 `ruoyi-system/src/main/java/com/ruoyi/system/mapper/PosOrderLogMapper.java` 接口（insertOrderLog, selectOrderLogList, selectOrderLogById）
- [x] T004 [P] 创建 `ruoyi-system/src/main/resources/mapper/system/PosOrderLogMapper.xml`（resultMap、insert、selectList 带动态条件、selectById）
- [x] T005 [P] 创建 `ruoyi-system/src/main/java/com/ruoyi/system/service/IPosOrderLogService.java` 接口
- [x] T006 [P] 创建 `ruoyi-system/src/main/java/com/ruoyi/system/service/impl/PosOrderLogServiceImpl.java` 实现

**Checkpoint**: 数据库建表执行完毕，项目编译通过，PosOrderLog 的 CRUD 可通过 Mapper 调用。

---

## Phase 2: 日志写入基础设施（Helper + Controller）

**Purpose**: 封装日志写入工具类和后台管理接口。

- [x] T007 创建 `ruoyi-system/src/main/java/com/ruoyi/system/utils/OrderLogHelper.java` 工具类（异步 log + 同步 logSync 两个方法）
- [x] T008 [P] 创建 `ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/PosOrderLogController.java`（list/detail/export 三个接口，权限 system:orderLog:*）

**Checkpoint**: 后台管理 `/system/orderLog/list` 接口可正常返回空列表，项目编译通过。

---

## Phase 3: 日志写入集成 — 商家操作

**Purpose**: 商家端 4 种操作（接单/出餐/完成/取消）自动写入日志。

- [x] T009 修改 `ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderShOprateController.java`：注入 OrderLogHelper，在 acceptOrder 方法 saveOrUpdate 之后写入日志（operatorType=2, "商家{名}已接单"）
- [x] T010 修改 `PosOrderShOprateController.java`：在 dispatchOrder 方法 saveOrUpdate 之后写入日志（"商家{名}已出餐"）
- [x] T011 修改 `PosOrderShOprateController.java`：在 completeOrder 方法 saveOrUpdate 之后写入日志（"商家{名}已完成订单"）
- [x] T012 修改 `PosOrderShOprateController.java`：在 cancelOrder 方法 saveOrUpdate 之后写入日志（"商家{名}取消订单"）

**Checkpoint**: 商家执行接单→出餐→完成操作后，pos_order_log 表中有对应 3 条日志记录。

---

## Phase 4: 日志写入集成 — 骑手操作

**Purpose**: 骑手端 3 种操作（接单/取餐/送达）自动写入日志。

- [x] T013 修改 `ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderQsOprateController.java`：注入 OrderLogHelper，在 acceptOrder 方法写入日志（operatorType=3, "骑手{名}接单成功"）
- [x] T014 修改 `PosOrderQsOprateController.java`：在 pickupOrder 方法写入日志（"骑手{名}已取餐"）
- [x] T015 修改 `PosOrderQsOprateController.java`：在 deliverOrder 方法写入日志（"骑手{名}已送达"）

**Checkpoint**: 骑手执行接单→取餐→送达后，pos_order_log 表中有对应 3 条日志记录。

---

## Phase 5: 日志写入集成 — 用户 + 平台操作

**Purpose**: 用户端和平台管理端操作写入日志。

- [x] T016 修改 `ruoyi-admin/src/main/java/com/ruoyi/app/order/UserOrderController.java`：注入 OrderLogHelper，在 createOrderChild 订单创建成功后写入日志（operatorType=4, "用户{名}创建订单"）
- [x] T017 修改 `UserOrderController.java`：在 confirmPickup 确认取餐后写入日志（"用户{名}确认取餐"）
- [x] T018 修改 `UserOrderController.java`：在 cancelOrder 取消订单后写入日志（"用户{名}取消订单"）
- [x] T019 修改 `ruoyi-admin/src/main/java/com/ruoyi/app/order/PosOrderController.java`：注入 OrderLogHelper，在 setorderuzt 方法状态修改成功后写入日志（operatorType=1, "平台管理员{名}修改订单状态: X → Y"）

**Checkpoint**: 用户下单后日志表有 1 条记录，平台管理员修改状态后有对应日志。

---

## Phase 6: 日志写入集成 — 系统操作

**Purpose**: 定时任务和支付回调写入日志。

- [x] T020 修改 `ruoyi-admin/src/main/java/com/ruoyi/app/order/TestTask.java`：注入 OrderLogHelper，在 testTiming 超时取消后调用 logSync（operatorType=0, "系统自动取消超时未接单订单"）
- [x] T021 修改 `TestTask.java`：在 zidwancheng 自动完成后调用 logSync（"系统自动完成超时订单"）
- [x] T022 修改 `TestTask.java`：在 refundProcessing 退款完成后调用 logSync（"系统处理退款完成"）
- [x] T023 修改 `ruoyi-admin/src/main/java/com/ruoyi/app/pay/PayController.java`：注入 OrderLogHelper，在支付回调成功后调用 logSync（"系统收到支付成功回调"）

**Checkpoint**: 触发超时取消或支付回调后，日志表有对应系统日志记录。

---

## Phase 7: 前端页面

**Purpose**: 平台管理端新增订单日志查询页面。

- [x] T024 [P] 创建 `foodie-admin-vue/src/api/system/orderLog.js`（listOrderLog, getOrderLog 两个 API 方法）
- [x] T025 创建 `foodie-admin-vue/src/views/system/order/log.vue` 日志查询页面：
  - 搜索栏：订单号输入框、操作人ID输入框、操作人名称输入框、搜索/重置/导出按钮
  - 数据表格：主键ID、订单号、操作人类型（格式化：0系统/1平台/2商家/3骑手/4用户）、操作人ID、操作人名称、操作内容、时间、操作（查看按钮）
  - 分页组件
  - 查看弹窗：el-dialog 显示单条日志详情
- [x] T026 在 `updatesql/sql.md` 末尾追加菜单插入 SQL（sys_menu 表：订单日志菜单 + 查询权限 + 导出权限）

**Checkpoint**: 平台管理端左侧菜单出现"订单日志"，点击进入可看到日志列表，搜索和导出功能正常。

---

## Phase 8: 部署验证

**Purpose**: 执行全部 SQL 并端到端验证。

- [x] T027 在 MySQL 中执行 updatesql/sql.md 中 007-orderlog 相关的所有 SQL（CREATE TABLE + 菜单 INSERT）
- [x] T028 启动后端服务，用商家端操作一个完整订单流程（接单→出餐→完成），打开平台管理端"订单日志"页面确认日志记录完整
- [x] T029 测试搜索功能（按订单号、操作人ID、操作人名称筛选）和导出功能

**Checkpoint**: 完整的端到端验证通过，所有操作日志正确记录并可查询导出。

---

## 依赖关系

```
Phase 1 (T001-T006) → Phase 2 (T007-T008) → Phase 3-6 (T009-T023, 可并行)
                                                  ↓
                                            Phase 7 (T024-T026, 部分可并行)
                                                  ↓
                                            Phase 8 (T027-T029)
```

- Phase 1 全部完成后才能进入 Phase 2
- Phase 2 完成后，Phase 3-6 可并行执行（各修改不同文件）
- Phase 7 的 T024 可与 Phase 3-6 并行，T025 依赖后端接口可用
- Phase 8 必须最后执行
