2026-09-24 · 接 v4(home-redesign-plan-v4-20260924.md)。自检方法:我自查 + 另派一个只读审查员按 11 个角度挑 v4 的毛病,审查员的前 4 条高危结论我逐条复核了代码(见附录)。只读,零代码改动。
| # | 长官原话 | 落地 |
|---|---|---|
| 1 | 没绑设备的孩子可以不算未记录 | 门店统计范围 = 本店可见 ∩ 至少绑 1 台 4L 设备 |
| 2 | 没账号家长上哪扫门店码,感觉有问题 | 我问歪了:微信自带扫一扫就能扫柜台上的码,不需要先有账号。改为「一个门店码接两种人」,见 2.1 |
| 3 | 设备库做成小米之家那样,让家长选,要高级 | 设备库本期就做(v4 当成"远期"是低估),见 2.2 |
| 4 | 同龄排第几先定功能怎么做,可能不用 5411 条或加其他数据 | 单独一条线,先出功能与数据源对比,见 2.3 |
| # | 问题 | 后果 | 处置 |
|---|---|---|---|
| 1 🔴 | 家长列表也有同一个 AND 问题:refractive_record_service.py:190 与 :201 两次 .where();家长端列表 parent_patients.py:236 走这里 |
绑定后家长首页孩子列表直接空 | 两道门扩为三处(门店可见门 / 家长详情 / 家长列表),同一判据同一套测试 |
| 2 🔴 | 一个微信可对应多个家长席位(user.py:94 seat_bound_unionid 注释"非 UNIQUE 允许同人多席位");主登录 seat_auth.py:510 调 lookup_seat_username_by_wx 不带 return_all,多于 1 个就返 None → 退回手输账号 |
家长多扫一个码就可能登不进(记不住 10 位账号) | ① 门店码对老家长不开新号(2.1)② 主登录命中多个时弹选择(复用重置密码那条 :814 return_all=True 候选结构)——属登录层,并入批次五,需跟那边对齐 |
| 3 🔴 | 品牌码认人只在同一机构内找(brand_code_service.py:58 _find_existing_family_seat 限 linked_org_id == brand_org_id),找不到就新建席位 + 记开通 |
v4 写"门店码参照品牌码"= 老家长扫门店码会被开第二个号并计费 | 门店码与品牌码分成两种码,2.1 |
| 4 🔴 | 规则 14「机构现场新建孩子 + 绑定一步」后端 0 实现(brand_code_claim.py 只有 4 端点,claim 要求孩子已在名单);照现有 create_patient 写法建出来门店自己都看不到 |
v4 把它放在"前端要做",漏了后端 | 单列后端任务,并明确新孩子 org_id 填谁(建议填本门店,同时写 service_org_id) |
| 5 🔴 | 从新首页跳进对话会丢会话:chat/page.tsx:1226 currentSessionId 只在内存;主聊天流 :2079 fetch 无 signal,无 AbortController |
首页拆出去后,每次点进对话都开新会话;聊一半离开回复丢失 | 列为首页上线前置(会话号进 URL 或自动续最近会话 + 流式可取消) |
| 6 🔴 | 设备库要"小米之家那样",v4 只排了"手工简表" | 工作量低估 | 2.2 重排:设备库数据 + 后台维护页 + 家长选购页 + 素材 |
| 7 🟠 | 规则 15(9-15 长官明确"不打开"):家长自录数据不对机构开放。门店看打卡汇总与之冲突 | 若规则 15 覆盖打卡,件 B 要收窄 | 待拍板(五-1) |
| 8 🟠 | 平板是门店柜台常用设备,tablet/page.tsx:7 独立实现 |
"本期不动平板"= 用平板的门店看不到汇总和提醒 | 待拍板(五-3) |
| 9 🟠 | 家里孩子挂在不同账号下时,家长首页只显示当前账号的孩子 | 家长以为孩子丢了 | 2.1 减少多账号产生;首页在多账号时显示"切换账号" |
| 10 🟠 | 登录改造(批次五)无时间表,v4 把所有页面挂在它后面 | 全部前端空转 | 拆包:扫码绑定这包不依赖登录抽取,先上(第三节) |
| 11 🟡 | 攒成一个大包发生产 | 出问题难定位、难回滚 | 拆 4 包,逐包 test 验收 |
| 12 🟡 | test 当前 3 个迁移头(34ec94466f0c / phase79_001 / phase83_001,审查员图遍历结果,我未复核);生产单头 phase48a_002 |
新表迁移上 test 要多一次合并;接在 phase83_001 之后则发生产要等 #730-#733 |
扫码绑定包尽量不建表(门店码用签名令牌,见 2.1),可独立发生产 |
| 13 🟡 | 改 chat/page.tsx、middleware.py 触发 chat-e2e 证据守门(scripts/verify-trigger-files.txt) |
每次提交多跑一轮全流程 | 排期计入;首页壳搬迁尽量少碰对话本体 |
| 14 🟡 | 红光仪等在国内可能按医疗器械管理(我没核实具体分类) | 设备库写疗效有合规风险 | 设备库只写产品信息,不写疗效、不写推荐 |
| 15 🟡 | 门店"提醒"无频率限制 | 家长被刷屏 | 同一孩子每天最多提醒一次 |
| 16 🟡 | 本项目还没走立项流程(Phase 编号、spec/tech/impl) | 违反项目规矩 | 拍板完先立项:扫码绑定续 Phase 48B、设备库续 48C,首页与打卡新立项 |
审查员建议中不采纳的一条:它建议门店汇总排除「org_id 是本店但 service_org_id 为空」的孩子来挡品牌方视角——这会把门店自己建档的孩子全排除掉(门店自建孩子 service_org_id 本来就是空)。品牌方视角问题改为在 tech 阶段按家长席位来源(seat_source='brand_code')区分,不作为本轮拍板项。
wx_jssdk.py 已有签名接口,jsApiList 加 scanQRCode)| 部分 | 内容 |
|---|---|
| 家长端 | 「添加设备」:左侧四大类(4L),右侧按品牌分组的产品图卡片 + 搜索;点进产品看大图与介绍 →「绑给哪个孩子」;绑好后首页四格显示该产品 |
| 平台后台(电脑端) | 维护品牌(名称、logo)、型号(名称、产品图、所属 4L 类、简介、上下架) |
| 素材 | 产品图、品牌 logo 需品牌方提供或授权 → 待拍板五-5 |
| 远期 | 品牌方自己维护自家产品;扫产品上的品牌码直接跳到该品牌产品 |
| 先出效果图 | 设备库几个页面先出图给长官看,再开工 |
axial-length-percentile-feasibility-20260915.md 已列过候选:JAMA 全球曲线 / 已发表的中国儿童眼轴百分位曲线(如武汉学龄儿童 Sci Rep s41598-022-08907-5)/ 自有门诊数据PeerAxialBlock 组件、enable_peer_axial_compare 开关| 包 | 内容 | 依赖 | 能否先上 |
|---|---|---|---|
| 包 1 扫码绑定 | 修三处可见性 + 真打测试 → 门店现场新建孩子 → 门店扫家长(家长二维码页、门店扫一扫)→ 家长扫门店码(一码两路) | 不依赖登录抽取;多账号选择需批次五配合 | ✅ 最先 |
| 包 2 设备库 + 打卡 + 提醒 | 设备库数据与后台页 → 家长添加设备 → 打卡 → 门店汇总与名单 → 智脑内提醒 | 规则 15 拍板;效果图过目;素材到位 | 后端可与包 1 并行 |
| 包 3 两个首页 | 会话连续 + 流式可取消 → 两个首页 → 改全部跳转 + nginx + 通知运维改公众号菜单 → 把 4L 四格、提醒、汇总、其余区块挂上首页 | 登录抽取(批次五或双方约定谁先拆) | 等依赖 |
| 包 4 同龄排第几 | 定功能与数据源 → 建库 → 接口 → 挂首页 | 长官选方案 | 最后 |
准备项(不写代码,可同时):长官看批次五对比图;我出设备库效果图 + 首页效果图增量改;我出同龄排名对比;立项写文档。
$ sed -n '188,202p' app/services/refractive_record_service.py | grep -n where
3: stmt = select(Patient).where(or_(_org_visibility_clause(org_id), Patient.is_sample.is_(True)))
14: stmt = stmt.where(or_(own_clause, Patient.is_sample.is_(True)))
$ grep -n seat_bound_unionid app/models/user.py → 94: …(注释「非 UNIQUE 允许同人多席位」)
$ grep -n "return_all" app/services/seat_service.py → 602: return_all: bool = False
$ grep -n lookup_seat_username_by_wx app/api/seat_auth.py
510: seat_username = await lookup_seat_username_by_wx(unionid, openid, db) # 主登录·不带 return_all
814: candidates = await lookup_seat_username_by_wx( # 重置密码·带 return_all
$ awk '/async def _find_existing_family_seat/,/^async def _provision/' app/services/brand_code_service.py | grep -n linked_org_id
16: User.linked_org_id == brand_org_id,
规则 15 原文:brand-partner-spec-v1-20260915.md:63「机构只能看到机构自己录入的检查记录,家长自己录入的数据不对机构开放 | 9-15(长官明确:不打开)」
| # | 拍板 |
|---|---|
| 1 | 打卡:门店看到的内容与效果图一致(谁记了/谁没记 + 各类平均数)—— 视为规则 15 的明确例外 |
| 2 | 门店码只管绑定档案,不开号、不计开通;开号走原有开通流程(门店开席位 / 品牌码)。没账号的家长扫门店码 → 提示先找门店开通 |
| 3 | 这期只做手机端,平板不做 |
| 4 | 设备库的品牌 logo、产品图:后台做上传,素材以后再传 |
| 5 | 分包方案长官没看懂 → 由我评估决定推进顺序;扫码绑定长官明确要做 |