分支: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 即已被抢走。version 字段随每次更新递增,仅作审计参考,不作为更新条件。(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
本节替代上方“平台管理前端增量”中的单行价格配置接口、七字段表单和两位小数计价描述;订单管理与平台介入设计继续有效。
目标:将闪送计价改为与现有外卖订单一致的“当前时段 + 起送距离/价格 + 计价距离/金额”规则,移除最低价、时长费、尖峰倍率和启停状态,并让平台在独立闪送入口维护三种服务的多个运价时段。
架构:flash_delivery_pricing 继续作为闪送独立配置表,但从每服务单行改为每服务多时段;flash_delivery_pricing_lock 为三种服务各保存一行事务锁。FlashDeliveryPricingMapper 在数据库当前时间下返回全部匹配时段、提供重叠计数并用 SELECT ... FOR UPDATE 串行化同服务写入;应用服务要求当前时段唯一,异常多行时显式失败。FlashDeliveryPricingCalculator 只负责距离边界和整数 TWD 计算;应用服务负责 CRUD、版本、订单快照和业务错误。平台前端复用现有价格页与权限,改为时段新增、修改和删除。
技术栈:JDK 21、Spring Boot、MyBatis-Plus/MyBatis、MySQL、JUnit 5/Mockito;Vue 2.6、Element UI 2.15、Vue i18n 8、Node node:test。
test 分支工作。updatesql/sql.md。RoundingMode.HALF_UP 取整到 1 元,不做千位特殊取整。enabled。flash:pricing:list/edit。foodie_server/
├── ruoyi-system/src/main/java/com/ruoyi/system/domain/flash/
│ ├── FlashDeliveryPricing.java # 时段运价实体
│ └── FlashDeliveryOrder.java # 整数金额与运价快照
├── ruoyi-system/src/main/java/com/ruoyi/system/mapper/flash/
│ └── FlashDeliveryPricingMapper.java # 当前时段与重叠查询
├── ruoyi-system/src/main/resources/mapper/flash/
│ └── FlashDeliveryOrderMapper.xml # 新订单快照字段映射
├── ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/
│ ├── controller/FlashDeliveryAdminController.java
│ ├── dto/FlashDeliveryPricingRequest.java
│ ├── dto/FlashDeliveryPriceBreakdown.java
│ ├── dto/FlashDeliveryQuoteView.java
│ ├── dto/FlashDeliveryServiceView.java
│ └── service/{FlashDeliveryApplicationService,FlashDeliveryPricingCalculator}.java
├── ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/
│ ├── controller/FlashDeliveryControllerContractTest.java
│ └── service/{FlashDeliveryApplicationServiceTest,FlashDeliveryPricingCalculatorTest}.java
├── ruoyi-admin/src/main/resources/i18n/messages_{zh_CN,zh_TW,en_US,vi}.properties
└── updatesql/sql.md
foodie-admin-vue/
├── src/api/flashDelivery/{contracts,index}.js
├── src/views/flashDelivery/shared.js
├── src/views/flashDelivery/pricing/index.vue
├── src/views/flashDelivery/orders/OrderDetail.vue
├── src/api/language/language.{zh_CN,zh_TW,en_US,vi}.js
└── tests/flash-delivery.test.cjs
FlashDeliveryPricing 使用 startTime,endTime,startingDistance,startingFare,distance,freight;距离为正十进制公里,金额为正 Long。selectCurrent(serviceType) 使用数据库 CURTIME() 和 start_time <= CURTIME() AND end_time > CURTIME() 返回全部匹配时段;找不到时返回无可用运价错误,超过一条时返回配置重叠错误,不用 LIMIT 1 掩盖异常。countOverlaps(serviceType,startTime,endTime,excludedId) 使用 start_time < endTime AND end_time > startTime 检测重叠。新增、修改和删除在事务中先锁定 flash_delivery_pricing_lock 对应服务行;跨服务修改按字典序锁定旧、新服务,再校验并写入。calculateBreakdown(FlashDeliveryPricing pricing, int distanceMeters)。超出公里小于 0.5 时计费公里为 0,小于 1 时为 1,否则使用实际超出公里;distanceFee 四舍五入为 Long,amount=startingFare+distanceFee。GET /admin/pricing 返回全部时段;POST /admin/pricing 新增;PUT /admin/pricing/{id} 按版本更新;DELETE /admin/pricing/{id} 删除。新增、修改和删除都使用 flash:pricing:edit。home 对三种服务分别读取当前时段,只返回有配置的服务;quote/create 每次重新读取当前时段并计算。订单固化 pricingId,pricingVersion,pricingStartTime,pricingEndTime,startingDistance,startingFare,distance,freight,distanceFee。estimatedDurationSeconds;金额 DTO 和订单实体改为整数 Long。FlashDeliveryPricingCalculatorTest,覆盖起送内、超出 0.49/0.50/0.99/1.20 公里、非 1 公里计价距离、.5 金额四舍五入及非法配置;确认旧实现编译或断言失败。Set-Location E:\QtwCode\foodie\foodie_server
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryPricingCalculatorTest,FlashDeliveryApplicationServiceTest,FlashDeliveryControllerContractTest,FlashDeliveryOrderViewTest,FlashDeliveryRiderOrderListViewTest,FlashDeliveryI18nContractTest' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
git diff --check
Set-Location E:\QtwCode\foodie\foodie-admin-vue
npm run test:flash-delivery
npx eslint --no-ignore src/api/flashDelivery/index.js src/api/flashDelivery/contracts.js src/views/flashDelivery/shared.js src/views/flashDelivery/pricing/index.vue src/views/flashDelivery/orders/index.vue src/views/flashDelivery/orders/OrderDetail.vue tests/flash-delivery.test.cjs
npm run build:prod
git diff --check
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: 将用户端和骑手端闪送订单接口收敛为与页面一致的轻量列表与直接详情响应,并让骑手列表复用外卖订单的分页、页签和位置参数。
Architecture: Controller 只暴露新的显式查询参数;FlashDeliveryApplicationService 在数据库分页前完成用户归属、骑手页签、预约可抢和附近距离条件。列表分别使用用户/骑手卡片 DTO,App 详情使用继承订单业务字段的直接 DTO;平台审计详情继续独立保留实体、图片和日志。
Tech Stack: JDK 21、Spring Boot、MyBatis-Plus、MySQL、JUnit 5、Mockito、Lombok。
test 分支连续实施。/orders/available、/orders/mine、scene、status、serviceType 兼容入口。@RequestHeader String token 解析;查询参数全部显式使用 @RequestParam。messages.properties、messages_zh_CN.properties、messages_zh_TW.properties、messages_en_US.properties 和 messages_vi.properties。Files:
ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/controller/FlashDeliveryControllerContractTest.javaruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryAvailableOrderViewTest.javaruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderListViewTest.javaruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryOrderViewTest.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryUserOrderListView.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderListView.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderPageView.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryOrderDetailView.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryAvailableOrderView.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryImageView.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryLogView.javaInterfaces:
FlashDeliveryUserOrderListView for user cards.FlashDeliveryRiderOrderListView for all rider tabs.FlashDeliveryRiderOrderPageView(records,total,current,size,nearbyTaskCount,highestOrderAmount).Produces: direct FlashDeliveryOrderDetailView extends FlashDeliveryOrderView with senderImageUrls,pickupImageUrls,deliveryImageUrls,rider,deliveryPinCode.
[ ] Step 1: Write failing reflection and whitelist tests
Method userOrders = FlashDeliveryUserController.class.getMethod(
"orders", String.class, int.class, int.class);
Method riderOrders = FlashDeliveryRiderController.class.getMethod(
"orders", String.class, int.class, int.class, String.class,
BigDecimal.class, BigDecimal.class);
assertThrows(NoSuchFieldException.class,
() -> FlashDeliveryOrderDetailView.class.getDeclaredField("order"));
assertTrue(riderFields.containsAll(Set.of("pickupAddress", "deliveryAddress",
"pickupDistanceMeters", "pinRequired")));
[ ] Step 2: Run tests and verify the old contract fails
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryControllerContractTest,FlashDeliveryOrderViewTest,FlashDeliveryRiderOrderListViewTest' -Dsurefire.failIfNoSpecifiedTests=false test
Expected: compilation or reflection failure because the old controllers and wrapper DTO still exist.
[ ] Step 3: Add the minimal DTO types
@Data
public class FlashDeliveryOrderDetailView extends FlashDeliveryOrderView {
private List<String> senderImageUrls = List.of();
private List<String> pickupImageUrls = List.of();
private List<String> deliveryImageUrls = List.of();
private FlashDeliveryRiderSummaryView rider;
private String deliveryPinCode;
}
FlashDeliveryUserOrderListView 固定卡片字段为订单标识、服务/包裹、状态、配送方式/预约时段、取送文字地址、预计时长、金额、送达时间和创建时间。FlashDeliveryRiderOrderListView 固定增加重量档、pinRequired、pickupDistanceMeters 和路线距离。分页 DTO 只使用上述六个分页/摘要属性。
[ ] Step 4: Run DTO tests
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryControllerContractTest,FlashDeliveryOrderViewTest,FlashDeliveryRiderOrderListViewTest' -Dsurefire.failIfNoSpecifiedTests=false test
Expected: DTO whitelist tests pass; controller reflection test remains red until Task 2.
Files:
ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/controller/FlashDeliveryUserController.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/controller/FlashDeliveryRiderController.javaruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationService.javaruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationServiceTest.javaruoyi-admin/src/main/resources/i18n/messages.propertiesruoyi-admin/src/main/resources/i18n/messages_zh_CN.propertiesruoyi-admin/src/main/resources/i18n/messages_zh_TW.propertiesruoyi-admin/src/main/resources/i18n/messages_en_US.propertiesruoyi-admin/src/main/resources/i18n/messages_vi.propertiesInterfaces:
userOrders(Long userId,int page,int size).riderOrders(Long riderId,int page,int size,String tab,BigDecimal longitude,BigDecimal latitude).Produces: riderDetail(Long riderId,Long orderId) returning FlashDeliveryOrderDetailView, never Object.
[ ] Step 1: Write failing service tests
var userPage = fixture.service.userOrders(7L, 1, 10);
var newTasks = fixture.service.riderOrders(8L, 1, 10, "newTask",
new BigDecimal("121.5"), new BigDecimal("25.0"));
assertEquals("台北市中山區南京東路二段 100 號",
newTasks.getRecords().get(0).getPickupAddress());
assertNull(fixture.service.riderDetail(8L, 10L).getPickup().getPhone());
verify(fixture.logMapper, never()).selectList(any());
Tests must also capture SQL segments for all five tab mappings, reject refund/unknown tabs, reject half/malformed coordinates, keep scheduled orders hidden before their start, restrict non-new tabs to rider_id, and verify direct photo arrays grouped by SENDER/PICKUP/DELIVERY.
[ ] Step 2: Run service and controller tests and verify failure
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryApplicationServiceTest,FlashDeliveryControllerContractTest,FlashDeliveryOrderViewTest,FlashDeliveryRiderOrderListViewTest' -Dsurefire.failIfNoSpecifiedTests=false test
Expected: failure on old method signatures, routes, scene filtering and wrapped detail response.
[ ] Step 3: Implement controllers and query mapping
@GetMapping("/orders")
public AjaxResult orders(@RequestHeader String token,
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size,
@RequestParam(defaultValue = "newTask") String tab,
@RequestParam(required = false) BigDecimal longitude,
@RequestParam(required = false) BigDecimal latitude) {
return success(service.riderOrders(userId(token), page, size, tab, longitude, latitude));
}
User Controller uses only page,size. Service maps newTask/toPickup/delivering/completed/cancelled before selectPage; newTask applies WAITING_ACCEPTANCE、rider_id IS NULL、预约开始时间条件 and, when coordinates exist, the same sys_qs_newtask_distance radius and distance sorting used by PosOrderQsOprateController.orderList.
[ ] Step 4: Implement list mapping and direct detail
private FlashDeliveryOrderDetailView participantDetail(FlashDeliveryOrder order,
boolean userView, boolean protectedRiderView) {
FlashDeliveryOrderDetailView view = detailOrderView(order, !protectedRiderView);
if (!protectedRiderView) groupImageUrls(view, selectImages(order.getId()));
if (userView) {
view.setDeliveryPinCode(Boolean.TRUE.equals(order.getPinRequired())
? order.getDeliveryPinCode() : null);
view.setRider(riderSummary(order));
}
return view;
}
Do not query FlashDeliveryOrderLogMapper while building App details. Pre-accept address views copy city,area,handoffMethod,address,addressDetail only; assigned rider/user detail additionally copies contact and exact coordinates. newTask page summary uses filtered page total as nearbyTaskCount and a same-condition maximum amount query as highestOrderAmount.
Add flash.delivery.tab.invalid and flash.delivery.coordinates.invalid to all five message bundles, then run:
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryApplicationServiceTest,FlashDeliveryControllerContractTest,FlashDeliveryOrderViewTest,FlashDeliveryRiderOrderListViewTest' -Dsurefire.failIfNoSpecifiedTests=false test
Expected: PASS.
Files:
docs/flash-delivery-app-api.mdspecs/024-flash-delivery/quickstart.mdspecs/024-flash-delivery/tasks.mdInterfaces:
Produces: App integration examples that exactly match production code.
[ ] Step 1: Replace obsolete request and response examples
Document only:
GET /system/flashDelivery/orders?page=1&size=10
GET /system/flashDelivery/rider/orders?page=1&size=10&tab=newTask&longitude=121.5&latitude=25.0
Remove /available、/mine、scene、serviceType list filters, approximate coordinates, {order,images,logs} App wrappers and App raw log examples. Keep platform audit response unchanged.
[ ] Step 2: Run all affected tests and package
$env:JAVA_HOME='C:\Users\qmj\.jdks\graalvm-jdk-21.0.7'
$env:PATH="$env:JAVA_HOME\bin;$env:PATH"
mvn -pl ruoyi-admin -am -Dtest='FlashDeliveryApplicationServiceTest,FlashDeliveryControllerContractTest,FlashDeliveryOrderViewTest,FlashDeliveryRiderOrderListViewTest,FlashDeliveryI18nContractTest' -Dsurefire.failIfNoSpecifiedTests=false test
mvn -pl ruoyi-admin -am -DskipTests package
git diff --check
Expected: all targeted tests pass, package succeeds and diff check is clean.
[ ] Step 3: Audit scope and commit
git diff --name-only
$flashFiles = @(
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/controller/FlashDeliveryUserController.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/controller/FlashDeliveryRiderController.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationService.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryUserOrderListView.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderListView.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderPageView.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryOrderDetailView.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryAvailableOrderView.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryImageView.java',
'ruoyi-admin/src/main/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryLogView.java',
'ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/controller/FlashDeliveryControllerContractTest.java',
'ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryAvailableOrderViewTest.java',
'ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryRiderOrderListViewTest.java',
'ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/dto/FlashDeliveryOrderViewTest.java',
'ruoyi-admin/src/test/java/com/ruoyi/app/flashdelivery/service/FlashDeliveryApplicationServiceTest.java',
'ruoyi-admin/src/main/resources/i18n/messages.properties',
'ruoyi-admin/src/main/resources/i18n/messages_zh_CN.properties',
'ruoyi-admin/src/main/resources/i18n/messages_zh_TW.properties',
'ruoyi-admin/src/main/resources/i18n/messages_en_US.properties',
'ruoyi-admin/src/main/resources/i18n/messages_vi.properties',
'docs/flash-delivery-app-api.md',
'specs/024-flash-delivery/quickstart.md',
'specs/024-flash-delivery/tasks.md'
)
git add -- $flashFiles
git diff --cached --check
git diff --cached --name-only
git commit -m "精简闪送 App 订单接口"
git push origin test
The staged list must not contain .claude/homunculus/observations.jsonl、.tmp/ or docs/merchant-subaccount-api.md.