分支: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 依赖和模块边界共同决定的。