فهرست منبع

docs: API_REFERENCE 4.53 限时特价 + PROJECT-OVERVIEW v2.21 登记实施完成

Sisyphus Agent 4 روز پیش
والد
کامیت
435f823f6b
2فایلهای تغییر یافته به همراه61 افزوده شده و 4 حذف شده
  1. 6 4
      docs/superpowers/PROJECT-OVERVIEW.md
  2. 55 0
      docs/superpowers/api/API_REFERENCE.md

+ 6 - 4
docs/superpowers/PROJECT-OVERVIEW.md

@@ -1,13 +1,13 @@
 # 浠艾福 项目全景 — 阶段性需求与设计汇总
 
-**文档版本:** v2.20
-**日期:** 2026-10-20
+**文档版本:** v2.21
+**日期:** 2026-10-21
 **状态:** 已确认(v2.1 Phase 2-4 全栈完成)+ 虚拟支付改造(Tasks 1-12 已完成,退款闭环实施中)+ 新用户注册引导(12 Tasks 全栈完成)+ 家庭成员关系条增强(✅ 已实施)+ TabBar 重构(✅ 4Tab + 中间⭐扇形菜单,设计已对齐实现)+ **LIFETIME 终身会员(✅ 11 Tasks 全栈完成)** + **健康数据中心(✅ 全栈完成)** + **SKU 价格单位统一分 + 规格选择响应式修复(✅ 7 Tasks 全栈完成)** + **AI健康教练人格分化与管家自助选择(✅ 11 Tasks 全栈完成)** + **优惠券全链路改为家庭维度(待实施)** + **关系三图重构(关键人拓展章鱼图/珍珠图/能力图,设计规格已完成)** + **注册零填写+信息按需补充(✅ 全栈完成:登录直接进首页 + 家庭邀请独立页真实姓名/家庭身份必填 + 功能→信息字段映射表 + 添加成员手机号冲突邀请加入)** + **健康报告归属重分配(✅ 后端接口 + 管理端页面 + 小程序入口已实现,见 `specs/2026-10-05-health-report-reassign-design.md`)**
 **指标变化曲线·指标速查·指标关联(✅ 全栈完成:后端11任务+小程序M1-M8+管理端W1-W6;HBuilderX人工验收待用户执行,见 `specs/2026-10-09-indicator-change-curve-design.md`)**
 **饮食/睡眠/运动打卡接入任务完成链路(✅ 全栈完成:实体taskId字段 + 三个Controller isDailyProgress分流回写 + RepeatTaskGenerator每日生成打卡任务 + tasks.vue跳转 + 三打卡页taskId透传 + API文档;见 `specs/2026-10-13-health-checkin-task-linkage-design.md` 与 `plans/2026-10-13-health-checkin-task-linkage.md`)**
 **健康方案删除(✅ 全栈完成:后端级联删除接口含每日实例二次删除 + 小程序/管理端删除按钮 + 确认弹窗;见 `specs/2026-10-17-health-plan-deletion-design.md` 与 `plans/2026-10-17-health-plan-deletion.md`)**
-**限时特价(扫码闪购)(🟡 实现计划就绪待执行:设计规格已确认 + 7 任务实现计划(迁移389/390 → SpecialPriceService → 双控制器 → 特价下单+三处回滚 → 小程序 → 管理端 → 验收),5 个测试类;见 `specs/2026-10-20-limited-time-special-price-design.md` 与 `plans/2026-10-20-limited-time-special-price.md`)**
 **菌群知识并入 dan_knowledge_base(🔄 实施中:809 篇文章以 source_type='article' 并入统一知识表 + 后端 sourceType/excludeSourceType 过滤 + langgraph 三源重建 + 管理端统一展示,见 `specs/2026-10-20-knowledge-unify-design.md` 与 `plans/2026-10-20-knowledge-unify.md`)**
+**限时特价(扫码闪购)(✅ 全栈完成:迁移389/390 → SpecialPriceService 7 方法 + 双控制器(公开 info 白名单 + admin 6 接口)→ 特价下单 createSpecialDealOrder + cancel/approveRefund/OrderTimeoutCancelTask 三处 releaseQuota 回滚 + 供应商改价拒绝 + 小程序商品页 sp 解析/倒计时/特价区块/checkout 透传 + cfc-web SpecialPriceManage.vue;5 个测试类 31 case 全过;见 `specs/2026-10-20-limited-time-special-price-design.md` 与 `plans/2026-10-20-limited-time-special-price.md`)**
 **维护:** 所有需求变更需更新本文档
 
 ---
@@ -207,7 +207,7 @@
 | 库存管理(入库单+流水+盘点+预警+套餐拆库存) | Phase 4 | 🟡 设计稿 | `specs/2026-08-05-inventory-management-design.md` |
 | 商品可选赠品(按会员等级配置赠品池:赠品商品/CF值,购买时可多选) | Phase 4 | 🟡 设计稿 | `specs/2026-09-02-product-gift-selection-design.md` |
 | 供应商订单审核(修改价格/配送方式/添加优惠券/赠品) | Phase 4 | ✅ 已实施(后端 review/update 接口 + 前端 order-review 页面 + 列表审核入口,3 commits) | `specs/2026-09-12-vendor-order-review-design.md` + `plans/2026-09-12-vendor-order-review.md` |
-| 限时特价(扫码闪购) | Phase 4 | 🟡 实现计划就绪待执行(特殊价格活动表 + 专属小程序码 + 下单原子扣量/每人限购/券开关 + 回滚链路 + 管理端页面) | `specs/2026-10-20-limited-time-special-price-design.md` + `plans/2026-10-20-limited-time-special-price.md` |
+| 限时特价(扫码闪购) | Phase 4 | ✅ 已实施(special_price_deals 表 + 专属小程序码 + 下单原子扣量/每人限购/券开关 + 三处回滚 + 管理端页面) | `specs/2026-10-20-limited-time-special-price-design.md` + `plans/2026-10-20-limited-time-special-price.md` |
 
 ---
 
@@ -391,12 +391,14 @@
 | `2026-10-10-address-contact-backfill-realname-design.md` | 🟡 设计稿(后端统一回填方案:`RealNameBackfillService` 独立组件 + `UserAddressService.create/update` + `ConsigneeService.save` 两入口回填,realName 为空才回填,幂等) | 地址联系人回填真实姓名设计 |
 | `2026-10-16-comprehensive-health-survey-design.md` | 🟢 已实现(8 模块 step 式综合调研:basic/status/diet/disease/bowel/sleep/med/allergy,URL `modules=` 逗号分隔子集;ComprehensiveSurvey.vue 组件(1108 行)+ health-survey.vue 独立页 + pages.json 注册 + index-home/health-main 两处入口改跳;方案制定页 Step2 同步替换,memberFormMap 快照经 currentMemberForm 合并视图传 form prop;合并式增量保存 + 主动清空检测(diseasesCleared/medsCleared 下发 '[]'、lifestyle 模块感知 null 清除);过敏源双写两表;饮食结构 3 项补采;lifestyle 新 key currentStatus/exerciseFrequency/exerciseDuration;旧 wizard 集群 6 文件标记 DEPRECATED 零引用;实现提交 b5578f5d2/d6e1cb864/98450cd73,零后端改动零 DDL);**2026-10-18 调整**:粪便性状改为布里斯托 7 型图片选择(`static/health/bristol/`,生成脚本 `scripts/gen-bristol-stool-images.py`,共享选项/旧值归一模 `utils/bowel-form.js`,旧 5 档文案自动映射 7 型) | 综合健康调研 — 身体状态+饮食偏好合并 |
 | `2026-10-17-activity-poster-template-design.md` | ✅ 已实现(迁移381 `activity_poster_templates` 表 + 种子3套默认模板;后端4接口 `/api/admin/poster-template/*`(admin/operator 权限)+ `/api/poster-template/list`;cfc-web `PosterTemplateManage.vue` 管理页 + 路由 `poster-template-manage`(perm `activity:poster_template`)+ 活动管理菜单;小程序 `ContentSharePoster` 新增 `templates` prop 动态模板 + `activity-detail` 拉取(失败不阻塞);后端 `mvn clean compile` 通过) | Web 管理端定义活动海报模板 |
+| `2026-10-20-limited-time-special-price-design.md` | 🟢 已实现(迁移389 `special_price_deals` 表 + 迁移390 `product_orders.special_deal_id`;`SpecialPriceService`(computeRunStatus/list/create/update/updateStatus/delete/consumeQuota/releaseQuota/getUserPurchased + Mapper XML 原子扣量/回滚/按活动计数);公开 `POST /api/special-price/info`(JwtInterceptor 白名单)+ admin 6 接口;下单 `create()` 按 `specialDealId` 委托 `createSpecialDealOrder`(时间窗/互斥/每人限购/券开关/原子扣量紧跟 insert),回滚挂 cancel/approveRefund/OrderTimeoutCancelTask 三处 releaseQuota(GREATEST 防负);供应商改价 `reviewUpdate` 拒绝特价单;小程序商品页 scene `sp=` 解析 + 特价区块/倒计时/sold_out 回落 + checkout 一次性消费 storage key 透传特价单 + 特价禁券隐藏优惠券区;cfc-web `SpecialPriceManage.vue` + 路由 + admin.js 6 封装;5 测试类 31 case 全过 + `mvn clean compile`/全量 `mvn test -DskipTests=false` BUILD SUCCESS) | 限时特价(扫码闪购)设计规格 |
 
 ### 实施计划(plans/)
 
 | 文件 | 状态 | 说明 |
 |------|:----:|------|
 | `2026-10-10-address-contact-backfill-realname.md` | 🟡 待执行(4 任务:RealNameBackfillService 组件 TDD + UserAddressService 接线 + ConsigneeService 接线 + 整体验证;12 单测/纯 Mockito) | 地址联系人回填真实姓名实现计划 |
+| `2026-10-20-limited-time-special-price.md` | ✅ 已实施(7 任务全栈完成:T1 迁移389/390+schema+实体Mapper、T2 SpecialPriceService+(computeRunStatus 存储 draft/active/disabled→运行态 7 值推导)+9 单测、T3 双控制器+白名单 3 处(JwtInterceptor PUBLIC_PATHS/WebConfig 两 excludes 均邻 /api/product/detail)+11 单测、T4 特价下单 createSpecialDealOrder+三处回滚+reviewUpdate 防护+11 单测、T5 小程序产品页/checkout 特价透传(node --check×3 + audit 0 error)、T6 cfc-web SpecialPriceManage(vue-cli-service build SUCCESS)、T7 API_REFERENCE 4.53/4.54 + PROJECT-OVERVIEW 更新;分支 cfclub 6 commits,未推送待用户批准) | 限时特价(扫码闪购)实现计划(设计稿:2026-10-20-limited-time-special-price-design.md) |
 | `2026-10-09-indicator-change-curve-backend.md` | 🟢 已实施(11 任务全部完成:迁移 356-362 两新表 indicator_mapping_rules/indicator_correlations + indicator_definitions/indicator_values 升级、实体/Mapper、ReportDateExtractor(keyset 游标防挂死)、SpearmanUtil、IndicatorMappingService、NormalizeIndicatorPipeline 单一写者(三钩子)、IndicatorTrendService、IndicatorCorrelationService、4 视图 API + 2 admin Controller 5 端点、每日 03:00 IndicatorCalibrationJob、API_REFERENCE 4.48 同步;7 个新增单测类共 24 用例全绿,compile/test-compile EXIT=0) | 指标变化曲线·速查·关联 — 后端实施计划(设计稿:2026-10-09-indicator-change-curve-design.md) |
 | `2026-10-09-indicator-change-curve-miniapp.md` | ✅ 已实施(M1-M8 完成:utils/indicator-change.js 纯函数 + api.js 4 封装 + TrendChart canvas 组件 + indicator-curve.vue 曲线页 + indicator-quicklook.vue 速查页 + gut-flora-detail.vue 变化区块 + pages.json 注册;jest 14/14、audit exit0、4 .vue node --check 全过;M9 HBuilderX 人工验收待用户执行;⚠️ 修正 plan 模板两处 `:class` 方法调用违规为预计算 `_cssClass` 系列字段) | 指标变化曲线·速查 — 小程序实施计划(P4,依赖后端 P1-P3) |
 | `2026-10-09-indicator-change-curve-webadmin.md` | ✅ 已实施(W1-W6 完成:src/api/indicator.js 6 封装 + IndicatorCorrelations.vue + IndicatorMappings.vue + utils/indicatorSeeds.js + 路由注册 + 菜单回退项;jest 契约 7/7 + seeds 8/8、npx vue-cli-service build SUCCESS;零后端改动) | 指标关联/映射 — Web 管理端实施计划(P5,依赖后端 P4-P5) |

+ 55 - 0
docs/superpowers/api/API_REFERENCE.md

@@ -1782,3 +1782,58 @@ Web 管理端定义活动海报模板(迁移381 `activity_poster_templates` 
 **新增表:** `fat_weight_record`、`fat_diet_record`、`fat_exercise_record`、`fat_goal`(迁移 355–358,DatabaseInitializer)
 
 *文档更新:2026-10-09(减脂专题新增)*
+
+---
+
+### 4.53 限时特价(扫码闪购)
+
+> 设计规格:`specs/2026-10-20-limited-time-special-price-design.md`;
+> 新建 `special_price_deals` 表(迁移 389)+ `product_orders.special_deal_id` 列(迁移 390)。
+
+**用户端(公开接口,无需登录)**
+
+| 路径 | 说明 |
+|---|---|
+| `POST /api/special-price/info` | 查询活动详情(白名单,JwtInterceptor 公开路径;`userPurchased`/`userRemaining` 恒 0,每人限购由下单接口兜底) |
+
+请求体:`{ "dealId": 1 }`
+响应 `data` 字段:
+
+```json
+{
+  "id": 1, "productId": 10, "productName": "示例商品",
+  "name": "开售闪购", "specialPrice": 500, "productPrice": 990,
+  "startTime": "2026-10-20 12:00:00", "endTime": "2026-10-21 12:00:00",
+  "totalQuantity": 100, "soldQuantity": 23, "remainingQuantity": 77,
+  "perUserLimit": 2, "allowCoupon": 0, "runStatus": "ACTIVE",
+  "userPurchased": 0, "userRemaining": 0
+}
+```
+
+`runStatus` 枚举:`ACTIVE`(进行中)/`NOT_STARTED`(未开始)/`SOLD_OUT`(已售罄)/`ENDED`(已结束)/`DISABLED`(已停用)/`DRAFT`(草稿)/`INVALID`(活动不存在)。白名单路径不写 request attribute,每人限购由下单接口最终校验。
+
+**下单(特价路径)**
+
+`POST /api/product/order/create` 请求体新增 `specialDealId`(Long,可选)。若 `specialDealId != null` 走特价下单分支:
+
+1. 校验活动存在、`status=active`、`NOW() ∈ [start_time, end_time]`、商品一致
+2. 每人限购校验(`countByDeal` 累计 < `perUserLimit`)
+3. `allowCoupon=0` 且 `couponId` 非空 → 拒绝
+4. 原子扣量 `consumeQuota(id, qty)`(失败按 runStatus 返回明确原因)
+5. `insert` 订单行 `special_deal_id = dealId`,`unit_price = specialPrice`
+6. 回滚挂载点:`cancel`(用户取消)、`approveRefund`(退款完成)、`OrderTimeoutCancelTask`(超时取消),三处调用 `releaseQuota`(`GREATEST(sold_quantity - qty, 0)` 防负)
+
+**供应商改价拒绝**:`reviewUpdate` 开头若 `order.specialDealId != null` 直接 `Result.error("特价订单不允许修改价格")`。
+
+**管理端(admin 角色)**
+
+| 路径 | 权限 | 说明 |
+|---|---|---|
+| `POST /api/admin/special-price/list` | admin | 分页列表(body: `{page,size,keyword,runStatus}`;`runStatus` 可传 `ACTIVE/NOT_STARTED/SOLD_OUT/ENDED` 或 `draft/disabled`,空=全部;响应 `data.records[]` + `data.total`) |
+| `POST /api/admin/special-price/create` | admin | 新建(body: `{productId,name,specialPrice,startTime,endTime,totalQuantity,perUserLimit,allowCoupon}`;`specialPrice`/`productPrice`/`totalQuantity` 单位均为分;同商品互斥 active) |
+| `POST /api/admin/special-price/update` | admin | 修改(body 同 create + `id`;仅 `draft/disabled` 可修改) |
+| `POST /api/admin/special-price/status` | admin | 启停(body: `{id, action}`;`action ∈ {enable, disable}`;启用时再次校验互斥) |
+| `POST /api/admin/special-price/delete` | admin | 删除(body: `{id}`;已有特价订单时拒绝) |
+| `POST /api/admin/special-price/qrcode` | admin | 生成小程序码(body: `{id}`;`scene=id={productId}&sp={dealId}`,落地页 `product-detail`;返回 `data:{qrCodeBase64, scene, note?}`;测试模式 note 提示无法生成真实码) |
+
+*文档更新:2026-10-20(限时特价/扫码闪购新增)*