# 实施计划：骑手配送类型与派单过滤

**分支**：`test` | **日期**：2026-09-02 | **规格**：[spec.md](./spec.md)

## 设计决策

1. `info_user.delivery_type VARCHAR(64) NULL`，取值 `FOOD`、`FLASH` 逗号组合（归一化为大写、去空白、去重）；`NULL`/空串在代码层视为同时兼容两类，保证 SQL 未执行或骑手未重新保存资料时现有行为不变。
2. `InfoUser.supportsDeliveryType(String)` 供两端门禁复用；`InfoUser.normalizeDeliveryTypes(String)` 静态归一化，非法值抛 `IllegalArgumentException`，Controller 统一转国际化业务错误 `no.user.delivery.type.invalid`。
3. 门禁只加在"获取新任务"路径：外卖 `orderList` 的 `newTask` 页签与 `acceptOrder` 要求兼容 `FOOD`；闪送 `riderOrders` 的 `newTask`、待抢详情与 `accept` 要求兼容 `FLASH`。骑手本人已接订单页签和取件、送达履约不限制，避免配置调整卡死进行中订单。
4. 闪送待抢详情对不兼容骑手返回"订单不存在"错误，避免泄露任务存在性；列表与抢单返回专属错误 `flash.delivery.rider.type.not.enabled`，外卖侧使用 `no.user.delivery.type.not.enabled`。
5. `/infouser/user/setuser` 白名单拷贝新增 `deliveryType`；平台 `POST/PUT /infouser/user` 沿用 `normalizeAuditRejectReason` 的归一化模式校验配送类型。
6. MyBatis：`InfoUser` 为 MyBatis-Plus 实体，普通字段自动参与 CRUD；手写 `InfoUserMapper.xml` 需同步 resultMap、`insertInfoUser`、`updateInfoUser` 三处。
7. SQL 记录于 `updatesql/sql.md`：增量加列 + `user_type='2' AND delivery_type IS NULL` 回填 `FOOD,FLASH`。
8. 平台骑手审核页 `peisus.vue` 在交通工具下方增加配送类型复选框（`FOOD`/`FLASH`），文案进四个 `infouspeisus` 语言文件。

## 验证

```powershell
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn -pl ruoyi-system -am -Dtest=InfoUserDeliveryTypeTest -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryApplicationServiceTest,FlashDeliveryI18nContractTest' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
git diff --check
```

外卖控制器为既有无测试代码，本次门禁改动仅做编译验证。
