# Research: 订单状态四字段分离 ## 1. 现有状态字段分析 **Decision**: 保留旧 `state` 字段但重新编号,新增 `delivery_status`、`pay_status`、`after_sale_status` 三个字段。 **Rationale**: spec 明确要求参考美团做法。旧 `state` 将 0-13 的支付/订单/配送/退款状态混在一起,自取/堂食订单无法复用。拆分后每种关注点独立,各类型订单只使用相关字段。 **Alternatives considered**: - 只加 `type` 判断不改字段:不同类型状态含义不同,查询和展示逻辑会变成大量 if-else,不可维护 - 保留旧 state 值不变:新值更简洁(0-4 vs 0-13),且旧系统未正式使用无需兼容 ## 2. PosOrder 实体现有字段 **Decision**: 新增 `deliveryStatus`(Long)、`payStatus`(Long)、`afterSaleStatus`(Long)三个字段。废弃 `diningStatus`、`isAccepted` 等字段但保留不删。 **Rationale**: - 实体已有 `longitude`/`latitude`,骑手距离排序可直接使用 - `payType` 字段已存在,可用于区分到付/在线支付 - `qsId`/`qsImg` 字段已存在,骑手端查询可直接用 ## 3. MyBatis Mapper 改造策略 **Decision**: 在现有 resultMap 中新增三个字段映射,insert/update 语句同步添加。旧 SQL 查询方法保留不删。 **Rationale**: - 旧方法(selectPosOrderList 等)使用旧 state 值,数据迁移后自然废弃 - 新列表接口使用 LambdaQueryWrapper,不走 XML 定义的条件查询 - insertPosOrder 和 updatePosOrder 是通用方法,必须包含新字段 ## 4. 列表接口技术方案 **Decision**: 三个新列表接口统一使用 MyBatis-Plus `LambdaQueryWrapper`,前端传 `tab` 字符串参数,后端映射到四字段查询条件。 **Rationale**: - 项目已集成 MyBatis-Plus(3.0.3 starter),LambdaQueryWrapper 可直接使用 - Tab 参数用字符串(pending/active/completed 等)语义清晰,与旧接口完全独立 - 状态展示文字由前端根据字段组合计算,后端只返回数据 **Alternatives considered**: - 继续用 XML SQL:旧 SQL 条件用旧 state 值硬编码,改造工作量大且不直观 - 新建 DTO/VO:PosOrder 全字段序列化已够用,spec 要求前端切换成本低 ## 5. 距离排序实现 **Decision**: 骑手端 newTask Tab 使用 `LambdaQueryWrapper.last()` 追加 MySQL `ST_Distance_Sphere` 函数排序。 **Rationale**: PosOrder 已有 longitude/latitude 字段,无需 JOIN PosStore。MySQL 5.7+ 支持 ST_Distance_Sphere。 ## 6. 定时任务改造 **Decision**: 改造 TestTask.java 中的四个方法,使用新字段条件。 **Rationale**: - `testTiming()`(未支付超时取消):查 `payStatus=0 AND state=0`,设 `state=4` - `zidwancheng()`(自动完成):查 `state=2 AND afterSaleStatus=0` 且超时,设 `state=3` - `refundProcessing()`:暂不改造(spec 明确本次不实现退款流程) - `checkAppointmentOrder()`:条件可能涉及 state,需同步更新 ## 7. 前端改造范围 **Decision**: 平台管理端(foodie-admin-vue)的订单列表页需改造筛选条件和状态展示。商家端(foodie-store)和用户端/骑手端为移动 App,不在本次范围内(spec 未提及)。 **Rationale**: spec 第 16 节明确描述了平台管理端的改造细节,是本次需求的明确范围。 ## 8. 数据迁移策略 **Decision**: 不需要数据迁移。历史订单数据由开发者手动清空。 **Rationale**: spec 明确"系统未正式使用",新字段通过 ALTER TABLE 添加后所有新订单直接使用新值。旧数据手动清空即可。