分支:test | 日期:2026-08-31 | 规格:spec.md
在既有独立闪送模块上补充包裹类别/重量档、立即或预约配送、可选 PIN 交付、寄件图片、费用明细、页面状态分组、骑手公开摘要和角色安全响应。服务端继续负责路线报价、骑手原子抢单、取件/送达图片、用户签收、24 小时自动完成和平台介入;支付、退款、结算、骑手收入与自动派单仍不在本期范围。
updatesql/sql.mdruoyi-admin -> ruoyi-system;Controller 不接收 Map;App 身份只从 token 解析;业务错误全部 i18n;不执行数据库迁移flash_delivery_* 模型,不复用 pos_order/taxi_orderruoyi-adminupdatesql/sql.mdruoyi-system/src/main/java/com/ruoyi/system/
├── domain/flash/ # 订单、计价、图片、日志实体
└── mapper/flash/ # 持久化、原子抢单、条件状态流转
ruoyi-system/src/main/resources/mapper/flash/*.xml
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/
├── controller/ # 用户、骑手、平台 Controller
├── dto/ # 明确请求 DTO 与响应视图
├── service/ # 报价、状态机、权限和脱敏
├── route/ # Google Routes 与直线降级
└── task/ # 送达 24 小时自动完成
ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/
ruoyi-system/src/test/java/com/ruoyi/system/mapper/flash/
地址簿沿用 InfoAddress、IInfoAddressService 和 InfoAddressController,增加请求 DTO、置顶字段、按用户条件查询/更新及所有权测试。
FlashDeliveryApplicationService 是事务边界;报价只读,创建和每个状态操作同时写订单与日志。status='WAITING_ACCEPTANCE' AND rider_id IS NULL 的单条 UPDATE;受影响行数不是 1 即已被抢走。(user_id, client_request_id) 唯一键保证创建幂等;冲突时返回原订单。WAITING_ACCEPTANCE,可抢查询和原子抢单 SQL 同时限制 scheduled_pickup_start_at <= now,不增加仅为调度使用的新状态。updatesql/sql.md,明确旧表增量字段及索引。测试先行:先写测试并确认因实现缺失而失败,再添加最小生产代码。最终统一执行:
$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=FlashDeliveryMapperXmlTest -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -Dtest='FlashDelivery*Test,InfoAddressControllerSecurityTest' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
git diff --check
无规范违例。四张新表分别承担订单快照、可变计价、图片凭证和审计日志;应用层留在 admin 是外部 HTTP 依赖和模块边界共同决定的。
目标:在 foodie-admin-vue 增加可直接运营的闪送价格配置和订单管理入口,完整消费现有六个平台 API,不修改后端接口语义。
架构:继续使用若依动态菜单加载两个 Vue 2 + Element UI 页面。API 请求集中在一个模块,状态/服务类型映射、分页归一化、操作可见性和价格校验集中在可直接由 Node 测试的纯函数模块;订单详情拆为独立展示组件,避免列表页面同时承担全部渲染职责。
技术栈:Vue 2.6、Element UI 2.15、Vue i18n 8、若依 request、动态 sys_menu、Node 内置 node:test。
test 分支工作。flashDelivery.*,并同步简中、繁中、英文、越南文。foodie_server/updatesql/sql.md,不直接执行数据库变更。data.records 和 data.total,不得套用若依传统 rows/total 响应。foodie-admin-vue/
├── package.json # 增加闪送定向契约测试命令
├── tests/flash-delivery.test.cjs # 请求配置、页面规则和四语言真实行为
└── src/
├── api/flashDelivery/contracts.js # 可执行的六个平台请求配置构造器
├── api/flashDelivery/index.js # 调用若依 request 的六个平台接口
├── views/flashDelivery/shared.js # 枚举、分页、价格校验、操作可见性
├── views/flashDelivery/pricing/index.vue # 三种服务价格列表与编辑弹窗
├── views/flashDelivery/orders/index.vue # 筛选、分页、取消和完成
├── views/flashDelivery/orders/OrderDetail.vue # 完整详情、图片和日志
└── api/language/language.{zh_CN,zh_TW,en_US,vi}.js
foodie_server/
├── specs/024-flash-delivery/{spec,design,plan,tasks}.md
└── updatesql/sql.md # 父菜单、两个页面及六项权限归位
GET /system/flashDelivery/admin/pricing 返回数组;价格页只显示服务端实际存在的配置,不创建前端默认价格。PUT /system/flashDelivery/admin/pricing/{serviceType} 提交七个完整字段。弹窗先执行纯函数校验,成功响应覆盖列表对应行。GET /system/flashDelivery/admin/orders 原样提交 pageNum,pageSize,status,serviceType,orderNo,userId,riderId;normalizePage 从 response.data 提取 records,total,current,size。GET /system/flashDelivery/admin/orders/{id} 返回 {order,images,logs};打开详情前先清空旧数据,失败时保持弹窗关闭。POST .../{id}/cancel 提交 {reason},只对非 COMPLETED/CANCELLED 状态显示并要求二次确认。POST .../{id}/complete 无请求体,只对 DELIVERED 状态显示并要求二次确认。finally 关闭 loading;后端统一错误拦截负责消息提示。tests/flash-delivery.test.cjs 和 npm 命令,直接执行请求配置构造器、分页、价格校验、状态操作与四语言对象;运行后必须因目标模块不存在而失败。shared.js,使请求、分页、价格校验和状态规则测试转绿。Set-Location E:\QtwCode\foodie\foodie-admin-vue
npm run test:flash-delivery
npx eslint src/api/flashDelivery/index.js src/views/flashDelivery tests/flash-delivery.test.cjs
npm run build:prod
git diff --check
Set-Location E:\QtwCode\foodie\foodie_server
git diff --check