请在当前仓库的现有分支实施008促销功能新增“满额免运”,按spec-kit已有增量文档推进。后端和商家PC一起做,App/平台PC不动,不创建或切换分支/工作树,不恢复暂停的036工作。无需重新询问已确认的原价门槛与免运优先规则;本轮没有自动commit/push授权。
必读顺序:仓库AGENTS.md → spec.md FR-028~FR-036 → plan.md 2026-10-19章节 → contracts/free-delivery.md → tasks.md T074~T078。
工作目录为D:/QtwCode/foodie/foodie-server,商家PC为D:/QtwCode/foodie/foodie-store(实际D盘路径已核对;AGENTS中E盘是历史路径)。规划时服务端分支为codex/036-multi-store-checkout,商家PC分支为test-202609v2;执行前只确认位置,两个仓库都不自行创建或切换分支。PosFoodController.java存在原有未提交修改,保留、不混入本功能。
按T074→T075→T076→T077→T078,每批先写有业务断言的测试、确认红测,再实现并验证;文档规划不是已通过测试。SQL只在updatesql/sql.md最后按执行日期追加,由开发者手动执行,禁止直接迁移测试/生产数据库。
以下为实施完成后的命令示例,本轮规划没有执行这些构建或测试:
$env:JAVA_HOME = 'C:/Users/99029/.jdks/graalvm-jdk-21.0.12+7.1'
$env:PATH = "$env:JAVA_HOME/bin;$env:PATH"
java -version
# 在foodie-server目录,命令行参数整体加引号以符合PowerShell。
mvn -pl ruoyi-system -am test '-Dtest=PromotionActivityServiceImplFreeDeliveryTest,PromotionDiscountLimitCheckerTest,PromotionCalcServiceImplFreeDeliveryTest,PromotionCalcServiceImplDiscountLimitTest' '-Dsurefire.failIfNoSpecifiedTests=false'
mvn -pl ruoyi-admin -am test '-Dtest=ShPromotionActivityFreeDeliveryTest,FoodDeliveryPromotionQuoteServiceTest,OrderPromotionHelperFreeDeliveryTest,UserOrderFreeDeliveryCreateTest,OrderFreeDeliverySettlementTest,OrderInvoiceFreeDeliveryTest,PayMethodSwitchServiceTest' '-Dsurefire.failIfNoSpecifiedTests=false'
mvn -pl ruoyi-admin -am verify
# 在D:/QtwCode/foodie/foodie-store目录
npm run build:test
定向用例名与最终测试类一致;运行后读取测试计数与FAILURE/ERROR,不能仅根据命令退出或surefire未找到测试的选项宣称通过。前端没有现成test/lint脚本,不编造npm test;构建与手工四语言验收按T078完成。
远程地图/支付/退款在单元测试中mock,不把外部测试环境退款失败改成假成功。需要手工联调的项目明确标为未验证。只触及本功能相关支付金额读取,不重做OMG全套接口或启用废弃支付代码。
已完成:T074~T077 全部子项与 T078 自动化项;未创建分支/工作树、未改 App、未动平台 PC、未触碰 PosFoodController(该文件当前已不在工作区改动中,系并行会话处理)。
代码落点:
PromotionActivityServiceImpl(type=5 校验/台北整天归一化/有效状态/归属+PosStoreMapper.lockStoreRow 行锁/重叠)、PromotionActivityMapper.selectActiveFreeDeliveryByStoreId+selectActivityPage(SQL 内 CASE 计算有效状态)、PromotionActivitySaveRequest DTO、ShPromotionActivityController(DTO+操作者ID)。IPromotionCalcService 三参重载(PromotionDeliveryContext)、PromotionCalcServiceImpl 逐路径预算评估(goodsBudget=max(0,B−F)、半价豁免、互斥不释放F、按 A=G+D 选路、type=5 明细、剩余预算、appliedCouponId)、PromotionCalcRequest.CartItem.specValueIds、PromotionCalcResponse 版本2扩展字段。FoodDeliveryPromotionQuoteRequest/FoodDeliveryPromotionQuoteService(门店/自配送/地址/商品/规格核实、Google 路线+跳表运费、POST /app/userPromotionCalc/deliveryQuote)。OrderCreatItem.promotionPricingVersion、UserOrderController.prepareVersionTwoQuote(权威重算+quoteChanged 拒绝+ddId 幂等+父单金额服务端确定)、OrderPromotionHelper(汇总排除 subType=5、applyVersion2Pricing/buildServerFoodJson/resolveCouponToConsume)、PosOrder 三列+三派生 getter、PosOrderMapper.xml。OrderService.setSanghuBilling 版本2按 G=A−D(不查 VipUserQuanyi)、OrderInvoiceService.invoiceGoodsTotal(两处 A−D)、骑手分成沿用 R 不变。promotion.freeDelivery.* key(新键 duplicateOrder/configConflict 超出列表下限)+新建 messages_vi.properties;商家PC promoActivity 6 key×4语言。已运行验证(JDK 21.0.12,均通过):定向 ruoyi-system 40/40(含矩阵第2行 F=B 边界);定向 ruoyi-admin 45/45;mvn -pl ruoyi-admin -am verify 全量 1109/1109;npm run build:test 成功(dist 2026-10-19 11:34 产出,webpack 缓存告警不影响);后端6包/前端4语言 key 一致性脚本核对通过;git diff --check 无空白错误(4个 LF 文件已转回 CRLF)。
待人工:①updatesql/sql.md 末尾 2026-10-19 三条 ALTER 由开发者手动执行;②商家 PC 浏览器手工验收(第五Tab/四语言/重叠拒绝/结束操作);③Google 路线与运价真实调用仅单测 mock,联调未做;④App 端未接入 deliveryQuote/version2,旧App保持旧行为。
未提交:本轮无 commit/push 授权,全部改动保留在工作区(foodie-server 分支 codex/036-multi-store-checkout、foodie-store 分支 test-202609v2)。