Branch: test | Date: 2026-05-15 | Spec: spec.md
Input: Feature specification from /specs/006-orderstate/spec.md
将现有 pos_order 表中混用的 state 字段拆分为四个独立字段(state、delivery_status、pay_status、after_sale_status),参考美团订单状态机设计。涉及数据库变更、实体类扩展、MyBatis Mapper 更新、三端(用户/商家/骑手)操作接口改造、新订单列表接口开发、定时任务调整、以及平台管理端前端适配。
Language/Version: Java 21
Primary Dependencies: Spring Boot 3.3.5, MyBatis 3.0.3 (mybatis-spring-boot-starter),若依框架
Storage: MySQL
Testing: 手动测试(项目无自动化测试框架)
Target Platform: Linux/Windows Server
Project Type: Web Service (REST API + 管理端前端)
Performance Goals: 无特殊性能要求,常规 CRUD
Constraints: 数据库变更写 SQL 脚本(updatesql/sql.md),不直接执行
Scale/Scope: 3 个 Controller 改造 + 3 个新列表接口 + 1 个前端项目调整
| 文件 | 路径 | 变更类型 |
|---|---|---|
| PosOrder.java | ruoyi-system/.../domain/PosOrder.java |
新增3个字段 |
| PosOrderMapper.xml | ruoyi-system/.../mapper/system/PosOrderMapper.xml |
resultMap + SQL 更新 |
| PosOrderShOprateController | ruoyi-admin/.../app/order/PosOrderShOprateController.java |
改造接单/出餐 + 新增列表接口 |
| PosOrderQsOprateController | ruoyi-admin/.../app/order/PosOrderQsOprateController.java |
改造骑手操作 + 新增列表接口 |
| UserOrderController | ruoyi-admin/.../app/order/UserOrderController.java |
改造创建订单 + 新增列表接口 |
| OrderAppealController | ruoyi-admin/.../app/order/OrderAppealController.java |
改造取消订单 |
| TestTask.java | ruoyi-admin/.../app/order/TestTask.java |
定时任务改造 |
| sql.md | updatesql/sql.md |
新增 ALTER TABLE 语句 |
| 平台管理前端 | E:\QtwCode\foodie\foodie-admin-vue\src\views\system\order\index.vue |
筛选/展示改造 |
Constitution 为模板状态,无自定义约束。跳过 gate 检查。
specs/test/
├── plan.md # This file
├── research.md # Phase 0 output
├── data-model.md # Phase 1 output
├── quickstart.md # Phase 1 output
├── contracts/ # Phase 1 output
└── tasks.md # Phase 2 output (via /speckit.tasks)
ruoyi-system/src/main/java/com/ruoyi/system/
├── domain/PosOrder.java # 实体类
├── mapper/PosOrderMapper.java # Mapper接口
└── service/ # Service层
ruoyi-system/src/main/resources/mapper/system/
└── PosOrderMapper.xml # MyBatis XML
ruoyi-admin/src/main/java/com/ruoyi/app/order/
├── PosOrderShOprateController.java # 商家操作
├── PosOrderQsOprateController.java # 骑手操作
├── UserOrderController.java # 用户操作
├── OrderAppealController.java # 售后/取消
└── TestTask.java # 定时任务
updatesql/
└── sql.md # SQL迁移脚本
# 前端(外部项目)
E:\QtwCode\foodie\foodie-admin-vue\
└── src/views/system/order/index.vue # 平台管理端订单页
Structure Decision: 后端遵循若依多模块 Maven 结构。前端在独立仓库中。
| Violation | Why Needed | Simpler Alternative Rejected Because |
|---|---|---|
| 四字段拆分增加查询复杂度 | 自取/堂食订单无配送状态,单字段无法表达 | 单 state 字段混用已导致无法支持新订单类型 |
在三个有效下单入口构造 PosOrder 时按订单类型归一化配送费:type=1 固定写入 0D,其他类型沿用请求值。规则在 Controller 边界落库前执行,不修改数据库结构,也不回写请求 DTO。
复用 PosOrderShOprateController.dispatchOrder() 的现有 chuCan(...) 推送链路。根据订单 type 选择内容 key:自取使用新增专属 i18n key,并把 pickUpNum 作为消息参数;其他类型继续使用 no.message.push.merchant.ready.content。复用 PayPush 的用户语言解析、App 推送和 PushEvent -> push_message 入库能力。
ruoyi-admin 模块构建;完整回归结果单独记录。外送订单继续复用 state、deliveryStatus、payStatus 和 qsId,不增加数据库字段。deliveryStatus=0 从“商家出餐后等待骑手”调整为“订单已支付并等待骑手”;骑手接单只推进配送状态,商家随后推进订单状态。
新增订单配送推送服务统一处理两类跨入口副作用:到付创建或在线支付成功后通知附近可接单骑手,以及已分配骑手订单取消后的相关方通知。用户聚合下单、旧 /addorder 到付入口、LINE Pay 和 OMG 支付成功入口共用同一开放条件,避免不同支付方式形成不同履约顺序。
商家接单和出餐在原支付、归属校验基础上增加骑手分配校验;骑手新任务查询增加 state=0 和 payStatus=1 条件。骑手占用查询只统计 state IN (0,1,2) 且 deliveryStatus IN (1,2) 的有效履约订单,取消订单不继续占用骑手。