交付出件箱

← 返回出件箱

两端新首页 · 方案自检 v5

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')区分,不作为本轮拍板项。

二、改后的方案(相对 v4 的变化)

2.1 门店码:一个码,两种人

2.2 设备库(小米之家式)

部分 内容
家长端 「添加设备」:左侧四大类(4L),右侧按品牌分组的产品图卡片 + 搜索;点进产品看大图与介绍 →「绑给哪个孩子」;绑好后首页四格显示该产品
平台后台(电脑端) 维护品牌(名称、logo)、型号(名称、产品图、所属 4L 类、简介、上下架)
素材 产品图、品牌 logo 需品牌方提供或授权 → 待拍板五-5
远期 品牌方自己维护自家产品;扫产品上的品牌码直接跳到该品牌产品
先出效果图 设备库几个页面先出图给长官看,再开工

2.3 同龄排第几:先定功能

三、先做什么(拆 4 包,逐包 test 验收)

包 内容 依赖 能否先上
包 1 扫码绑定 修三处可见性 + 真打测试 → 门店现场新建孩子 → 门店扫家长(家长二维码页、门店扫一扫)→ 家长扫门店码(一码两路) 不依赖登录抽取;多账号选择需批次五配合 ✅ 最先
包 2 设备库 + 打卡 + 提醒 设备库数据与后台页 → 家长添加设备 → 打卡 → 门店汇总与名单 → 智脑内提醒 规则 15 拍板;效果图过目;素材到位 后端可与包 1 并行
包 3 两个首页 会话连续 + 流式可取消 → 两个首页 → 改全部跳转 + nginx + 通知运维改公众号菜单 → 把 4L 四格、提醒、汇总、其余区块挂上首页 登录抽取(批次五或双方约定谁先拆) 等依赖
包 4 同龄排第几 定功能与数据源 → 建库 → 接口 → 挂首页 长官选方案 最后

准备项(不写代码,可同时):长官看批次五对比图;我出设备库效果图 + 首页效果图增量改;我出同龄排名对比;立项写文档。

四、影响什么(在 v4 第四节基础上补充)

五、待长官拍板

  1. 打卡数据门店能看到什么? 建议:谁记了 / 谁没记 + 各类平均数(与效果图一致),看不到单个孩子每天的具体数字——算作规则 15 的一个明确例外
  2. 新家长扫门店码当场开号,算不算这家店开通一个(结算)?
  3. 平板这期做不做? 建议这期不做,门店用手机看;平板下一期
  4. 同意拆 4 包、扫码绑定先上?
  5. 设备库的产品图、品牌 logo 谁来准备?

附录:复核证据(主会话亲跑)

$ 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(长官明确:不打开)」

六、长官 9-24 第四轮拍板(追加)

# 拍板
1 打卡:门店看到的内容与效果图一致(谁记了/谁没记 + 各类平均数)—— 视为规则 15 的明确例外
2 门店码只管绑定档案,不开号、不计开通;开号走原有开通流程(门店开席位 / 品牌码)。没账号的家长扫门店码 → 提示先找门店开通
3 这期只做手机端,平板不做
4 设备库的品牌 logo、产品图:后台做上传,素材以后再传
5 分包方案长官没看懂 → 由我评估决定推进顺序;扫码绑定长官明确要做