research.md 3.5 KB

Research: 订单状态四字段分离

1. 现有状态字段分析

Decision: 保留旧 state 字段但重新编号,新增 delivery_statuspay_statusafter_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)三个字段。废弃 diningStatusisAccepted 等字段但保留不删。

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 添加后所有新订单直接使用新值。旧数据手动清空即可。