Input: Design documents from specs/003-merchant-billing/
Prerequisites: plan.md, spec.md
Tests: 手动测试(项目无自动化测试框架)
Organization: Tasks are grouped by backend API changes and frontend implementation.
[ID] [P?] [Story] DescriptionPurpose: 新增商家端专用的账单列表和汇总接口
[x] T001 [BE] UserBillingController.java 新增 storeBillingList 方法 — ruoyi-admin/src/main/java/com/ruoyi/app/pay/UserBillingController.java
[x] T002 [BE] UserBillingController.java 新增 storeBillingSummary 方法 — ruoyi-admin/src/main/java/com/ruoyi/app/pay/UserBillingController.java
Checkpoint: 商家端账单列表和汇总接口可用
Purpose: 修改日/周/月账单接口,支持按门店筛选
[x] T003 [P] [BE] UserBillingMapper.getdaylist / getdaysum / getShDaysum 增加 mdId 过滤条件 — ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserBillingMapper.java
(#{mdId} IS NULL OR md_id = #{mdId})b.md_id[x] T004 [P] [BE] UserBillingMapper.getmeeklist / getmeeksum / getShMeeksum 增加 mdId 过滤条件 — ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserBillingMapper.java
(#{mdId} IS NULL OR md_id = #{mdId})b.md_id[x] T005 [P] [BE] UserBillingMapper.getmatlist / getmatsum / getshMonthsum 增加 mdId 过滤条件 — ruoyi-system/src/main/java/com/ruoyi/system/mapper/UserBillingMapper.java
(#{mdId} IS NULL OR md_id = #{mdId})b.md_idCheckpoint: 所有账单接口支持 mdId 可选过滤
Purpose: 商家前端新增财务管理模块和账单管理页面
[x] T006 [P] [FE] 创建 billing.js API 层 — foodie-store/src/api/billing.js
[x] T007 [FE] 创建 BillingManage.vue 账单管理页面 — foodie-store/src/views/BillingManage.vue
[x] T008 [FE] router/index.js 添加账单管理路由 — foodie-store/src/router/index.js
[x] T009 [FE] Aside.vue 添加「财务管理 > 账单管理」菜单项 — foodie-store/src/components/Aside.vue
Checkpoint: 商家登录 → 财务管理 → 账单管理 → 筛选查看账单
Purpose: 文档更新和代码提交
git commit -m "feat(billing): 商家端账单功能 — 列表查询、汇总、mdId 过滤"(#{mdId} IS NULL OR md_id = #{mdId}) 模式,不传时查全部验证记录(2026-11-04):旧实现定向测试 9 项中 7 项按预期失败;修复后 JDK 21 执行上述 6 个测试类共 55 项全部通过,Maven ruoyi-admin 及依赖模块 package 成功,git diff --check 通过。未执行真实数据库入账、支付渠道或 App 联调,未部署。无数据库变更,不回写历史账单。
验证:JDK21执行 mvn -q -pl ruoyi-admin -am -Dtest=AppDictControllerTest,AuthAspectTest -Dsurefire.failIfNoSpecifiedTests=false package,退出码0,11项测试通过(字典6、认证5),失败/错误/跳过均0;差异检查通过。日志 ruoyi-admin/target/app-dict-query.log。未修改客户端页面,未进行线上字典联调、全量回归或部署;提交状态以 Git 记录为准。
验证记录:修复前18项定向测试中12项失败,复现分管账号被拒绝;修复后 JDK21 执行 mvn -q -pl ruoyi-admin -am -Dtest=StoreBillingSubaccountAccessTest,MerchantStoreAccessServiceTest,UserBillingFlashDeliveryTest,OrderBillingNoDeductionTest -Dsurefire.failIfNoSpecifiedTests=false package,40项全部通过,模块打包成功。git diff --check通过。日志 ruoyi-admin/target/store-billing-access-red.log / store-billing-access-green.log。无数据库变更,未执行线上账号/App联调、部署或全量回归,提交状态以Git为准。
T021验证:022 T015所列JDK21定向回归144项全部通过,模块package成功,差异检查通过。分管旧账单控制器12项、SQL范围测试1项,以及既有商家/骑手账单回归均包含在内。无数据库变更,未部署;提交与推送状态以 Git 记录为准。
已验证:修复前定向测试30项中9项失败,复现入口接收非法运费和汇总浮点尾差。修复后使用JDK21执行:
mvn -q -pl ruoyi-admin -am -Dtest=OrderWholeYuanFreightTest,StoreBillingSubaccountAccessTest,LegacyBillingSubaccountScopeTest,OrderBillingNoDeductionTest,UserBillingFlashDeliveryTest,FlashDeliveryPricingCalculatorTest,FoodDeliveryPromotionQuoteServiceTest,MultiStoreCheckoutQuoteServiceTest,OrderPromotionHelperFreeDeliveryTest,LinePayOfflineMerchantAccessTest,PosOrderShOprateControllerTest -Dsurefire.failIfNoSpecifiedTests=false package
退出码0,11个测试类共120项全部通过,失败/错误/跳过均0,模块打包成功;git diff --check通过。日志为ruoyi-admin/target/whole-yuan-red.log与whole-yuan-green.log。未执行全量回归、客户端联调或部署;未修改历史数据库和钱包,无SQL迁移。尚未提交或推送。
前一版范围验证(2026-11-04,orderAmount与前端改动已按用户最终要求撤回,以下123项记录不作为最终范围验证):删除旧接口前,OrderWholeYuanFreightTest 10项中1项按预期失败;账单展示修复前,StoreBillingSubaccountAccessTest 23项中2项失败,复现缺失原订单金额及重复扣抽成。最终执行T024同一组11类JDK21测试,123项全部通过(失败/错误/跳过均0),Maven package成功。商家PC执行 npm run build:test 成功。两个仓库 git diff --check通过。只读核对测试数据库订单与账单,无数据库或钱包修改,无SQL迁移。未执行浏览器/App联调、线上部署及完整回归;尚未提交或推送。
最终范围验证(2026-11-04):撤回orderAmount及所有前端改动后,执行JDK21 mvn -q -pl ruoyi-admin -am -Dtest=StoreBillingSubaccountAccessTest,OrderWholeYuanFreightTest -Dsurefire.failIfNoSpecifiedTests=false package,31项全部通过,失败/错误/跳过均0,后端打包成功。日志:ruoyi-admin/target/billing-final-scope.log。商家PC工作区干净,UserBilling实体无变更,后端差异检查通过;保留汇总重复扣抽成/精度修复、整数运费校验及旧addorder删除。未部署、未提交、未改历史数据。
[x] T032 运行定向回归、JDK21 打包和差异/换行检查,记录结果与未执行项目。
[x] T033 补充全部时间查询,默认今日,验证全历史收入/分页/日期互斥并同步契约。
验证记录(2026-11-05):spec-kit check-prerequisites.ps1 -Json -RequireTasks -IncludeTasks 通过,使用现有 003 规格增量。本次直接在原分支修改,临时源码副本隔离 Maven 产物;未创建分支。首次 4 项 SQL 测试因 Mapper 缺失失败;全部时间扩展另有 2 项红灯,分别复现日期条件导致累计收入为 0、Service 拒绝 ALL。最终 JDK 21.0.12 执行:
mvn -q -pl ruoyi-admin -am -Dtest=RiderIncomeMapperTest,RiderIncomeServiceTest,RiderIncomeControllerTest,UserBillingFlashDeliveryTest,OrderBillingNoDeductionTest,AuthAspectTest -Dsurefire.failIfNoSpecifiedTests=false package
37 项全部通过(SQL 5、Service 10、Controller 3、旧闪送账单 9、无抽成结算 5、认证 5),失败/错误/跳过均 0,Maven package 退出码 0。SQL 在 H2 MySQL 兼容模式实际执行。校验临时副本与交付源码相同,六份国际化文件的新 key 齐全且唯一,差异检查通过;独立只读评审未发现重要问题。
日志:ruoyi-admin/target/rider-income-red.log、rider-income-all-red.log、rider-income-green.log。未执行生产 MySQL 查询/性能验证、真实账号与 App 联调、全量回归或部署;没有数据库迁移/历史回写,没有提交或推送,因此无本次提交 SHA。当前交付为后端及 rider-income-api.md,App 由调用方接入。
T034 验证(2026-11-05):旧响应缺少 periodOptions 的 5 项测试按预期失败;补齐实现及固定 Clock 边界用例后,JDK21 执行 mvn -q -pl ruoyi-admin -am -Dtest=RiderIncomePeriodOptionsTest,RiderIncomeMapperTest,RiderIncomeServiceTest,RiderIncomeControllerTest,UserBillingFlashDeliveryTest,OrderBillingNoDeductionTest,AuthAspectTest -Dsurefire.failIfNoSpecifiedTests=false package,45 项全部通过(日期选项 8 项),失败/错误/跳过均 0,package 退出码 0。独立只读复审未发现重要问题,API 示例 JSON 及日期选中项检查通过,验证源码与工作区一致,git diff --check 通过。
日志:ruoyi-admin/target/rider-income-period-options-red.log、rider-income-period-options-green.log。本次仅后端响应及 spec-kit/接入文档;没有创建分支、提交、推送、数据库迁移或部署。未做 App 实机联调、生产 MySQL 与全量回归;无本次提交 SHA。
T033/T034 中 period=ALL 与后端日期选项实现已被本节替代;前期测试记录仅作过程证据,不作为最终契约。
用户最终补充:前端发送日期开始/结束的完整时分秒,例如 2026-11-05 00:00:00 至 2026-11-05 23:59:59;仅日期的中间实现已撤回。时间闭区间实际SQL回归覆盖末秒与起止时刻相等场景。
T035/T036 最终验证(2026-11-05):仅日期的中间实现已撤回,最终采用 startTime/endTime 秒精度闭区间。SQL 红灯 6 项中 3 项按预期失败,复现结束时刻账单遗漏及相同时刻查询为空;修复后 JDK21 执行 mvn -q -pl ruoyi-admin -am -Dtest=RiderIncomeMapperTest,RiderIncomeServiceTest,RiderIncomeControllerTest,UserBillingFlashDeliveryTest,OrderBillingNoDeductionTest,AuthAspectTest -Dsurefire.failIfNoSpecifiedTests=false package,38 项全部通过(SQL 6、Service 10、Controller 3、旧闪送账单 9、无抽成结算 5、认证 5),失败/错误/跳过均0,package退出码0。
独立复审指出的两处旧 Controller 验证参数已修正,最终复审无重要问题。源码与临时验证副本一致,API示例JSON及差异检查通过。日志:ruoyi-admin/target/rider-income-time-range-red.log、rider-income-time-range-green.log。未执行生产MySQL/性能、App实机联调、全量回归或部署;未创建分支、提交、推送或数据库迁移,无本次提交SHA。
T037 验证(2026-11-05):响应契约测试先出现预期失败(仍含 orderId,7 字段而非6字段);删除投影字段及订单主表子查询后,JDK21 执行 mvn -q -pl ruoyi-admin -am -Dtest=RiderIncomeMapperTest,RiderIncomeServiceTest,RiderIncomeControllerTest -Dsurefire.failIfNoSpecifiedTests=false package,19项通过(SQL6、Service10、Controller3),失败/错误/跳过均0,package退出码0。SQL用例仅建立 user_billing 表,验证账单读取无需订单主表;JSON示例与工作区测试源码核对通过,git diff --check通过。未进行真实MySQL性能测试、App联调、完整回归或部署;未创建分支、提交或推送。
提交前验证(2026-11-05):按用户 commit push 指令,仅暂存骑手账单代码、测试、六份语言文件的骑手提示和003规格增量,共20个文件;整数运费、旧接口删除等其他工作区改动不纳入。从暂存区导出独立源码副本,JDK21执行T035/T036所列6类定向测试及package,38项全部通过,失败/错误/跳过均0,打包退出码0。暂存差异检查通过。未执行App联调、真实MySQL性能测试、完整回归或部署;实际提交及推送结果以Git记录为准。