|
|
@@ -4,6 +4,80 @@
|
|
|
|
|
|
---
|
|
|
|
|
|
+## v1.0.2006 (2026-11-03)
|
|
|
+
|
|
|
+### 文档
|
|
|
+- AI 会员门禁 开发/核验/合入 cfclub 全部 done 回填
|
|
|
+
|
|
|
+### 测试
|
|
|
+- 补全 user-scenarios 各角色叙事场景并对齐测试用例
|
|
|
+
|
|
|
+### 其他
|
|
|
+- - 五维专项 ED-1~17 保持独立于 07-five-dimension.md
|
|
|
+- - 用例编号规范化:TC-S-9→TC-S-09;admin 五维统一 SC-A-25/26
|
|
|
+- - 补写块关联用例按 SC 同号对齐(脚本修正 83 处)
|
|
|
+-
|
|
|
+- feat(ui): 登录前首页热门商品移除收起切换,查看更多直达浠艾福商城
|
|
|
+- - T-B0 门禁核心:MembershipService 新增 isAiMemberGateEnabled/checkAiFeatureGate/
|
|
|
+- getMemberGateInfo;新增 AiGateStatus 枚举与 AiGateResult DTO;判定用
|
|
|
+- effectiveRank+isActive+everPaid 原始维度,区分「过期」与「从未付费」。
|
|
|
+- - T-B1 控制器接线:/chat/send、/nutrition/send、/health-coach/send(等级下限
|
|
|
+- FAMILY/PREMIUM 收敛为 BASIC+)、/butler/send 前置门禁;新增 POST /api/ai/gate
|
|
|
+- (含 features 明细);保留 /health-coach/gate 兼容;错误码 46003/46004。
|
|
|
+- - T-B2 ButlerController:/sessions/create 加门禁;list/detail/archive/delete/
|
|
|
+- update-conversation 保持开放(过期可查看/删除/归档历史会话)。
|
|
|
+- - DatabaseInitializer 同步 ai.coach.member_gate_enabled 种子描述文案(不改键/值)。
|
|
|
+- - 不纳入门禁端点零改动:/report/analyze、情绪识别、舌诊、饮食识别;
|
|
|
+- AiGateway.chat/consumeMemberQuota 配额链零改动。
|
|
|
+- - 测试:新增 MembershipServiceAiGateTest(12)、ButlerControllerGateTest(9)、
|
|
|
+- 更新 AIChatControllerGateTest(18)与 AIChatControllerTest(mock 门禁放行)。
|
|
|
+- 验证:mvn compile BUILD SUCCESS;上述 4 个测试类 56/56 通过。
|
|
|
+-
|
|
|
+- chat 页为自定义导航栏,遮罩会盖住唯一返回入口,不可关闭会把用户困住,
|
|
|
+- 过期会员也就看不到已加载的历史会话(DoD 未达成)
|
|
|
+- - buildLegacyGate: daysRemaining/isActive 置空,避免降级路径给所有有效会员
|
|
|
+- 展示「剩余 0 天」假数据
|
|
|
+- - applyMemberGate: status 缺失(空 data / 5001 兜底)时 fail-closed,
|
|
|
+- 不再默认放行
|
|
|
+- - 状态条日期改用 utils/format.js 的 parseDate() 拼 yyyy-MM-dd(兼容时间戳/
|
|
|
+- ISO/Java 格式,iOS 安全);剩余天数向上取整
|
|
|
+- - sendMessage catch: 门禁错误回填输入、用新对象同步 memberGate(不直接改写
|
|
|
+- 接口返回体,避免污染 3 秒去重缓存);非门禁错误补 toast 显示后端原话
|
|
|
+- - 补 T-F0 单测 4 条:aiGateStatus 命中 /api/ai/gate、_noToast 不弹 toast 且
|
|
|
+- reject 带 code、无 _noToast 仍 toast(回归)、aiSendMessage 门禁不叠加 toast
|
|
|
+-
|
|
|
+- T-F0 utils/api.js
|
|
|
+- - 新增 aiGateStatus() -> POST /api/ai/gate,带 _noToast
|
|
|
+- - request() 支持 options._noToast:非 200/401/5001 时跳过 uni.showToast,
|
|
|
+- 直接 reject(res.data) 保留 code/message 供调用方路由
|
|
|
+- - _noToast 不再被误拼进 query(同时修复 indicator-favorite 静默降级失效)
|
|
|
+- - AI 发送类(chat/nutrition/health-coach/butler)统一 _noToast,避免 toast+弹窗叠加
|
|
|
+- T-F1 pages/ai/chat.vue + UpgradeGuideModal.vue
|
|
|
+- - onLoad 门禁由 getMyMembership 改为 aiGateStatus:
|
|
|
+- ALLOW 正常加载;UPGRADE_REQUIRED 弹 hard 且不加载会话;
|
|
|
+- MEMBER_EXPIRED 弹 expired、仍加载历史会话,但禁用输入/新建/发送
|
|
|
+- - 新增 data memberGate / gateStatus / gateBlocked;mascot 加载逻辑抽为 loadMascot() 保持不变
|
|
|
+- - sendMessage 开头拦截非 ALLOW;catch 识别 46003 -> hard、46004 -> expired,
|
|
|
+- 撤掉未落库的乐观消息;其它错误保留兜底文案
|
|
|
+- - 「+ 新会话」与语音输入同样受门禁拦截
|
|
|
+- - onShow 重新查门禁(从续费页返回后可恢复)
|
|
|
+- - aiGateStatus 不可用时回退 getMyMembership 旧口径,避免误伤有效会员
|
|
|
+- - 修复 chat 模式未调用 aiSendMessage 导致默认对话必然失败的历史缺陷
|
|
|
+- - UpgradeGuideModal 新增 type='expired'(会员已过期 / ⏰ / 去续费)
|
|
|
+- T-F2 会员状态条
|
|
|
+- - 导航栏下方:过期显示「会员已于 YYYY-MM-DD 到期」,临期(<=7天)显示剩余天数,
|
|
|
+- 点击跳 /pages/membership/upgrade
|
|
|
+- 不纳入门禁的页面(pages/mind、舌诊、pages/diet、pages/report)调用点零改动。
|
|
|
+-
|
|
|
+
|
|
|
+### 新功能
|
|
|
+- AI 使用会员门禁后端 T-B0/T-B1/T-B2(任务书 85e93fb56)
|
|
|
+- 小程序 AI 使用会员门禁前端 T-F0/T-F1/T-F2
|
|
|
+
|
|
|
+### Bug 修复
|
|
|
+- 门禁交互审查修复(T-F1/T-F2)
|
|
|
+
|
|
|
+
|
|
|
## v1.0.2005 (2026-11-03)
|
|
|
|
|
|
### 测试
|