Files
Neo-ZQYY/docs/_overview/04b-conflicts-P1-detail.md
Neo 509cf43284 chore(docs): Wave 0 调研产出 + P0/P1/P2 反馈调研
建立项目级标杆文档 docs/_overview/ 作为产品全景索引,
解决"PRD 零碎、文档膨胀、跨子系统调研无入口"的问题。

主要内容:
- 00-index 总索引 + 维护协议 + 与 CLAUDE.md 关系
- 01-product-overview 产品全景脑图(6 角色 / 6 子系统 / 数据流 /
  7 业务概念 / 8+1 AI 矩阵 / 22 术语)
- 02a-miniprogram-page-matrix 小程序 21 页业务指纹
- 02b-adminweb-page-matrix admin-web 19 路由业务指纹
- 03-test-spec 测试规范 (L1-L5 分层 + 走查模板 + 75-95 case 估算)
- 04-doc-conflicts 39 条冲突索引(P0×8 / P1×13 / P2×13 + 5 子项)
- 04a/b/c-conflicts-*-detail 业务故事卡(7 字段:关联/逻辑/影响/选项/判定)
- 05-orphan-pages-cleanup admin-web 6 孤儿页面处置(1 归档 + 4 保留)
- WAVES-MASTER-PLAN.md 全 Wave 主计划(0-5,共 22-32 工作日)
- WAVE-1-KICKOFF.md Wave 1 实施 kickoff
- GLOBAL-DECISION-DASHBOARD.md 全局决策仪表板

反馈调研产物:
- 04a-feedback/ P0 两轮反馈(8+8 项决策 + D-1/2/3 + F-1/2 子代理产出)
- 04b-feedback/ P1 两轮反馈(13+1+5 项 + E-1/2/3/4 + G-1/2 子代理产出)
- 04c-feedback/ P2 反馈(13 项 + 5 子项 + H-1/2/3 子代理产出)
- NEO-DECISIONS-LOG 累积决策记录

关键追加发现 8 处 D Bug(原蓝本 0):
- P0-3 看板沙箱接入(Wave 1 W1-T1)
- P0-5 致命 1 (4 处 fdw_etl 残留, 已修 commit 17f045a)
- P0-5 致命 2 (JWT aud 缺失, 已修 commit 17f045a)
- P0-6 clearAllTasks 守卫 (Wave 3)
- P0-8 DBViewer 黑名单漏 (已修 commit 17f045a)
- P1-3 task-detail 跳转传 task_id 而非 customer_id
- P2-7 board-finance 隐式 null
- 2 个独立 Bug (page_context.created_at + ClueCategory 字典)

参考: docs/_overview/00-index.md
2026-05-04 07:38:28 +08:00

515 lines
27 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# P1 文档冲突业务故事卡(13 条详细版)
> 生成日期:2026-05-04 / 来源:`04-doc-conflicts.md` § 一 P1 表 + Wave 0 三份产出
> 用途:把 P1 级别的 13 条文档冲突重写为业务故事卡,便于 Neo 决策
> 判定标记:A=过期-改文档 / B=现状对-归档 / C=待补 SPEC / D=Bug-改代码
> 注:本文件**不下结论**,仅给推荐选项与一句话理由,最终判定由 Neo 拍板
---
### P1-1. 维客线索表 schema 归属(public vs biz)
**关联页面/接口**:
- 数据表:`zqyy_app.public.member_retention_clue`(已建)
- 涉及页面:`task-detail`(L141 维客线索 8 条)、`customer-detail`(L268 维客线索 7 条)、`tenant-admin` 维客线索 CRUD
- 涉及 AI 应用:应用 3(消费分析)、应用 6(备注分析)、应用 8(整合去重落库)
- 涉及 SPEC:`docs/prd/specs/P10-tenant-admin-web.md``docs/prd/specs/00-数据依赖矩阵.md`
**业务背景**:
维客线索是门店与客户长期维护关系的关键资产(标签 + 摘要 + 详情 + 来源 + 提供人),既由门店管理员手工录入,也由 AI 应用 3/6 自动产出后经应用 8 去重整合落库。表已建在 `public` schema,但项目总体设计方向是"业务表归 `biz`"。
**冲突逻辑**:
- 数据依赖矩阵 / P10 SPEC:`zqyy_app.public.member_retention_clue`(已建,在 `public`)
- `P1-miniapp-db-foundation.md` Schema 规划:业务表应放 `biz`
- 现状(数据库):实际表在 `public.member_retention_clue`
**业务联系**:
- 上游:应用 8 写入 / tenant-admin 增删改
- 下游:小程序 task-detail / customer-detail 读取展示;后端 FDW 与 RLS 视图绑定该表 schema
**修改影响**:
- 若迁移到 `biz`:需要 DDL 迁移 + 更新所有 SQL 引用(估计后端 5-8 处) + RLS 视图重建 + 文档同步,工作量**中**
- 若保留 `public`:仅需在 `P1-miniapp-db-foundation.md` 加例外说明,工作量**小**
**推荐选项**:
1. **选项 A(迁移到 biz)**: 优:符合"业务表归 biz"总原则,长期一致 / 劣:需要 DDL 迁移 + 数据复制,有破坏现有 FDW 与 RLS 风险
2. **选项 B(保留 public + 文档说明)**: 优:零代码改动,稳定 / 劣:破坏总原则,后人困惑
3. **选项 C(迁移并保留 public 兼容视图)**: 优:平滑过渡 / 劣:双 schema 维护成本
**建议判定**: **C 待补** + 一句理由:Neo 决策保留还是迁移,本身是项目总规划取舍
**Wave 验证锚点**: 跑 `\dt zqyy_app.public.member_retention_clue``\dt zqyy_app.biz.member_retention_clue` 校验现状
*反馈选项A,理由是保证项目工程的规范性。至于代价:需要 DDL 迁移 + 数据复制,有破坏现有 FDW 与 RLS 风险,可以单独起一个任务进行调研和风险评估。但要保持项目工程的规范性原则。*
---
### P1-2. login 跳转 approved 的目标页
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/login/login.ts`
- `docs/miniprogram-dev/api-audit/login.md` L84-L94
- `docs/miniprogram-dev/api-audit/reviewing.md` L52
- `docs/miniprogram-dev/api-audit/no-permission.md` L50
- `docs/miniprogram-dev/api-audit/apply.md` L57
- `docs/miniprogram-dev/_hardcode-summary.md` 第 16-18 项
**业务背景**:
小程序员工登录后,后端返回 `user_status`,前端按状态路由到下一页。`approved`(已审核通过)状态应直接落到工作台。历史曾用 `/pages/mvp/mvp` 做最小可用版本(MVP)的工作台,后改名为 `task-list`
**冲突逻辑**:
- 现状(代码 + `_hardcode-summary.md`):approved → `/pages/task-list/task-list`
- 旧文档(`reviewing.md` L52 / `no-permission.md` L50 / `apply.md` L57):仍写 `/pages/mvp/mvp`
**业务联系**:
- 上游:任何状态变化触发的 reLaunch(login / apply / reviewing 三处)
- 下游:用户从此进入任务工作台
**修改影响**:
- 仅文档同步:替换 3 处 `mvp/mvp``task-list/task-list`,工作量**小**
- 不涉及代码改动(代码已是 task-list)
**推荐选项**:
1. **选项 A(改文档)**: 优:与代码对齐,零功能风险 / 劣:无
2. **选项 B(保留旧路由别名)**: 优:旧版本兼容 / 劣:无意义,小程序无版本兼容压力
**建议判定**: **A 过期-改文档** + 一句理由:`mvp` 是历史命名,`task-list` 是当前唯一正确目标,旧文档 3 处批量替换即可
**Wave 验证锚点**: 检查 `apps/miniprogram/miniprogram/pages/login/login.ts` reLaunch 调用,确认仅有 `task-list`
*反馈选项A,修改文档。并检查是否还有遗留代码,一并删除处理。*
---
### P1-3. task-detail 跳 chat / customer-service-records 时传 detail.id 而非 customerId
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/task-detail/task-detail.ts`
- `apps/miniprogram/miniprogram/pages/chat/chat.ts`
- `apps/miniprogram/miniprogram/pages/customer-service-records/customer-service-records.ts`
- API 契约:TASK-2(`GET /api/xcx/tasks/{id}` 响应)
- `docs/miniprogram-dev/api-audit/task-detail.md` L67-L130
**业务背景**:
助教在 task-detail 页可点"问问助手"或"查看服务记录",分别跳到 chat 与 customer-service-records 页。这两个目标页都按"客户(customerId)"组织数据(查这个客户的对话历史 / 查这个客户的服务流水),但 task-detail 当前传的是 `detail.id`(任务 id),目标页拿到后语义错位。
**冲突逻辑**:
- 现状(代码):`navigateTo({ url: 'chat?customerId=' + detail.id })` — 但 `detail.id` 是 taskId
- 期望(目标页 chat.loadMessages):应传真正的 customerId
- 根因:TASK-2 响应未明确返回 `customer_id` 字段,前端只能拿 task 的 id
**业务联系**:
- 上游:task-detail 接口需在 TASK-2 响应里增加 `customer_id`
- 下游:chat 与 customer-service-records 拿到正确 customerId 才能加载
**修改影响**:
- 后端:TASK-2 响应增加 `customer_id` 字段(SQL JOIN dim_member)
- 前端:跳转参数改为 `customerId=detail.customer_id`
- 工作量**小**
**推荐选项**:
1. **选项 A(后端补字段 + 前端改跳转参数)**: 优:语义清晰,从源头修正 / 劣:需要后端发版
2. **选项 B(目标页同时支持 taskId 入口)**: 优:前端单边改 / 劣:目标页需双路径加载,复杂度上升
**建议判定**: **D Bug** + 一句理由:这是数据传参错误的实质 bug,不是文档问题,后端补 `customer_id` 字段是最干净的修法
**Wave 验证锚点**: 测试 task-detail 跳转后能否正确加载客户对话与服务记录
---
### P1-4. performance 跳 task-detail 时传 customerName 而非 task_id
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/performance/performance.ts`
- `apps/miniprogram/miniprogram/pages/task-detail/task-detail.ts`
- `docs/miniprogram-dev/api-audit/performance.md` L82-L99
- 02a 矩阵 GAP-17
**业务背景**:
助教在 performance(绩效页)看到"我的服务记录明细"或"我的新客 / 常客"列表,期望点条目能跳到对应任务详情。但当前实现传的是 `customerName`(客户名字符串),task-detail 页根本无法用 customerName 定位到具体任务,因为同一客户可能有多条任务。
**冲突逻辑**:
- 现状(代码):`navigateTo({ url: 'task-detail?customerName=' + record.customerName })`
- 期望(task-detail.onLoad):应通过 `taskId` 拉取 TASK-2 响应
- 副作用:跳转后 task-detail 拿不到任务,只能 toast 失败
**业务联系**:
- 上游:performance 的服务记录条目(后端 PERF-1 响应)需要有 `task_id` 字段
- 下游:task-detail 按 task_id 加载
**修改影响**:
- 后端:PERF-1 响应增加 `task_id`(若该服务记录关联任务的话;部分历史记录可能无关联)
- 前端:跳转参数改为 `id=record.task_id`
- 工作量**小**
**推荐选项**:
1. **选项 A(后端补 task_id + 前端改参数)**: 优:语义正确 / 劣:历史无关联记录该字段为 null,需前端处理无 task 情况
2. **选项 B(取消跳转)**: 优:零工作 / 劣:体验损失,助教看不到任务上下文
**建议判定**: **D Bug** + 一句理由:与 P1-3 同源的传参错误,从源头补 `task_id` 字段最干净
**Wave 验证锚点**: 测试 performance 服务记录点击 → task-detail 是否正确加载
*P1-3 和 P1-4 一同反馈同意你的初步判断但谨慎起见还是要从页面和产品设计出发对业务进行理解的情况下在深入调研这个问题尤其整个APP页面与角色的传值规范性方面如果最后结论不变则进行修后端补字段及可能的前端改跳转参数处理。*
---
### P1-5. board-finance "AI 洞察" 12 项指标的 cache_type
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/board-finance/board-finance.ts`(AI 洞察 12 项)
- 后端表:`biz.ai_cache`
- `docs/miniprogram-dev/api-audit/board-finance.md`
- AI 应用 2(财务洞察)
- 02a 矩阵 C13
**业务背景**:
财务看板底部展示"AI 洞察"12 项指标卡(优惠率 Top / 差异最大 / 建议关注等),来源是 AI 应用 2 的财务洞察输出,缓存在 `biz.ai_cache` 表(每日轮询)。前端区分这 12 项指标时需要按 `cache_type` 字段查询,但当前是前端 3 行硬编码,后端 `biz.ai_cache` 表对 `cache_type` 字段没有约定枚举。
**冲突逻辑**:
- 现状(前端):board-finance 用 3 个固定 cache_type 字符串硬编码取 12 项指标
- 现状(后端):`biz.ai_cache.cache_type` 无枚举约定文档
- 期望:统一定义 cache_type 枚举,前后端共享
**业务联系**:
- 上游:AI 应用 2(每日轮询写 ai_cache)
- 下游:board-finance 读取展示
**修改影响**:
- 新增 SPEC / 数据字典:cache_type 枚举表(估计 5-8 项)
- 后端:写入 ai_cache 时按枚举写入
- 前端:从硬编码改为枚举常量
- 工作量**中**
**推荐选项**:
1. **选项 A(新建枚举字典 + 共享 packages/shared)**: 优:前后端单一数据源 / 劣:需要新增枚举文件
2. **选项 B(后端 SPEC 文档定义,前端引用)**: 优:轻量 / 劣:无运行时校验
3. **选项 C(保持现状)**: 优:零工作 / 劣:加新指标必崩
**建议判定**: **C 待补** + 一句理由:这是真冲突,需要在 SPEC 中定义 ai_cache 的 cache_type 枚举,Neo 决策放哪份 SPEC
**Wave 验证锚点**: 跑 `SELECT DISTINCT cache_type FROM biz.ai_cache` 看现状有哪些值
*反馈是的在开发过程中进行了若干次调优你可以看下相关的历史Session。反复优化后的结果从百炼AI接口返回的内容和前端页面呈现方面来看现在的结果我比较满意。**但是!正如你说的,“统一定义 cache_type 枚举,前后端共享”的方式才是规范可靠的。这个修改是否需要让AI返回一些标准的标记以进行信息对齐深入调研给我一个修正方案然后再考虑文档同步问题。***
---
### P1-6. AI 触发器双 API:/admin/ai/triggers vs /trigger-jobs
**关联页面/接口**:
- `apps/admin-web/src/api/adminAI.ts`(`/api/admin/ai/triggers`)
- `apps/admin-web/src/api/triggerJobs.ts`(`/api/trigger-jobs`)
- 前端组件:`AITriggers.tsx`(用前者) / `BizTriggersTab` in `TriggerManager.tsx`(用后者)
- 后端表:`biz.trigger_jobs`(同一张表)
- 02b 矩阵 §五-3
**业务背景**:
admin-web 触发器管理页有两个 API 操作同一张 `biz.trigger_jobs` 表:`/api/admin/ai/triggers`(带 job_type 过滤,只返 AI 类) 与 `/api/trigger-jobs`(全量,返回所有触发器)。前者用于 AI 触发器编辑,后者用于业务触发器编辑,两者编辑的字段名也不一致(`cron/desc` vs `cron_expression/interval_seconds`)。
**冲突逻辑**:
- API A(adminAI.ts):`GET /admin/ai/triggers` + `PATCH /admin/ai/triggers/:id`,操作字段 `cron/desc`
- API B(triggerJobs.ts):`GET /trigger-jobs` + `PATCH /trigger-jobs/:id/config`,操作字段 `cron_expression/interval_seconds`
- 数据底层:同一张 `biz.trigger_jobs`
**业务联系**:
- 上游:无(直接对表)
- 下游:AI 触发器 / 业务触发器的启停与配置
**修改影响**:
- 若合并:前端两组件适配同一 API,后端一个 API 处理两种字段格式;工作量**中**
- 若保留分离:在 NS1 / NS-admin-web-backend-api 文档中明文写出"AI 用 A,业务用 B"
- 工作量**小**
**推荐选项**:
1. **选项 A(合并为一套 API)**: 优:DRY,长期清晰 / 劣:有迁移代码改动,容易引入回归
2. **选项 B(明文区分使用边界,保留双 API)**: 优:不动现有代码 / 劣:维护两套
3. **选项 C(API B 标记弃用,新代码全部走 A)**: 优:渐进迁移 / 劣:中间态较长
**建议判定**: **C 待补** + 一句理由:Neo 决策合并还是双轨,本身是后端架构取舍,不能擅自下结论
**Wave 验证锚点**: 检查 adminAI.ts 与 triggerJobs.ts 的 PATCH 字段差异,确认是否真有不可调和的 schema 差异
*反馈个人倾向合并为一套API但要进行调研看下数据获取的泛用性如果合适我记得页面内容基本一致则合并完成后进行case编写和测试。*
---
### P1-7. NS1 未覆盖 /api/admin/*,admin-web API 无独立 PRD
**关联页面/接口**:
- `docs/prd/Neo_Specs/NS1-*.md`(主要描述 `/api/xcx/*` 小程序接口)
- `apps/backend/app/routers/admin_*.py`(实际实现)
- admin-web 全部 API 来自 `apps/backend/app/routers/admin_*.py` + `app/routers/*.py`
- 02b 矩阵 §五-1
**业务背景**:
admin-web 后台有 19 个路由、80+ 后端 API,目前没有独立的 API PRD 文档,只能从代码 (`routers/admin_*.py`) 反查实际行为。NS1(Neo Spec 1)聚焦小程序 `/api/xcx/*` 接口,完全没覆盖 `/api/admin/*`
**冲突逻辑**:
- 现状(NS1):仅描述小程序接口
- 现状(代码):admin-web API 走 `/api/admin/*`,无 PRD
- 影响:Wave 1 走查时无判据,运维新人无文档可读
**业务联系**:
- 上游:无
- 下游:admin-web 全部页面、未来 API 变更的回归判据
**修改影响**:
- 新增 SPEC `NS-admin-web-backend-api.md`,从代码反向梳理 80+ API
- 工作量**大**(预计需要 2-3 天集中梳理)
**推荐选项**:
1. **选项 A(立刻补一份完整 PRD)**: 优:补齐文档体系 / 劣:工作量大,过去半年仍以代码为准
2. **选项 B(只补"约定 + 关键 API"摘要文档)**: 优:轻量,聚焦 / 劣:仍有未覆盖 API
3. **选项 C(自动化生成 OpenAPI 后再人工校对)**: 优:与代码同步 / 劣:需要先做 OpenAPI 装备
4. **选项 D(暂不补,以代码为准)**: 优:零工作 / 劣:Wave 1 走查无据
**建议判定**: **C 待补** + 一句理由:这是 SPEC 缺失,Neo 决策补的形式(完整 / 摘要 / 自动化)
**Wave 验证锚点**: 02b 矩阵 §二映射表已是事实摘要,可作为补 PRD 的起点
*反馈:选项 A。在梳理完整PRD时我希望你能顺便发现一些API的问题比如API设计是否合理架构是否合理API背后的处理是否合理清晰性能可用性稳定性安全性是否需要优化一些糟糕的API是否需要重构合并等评估。*
---
### P1-8. 应用 4 触发条件:AI 需求 2 写 3 种,数据依赖矩阵写 1 种
**关联页面/接口**:
- `docs/prd/AI需求2.md`(应用 4 章节)
- `docs/prd/specs/00-数据依赖矩阵.md` §三
- 后端实现入口:`apps/backend/app/services/ai_*`(P5-A 应用 4 调用骨架)
- AI 应用 4(关系分析 / 任务建议)
- 01 全景 §八-4
**业务背景**:
AI 应用 4 是给 task-detail 页展示"与我的关系 + 任务建议 + 行动建议"的核心 AI,触发条件决定多少次调用、消耗多少 token。两份文档对触发条件描述不一致:`AI需求2.md` 写 3 种触发(新结算单 / 优先召回任务分配 / 高优先召回任务分配),数据依赖矩阵只写 1 种(助教参与新结算时)。
**冲突逻辑**:
- AI 需求 2.md(应用 4):3 种触发条件
- 数据依赖矩阵 §三:1 种触发条件
- 实现影响:若按 1 种实现,会漏掉两类任务分配触发(高优先召回 / 优先召回)
**业务联系**:
- 上游:结算单写入 / 任务分配生成
- 下游:应用 4 输出(关系分析 + 任务建议)写入 ai_cache,task-detail 读取
**修改影响**:
- 若按 3 种:每天调用次数估算可能 ×2-3,token 消耗对应增加
- 若按 1 种:任务分配时 task-detail 看不到最新关系分析,体验降低
**推荐选项**:
1. **选项 A(以 AI 需求 2.md 为准:3 种触发)**: 优:体验好,任务分配即时刷新 / 劣:token 消耗高
2. **选项 B(以数据依赖矩阵为准:1 种触发)**: 优:成本低 / 劣:任务分配场景下分析过期
3. **选项 C(分级:新结算必触发,任务分配走缓存或 1 小时去重)**: 优:折中 / 劣:逻辑稍复杂
**建议判定**: **C 待补** + 一句理由:Neo 决策成本与体验取舍,涉及 AI token 预算,不能擅自下结论
**Wave 验证锚点**: 检查 P5-A 应用 4 调用骨架已实现的触发点数量
*反馈:选项 A。Token成本付出是必要且能接受的。*
---
### P1-9. User_ID(蛇形)vs userId(驼峰)风格混用
**关联页面/接口**:
- `docs/prd/AI需求2.md`(用 `User_ID` 蛇形大写)
- `docs/prd/后端接口需求说明_数据需求PRD.md`(用 `userId` 驼峰)
- 后端:`apps/backend/app/api/*`(对外 camelCase) → `apps/backend/app/services/ai_*`(对百炼 `User_ID`)
- 01 全景 §八-6
**业务背景**:
AI 应用 1(通用对话)的传参里用户身份字段名,在百炼平台占位符规范是 `User_ID`(蛇形大写下划线,百炼 SDK 习惯),在前后端 REST API 是 `userId`(驼峰,JS 习惯)。两份 PRD 用了不同写法,实现层需要做映射转换,但无明文约定转换在哪一层。
**冲突逻辑**:
- AI 需求 2.md:`User_ID`(百炼平台占位符风格)
- 数据需求 PRD.md:`userId`(REST 驼峰)
- 现状(项目):后端 CamelModel 默认对外 camelCase,对百炼 SDK 内部转 `User_ID`
**业务联系**:
- 上游:前端传 `userId` → 后端
- 下游:后端转 `User_ID` 传百炼
**修改影响**:
- 仅文档同步:在 AI 需求 2.md 加注"对外 API 用 userId,百炼 prompt 占位符用 User_ID"
- 工作量**小**
**推荐选项**:
1. **选项 A(改文档明文约定:对外 camelCase / 对百炼 User_ID)**: 优:对齐现状,清晰 / 劣:无
2. **选项 B(统一一边)**: 优:简单 / 劣:违反百炼平台默认占位符规范
**建议判定**: **A 过期-改文档** + 一句理由:现状(后端做映射)是正确的,文档补一段说明即可
**Wave 验证锚点**: 检查 `apps/backend/app/services/ai_*` 是否有 userId → User_ID 的映射转换层
*反馈:选项 A。且同意你的建议。*
---
### P1-10. customer-detail "查看消费记录" 跳 customer-records vs customer-service-records
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/customer-detail/customer-detail.ts`
- `apps/miniprogram/miniprogram/pages/customer-records/customer-records.ts`(2026-03-29 新建,**消费**视角)
- `apps/miniprogram/miniprogram/pages/customer-service-records/customer-service-records.ts`(**服务**视角)
- 02a 矩阵 §3.14、§3.15、§3.16、C8
**业务背景**:
小程序 customer-detail 页底部有两个入口都关联"客户的历史记录":一个跳 customer-records(消费记录,支付/充值视角,2026-03-29 新建),一个跳 customer-service-records(服务记录,助教服务流水视角)。两者数据来源不同:customer-records 是消费支付,customer-service-records 是助教服务时长。问题是:页面文案"查看消费记录"具体跳哪个目前不清晰。
**冲突逻辑**:
- 入口 A:客户消费视角(谁在哪天消费了多少 + 充值)
- 入口 B:客户服务视角(哪个助教服务了几小时 + 收入贡献)
- 文案"消费记录"语义偏 A,但历史代码可能跳 B
**业务联系**:
- 上游:customer-detail 客户档案
- 下游:两条页面流(消费分析 / 服务分析)
**修改影响**:
- 若两入口都保留:UI 加两个按钮,每个文案明确(消费记录 / 服务记录),工作量**小**
- 若合并为一个:删除一个页面 + 重定向,工作量**中**
**推荐选项**:
1. **选项 A(两入口都保留,文案区分)**: 优:语义清晰,两视角并存 / 劣:UI 增加一个按钮
2. **选项 B(合并为一个综合页 with Tab 切换)**: 优:UI 简洁 / 劣:实现成本中
3. **选项 C(保留 customer-records,废弃 customer-service-records)**: 优:消费视角更核心 / 劣:服务视角丢失,助教详情视角无法访问
**建议判定**: **C 待补** + 一句理由:两个页面同时存在但语义不同,Neo 决策保留还是合并
**Wave 验证锚点**: 跑 customer-detail.ts 看当前"查看消费记录"按钮的 navigateTo 路径
*反馈customer-detail页面上我没有找到customer-service-records的跳转入口你再仔细调研这个页面的作用及可能的上游跳转入口。*
---
### P1-11. chat 多入口参数语义(customerId/historyId/coachId)与 loadMessages 仅用 customerId
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/chat/chat.ts`(`loadMessages` 实现)
- 入口 1:`task-detail``chat?customerId=` + chatId
- 入口 2:`chat-history``chat?historyId=` + chatId
- 入口 3:`coach-detail``chat?coachId=` + chatId
- API 契约:`GET /api/xcx/chat/{chatId}/messages`
- 02a 矩阵 C9、§3.19
**业务背景**:
chat 页是 AI 对话页,从 3 个不同入口可以进入(任务详情问话 / 历史对话恢复 / 助教档案问话),每个入口传的 url 参数语义不同(customerId / historyId / coachId)。但 `chat.loadMessages` 当前只读 `customerId`,导致从 chat-history 或 coach-detail 进来的会话无法正常加载历史消息。
**冲突逻辑**:
- 入口语义:3 种(围绕客户对话 / 恢复历史会话 / 围绕助教对话)
- 现状(loadMessages):只用 customerId,不识别 historyId / coachId
- API 契约:`GET /api/xcx/chat/{chatId}/messages` 是按 chatId 查,但前端没有正确区分 chatId 来源
**业务联系**:
- 上游:3 个入口
- 下游:chat 消息列表加载 + AI 流式回复
**修改影响**:
- 前端:loadMessages 增加 historyId / coachId 路由分支,各自对应不同的 chatId 派生逻辑
- 后端:可能需要根据入口给一个 `GET /chat/by-context?customerId|coachId|historyId` 派生 chatId 的接口
- 工作量**中**
**推荐选项**:
1. **选项 A(前端三分支 + 后端补 by-context API)**: 优:语义清晰 / 劣:工作量中
2. **选项 B(统一为 chatId,所有入口先调 API 拿 chatId 再跳)**: 优:协议简单 / 劣:多一次往返
3. **选项 C(只支持 historyId,其他入口废弃)**: 优:简单 / 劣:体验差,问问助手按钮失效
**建议判定**: **C 待补** + 一句理由:多入口路由逻辑由谁实现是产品设计决策,Neo 拍板后开 issue
**Wave 验证锚点**: chat.ts 的 onLoad / loadMessages 当前实现,检查参数读取与 chatId 派生
*反馈chat页面还未集中调试与验收但就这个问题我选择选项 A可以先调通API参数问题。*
---
### P1-12. 散客 memberId 取值约定(<=0?0?-1?NULL?)
**关联页面/接口**:
- `apps/miniprogram/miniprogram/pages/coach-service-records/coach-service-records.ts`(用 `memberId<=0` 判散客)
- 02a 矩阵 C18、§3.18
- 数据表:`dwd.dim_member` / `dws_*` 各表
- 后端契约:相关响应中的 `memberId` 字段
**业务背景**:
台球门店有"散客"概念(没有会员卡的临时客户),系统怎么表示散客没有统一约定。前端 coach-service-records 用 `memberId<=0` 判断散客并 toast"散客无详情可查看",但后端到底是把散客记为 `0` / `-1` / `NULL` / 还是别的特殊值,文档没明文约定。
**冲突逻辑**:
- 前端:`if (memberId <= 0) return scattered`
- 后端 / 数据库:实际可能是 `0``NULL``-1`,需要校验
- 影响:若后端返 `NULL`,前端 `null <= 0``true`,逻辑巧合对;若返其他正数表示散客,前端误判
**业务联系**:
- 上游:ETL 写入 dim_member / 结算单的散客记录
- 下游:小程序详情页"散客无详情"判断、看板统计等多处
**修改影响**:
- 若约定 `memberId IS NULL` 表示散客:前端改为 `!memberId || memberId <= 0`
- 若约定 `memberId = 0`:保持现状
- 若约定 `memberId = -1`:保持现状
- 文档同步 + 部分前端调整,工作量**小**
**推荐选项**:
1. **选项 A(约定 NULL = 散客)**: 优:数据库语义清晰 / 劣:JOIN 时需要 LEFT JOIN
2. **选项 B(约定 0 = 散客)**: 优:整数恒等好判断 / 劣:与"无 ID"语义混淆
3. **选项 C(约定 -1 = 散客)**: 优:清晰可识别 / 劣:负值不符常规
4. **选项 D(保持 <=0 兼容,任何<=0 都是散客)**: 优:零工作 / 劣:无单一真实值
**建议判定**: **C 待补** + 一句理由:Neo 决策散客 ID 取值,然后写到 ETL DWD-DOC 与后端契约
**Wave 验证锚点**: 跑 `SELECT DISTINCT member_id FROM dwd.dwd_settlement_head WHERE member_id <= 0 OR member_id IS NULL LIMIT 20` 看现状
*反馈:先调研 后端 / 数据库:实际可能是 `0` 或 `NULL` 或 `-1`,进行校验。并根据反馈结果再决定Python处理层API层小程序层的约定决定如何处理。*
---
### P1-13. P5.2-prerequisite-fixes.md 文件是否应存在但缺失
**关联页面/接口**:
- `docs/prd/specs/P5.1-mcp-server-ai-extension.md`(自述"批次 B 依赖 P5-A 完成")
- `docs/prd/specs/P5.2-prerequisite-fixes.md`(本调研未找到)
- 01 全景 §八-5
**业务背景**:
P5(AI 应用集成)拆为多批次实施,P5.1 是 MCP Server 扩展,P5.2 是用户原文里提及的"prerequisite-fixes"(P5.1 实施前的前置修复)。但本调研范围内 `docs/prd/specs/` 下只找到 `P5.1`,没找到 `P5.2-prerequisite-fixes.md`
**冲突逻辑**:
- 用户原文:P5.2 标了 prerequisite-fixes,说明 P5.1 有前置问题
- 现状(文件系统):docs/prd/specs/ 下没有 P5.2-prerequisite-fixes.md
- 可能性 1:文件应该存在,但被误删
- 可能性 2:文件本来就没建,只是用户记忆中提过
- 可能性 3:文件路径不在 docs/prd/specs/,在别处
**业务联系**:
- 上游:P5.1 批次 B(MCP Server zqyy_app 扩展)
- 下游:P5.1 实施门槛 / 是否需要先解决前置问题
**修改影响**:
- 若需要补:新增一份 SPEC,工作量**中**(2-4 小时梳理前置问题)
- 若不需要:在 P5.1 中加一行说明"无前置修复",工作量**小**
**推荐选项**:
1. **选项 A(确认 P5.2 应该存在,补一份)**: 优:补齐文档 / 劣:工作量中
2. **选项 B(确认无需 P5.2,在 P5.1 中加注)**: 优:轻量 / 劣:用户记忆与现状不一致需澄清
3. **选项 C(P5.2 在别处,改名指向)**: 优:零新增 / 劣:需先找到原文件
**建议判定**: **C 待补** + 一句理由:文件存在性需要 Neo 确认,然后决定是补还是删除引用
**Wave 验证锚点**: 全仓库搜索 "prerequisite-fixes" 关键词,看是否有同名内容散落他处
*反馈prerequisite-fixes这个文档是做什么的有线索为我介绍么是它么\docs\specs\p4-prerequisite-fixes*
---
> 总计:13 条业务故事卡 / 全部建议判定标完整(2 条 A 过期-改文档 / 0 条 B / 9 条 C 待补 / 2 条 D Bug)
> 信息不足备注:
> - **P1-11 chat 多入口**:需要进一步看 chat.ts 当前 loadMessages 完整实现,以确认建议选项是否可行
> - **P1-13 P5.2 文件**:需要 Neo 直接确认是否记忆有误,本文档无法仅靠搜索定论
---
*额外的需求我发现这个web-admin的dev-trace功能并没有用上一次也没有使用过而且还有占用性能的嫌疑为我调研测试下这个模块日常接口调取和处理时占用的性能消耗。如果过高我打算彻底drop移除掉。地址http://localhost:5173/logs/dev-trace*
---