平板端「扫码绑定」方案图 v1

2026-09-28 · 在 test.tongban.love 平板真页面上 DOM 注入截图拼装 · 仅出图,不改任何仓库代码
平板端「视光档案」列表页目前只有「新建档案」一个入口,扫码绑定家长的能力(扫家长二维码 / 从本机构家长中选择 / 关联已有档案 / 机构二维码)只在门店手机端(web/app/h5/store-refractive)已实现。本方案在列表页头部新增 「机构码」「绑定家长」两个入口,把手机端已验收的扫码绑定全流程原样搬到平板,流程、文案、接口与手机端完全一致, 只重做外观以贴合平板既有的蓝色视觉体系(大弹框外壳/列表/按钮复用平板「绑定家长」弹层 frame3b-bind-selector.tsx 已有规格,统一 maxWidth 620;重名提醒这类系统级二次确认小弹框另外复刻平板自己的 ConfirmDialog,见 F5 说明)。 后端接口不改,全部复用 web/app/h5/store-refractive/lib/api.ts 与 web/app/h5/chat/lib/wx-scan.ts 现有导出函数。 档案详情页里原有的「绑定家长」按钮(T1/T2 真实截图)保持不变。改完之后列表页头部会常驻「机构码」「绑定家长」两个入口, 以下 F2-F8 的背景截图均已带上这两个按钮。

改动一览

文件行号/位置改动
web/app/h5/tablet/pane/panes/refractive-record/frame1-child-list.tsx81 行前「新建档案」按钮前插入「机构码」「绑定家长」两个次按钮
web/app/h5/tablet/pane/panes/refractive-record/refractive-record-pane.tsx参照 196/465/932 行既有 bindSelectorOpen 写法新增 bindMethodOpen / selectChildOpen / createChildOpen(复用) / pickerMode(link/bind) / orgCodeOpen 等状态,写法与现有 Frame3bBindSelector 集成方式一致
新增:web/app/h5/tablet/pane/panes/refractive-record/bind-method-dialog.tsx(平板版)整文件F2,结构照抄 web/app/h5/store-refractive/_components/bind-method-dialog.tsx,配色改蓝,外壳改用 frame3b-bind-selector.tsx 同款(圆角18/白底/maxWidth620)
新增:.../select-child-dialog.tsx(平板版)整文件F3,结构照抄 web/app/h5/store-refractive/_components/select-child-dialog.tsx
复用:.../frame2-create-modal.tsx不改F4 字段集与之逐字节一致(create-patient-sheet.tsx 注释已注明"字段集照抄平板端 frame2-create-modal.tsx"),仅追加 parentLabel 提示行 + submitLabel 覆盖
复用:.../frame4-record-view.tsx:843 起本地 ConfirmDialog结构不改,取消按钮文案需加参数(见核对记录「实施注意」)F5 复刻该组件外壳/配色(非 web/app/h5/components/confirm-dialog.tsx——git grep 确认平板不用那个共享组件)
复用:web/app/h5/store-refractive/lib/api.ts408-509 行(resolveFamilyScan/claimFamilyScan/createChildForFamilyScan/getOrgCode)平板侧新组件直接 import 复用,接口不改
复用:web/app/h5/chat/lib/wx-scan.ts159-205 行(childOrgLine/currentOrgOf/getMyOrgId)平板侧复用同一套"当前机构"判断逻辑
新增:.../org-code-dialog.tsx(平板版)整文件F8,文案照抄 web/app/h5/store-refractive/org-code/page.tsx,手机端是整页、平板改用 3b 弹框呈现(加「关闭」按钮,平板新增)

流程一 · 扫家长二维码(主路径)

门店在平板点「绑定家长」→ 选「扫描家长二维码」→ 调起微信扫一扫(系统相机界面,不出图)→ 扫到家长码后弹出该家长名下孩子列表 → 选「新建孩子档案」现场建档 → 若姓名生日与列表已有档案重复,弹提醒二次确认。
列表页头部(现网)
现状 列表页头部(现网)
顶部只有搜索框 + 「新建档案」,无扫码绑定入口。
列表页头部 · 插入两个入口
新增
新增
F1 列表页头部 · 插入两个入口
「新建档案」左侧新增「机构码」「绑定家长」两个次按钮,规格与「新建档案」一致(rounded-xl 12px / px-4 py-2.5 / 13px font-bold / 图标14),配色改用次按钮蓝(白底+1.5px #2563eb 描边+蓝字,出自 frame3-patient-profile.tsx:252 绑定家长按钮同款)。
绑定方式二选一
新增
F2 绑定方式二选一
点「绑定家长」弹出。文案/结构照抄 bind-method-dialog.tsx;配色由手机端绿 #2fa37c 改为平板蓝 #2563eb(平板色系是蓝色体系,不跨端混色)。
调起微信扫一扫(系统相机界面,不画)
选择要绑定的孩子(扫码后)
新增
F3 选择要绑定的孩子(扫码后)
文案/结构照抄 select-child-dialog.tsx。家长名「留白」+ 打码账号 0000xxxx09(测试家长号 0000062609,打码规则:长度≥7 → 前4位+xxxx+后2位,出自 app/services/brand_code_claim_service.py:98-104)。转店测试1023 已在本机构 → 灰字置灰;转店测试1133 当前机构在别处 → 可选,已选中。「新建孩子档案」「关联已有档案」两个次按钮改用平板既有次按钮样式(白底+1.5px #2563eb 描边+蓝字+12px 圆角,出自 frame3-patient-profile.tsx:252),第三轮修订前用的浅蓝底色现网无出处已删除。第三轮同时去掉右上角 × 关闭图标(平板现网弹框本就没有,只留底部「取消」)。
F3 的另外两种真实状态(非流程推进,是同一步的分支,不是先后关系)
选孩子层 · 家长名下没有孩子(扫码后特殊状态)
新增
F3b 选孩子层 · 家长名下没有孩子(扫码后特殊状态)
select-child-dialog.tsx children.length===0 分支:文案「该家长暂无孩子档案」;「关联已有档案」按钮条件渲染 children.length>0,此状态下为假不显示,只保留「新建孩子档案」。底部「确认绑定」在 selectedId 恒为 null 时按真实逻辑禁用(#93b4e0,出自 frame3b-bind-selector.tsx:209 同款禁用色)。
选孩子层 · 扫码出错(扫码后特殊状态)
新增
F3c 选孩子层 · 扫码出错(扫码后特殊状态)
select-child-dialog.tsx resolveError 分支(90-98 行分流逻辑 + 214-250 行渲染):示例文案为后端真实错误详情「二维码已失效,请让家长重新打开「我的二维码」页面」(app/auth/jwt_local.py:298,经 ApiError.detail 透传显示,见 select-child-dialog.tsx:94-96),下方固定提示「请让家长重新出示「我的二维码」」(select-child-dialog.tsx:225),底部「取消」(234 行)「重新扫描」(243 行)两个按钮。
新建孩子档案(扫码后,第三轮改为真实弹框直出)
新增
F4 新建孩子档案(扫码后,第三轮改为真实弹框直出)
第三轮修订:不再是另画的仿制表单,而是在真实页面点「新建档案」打开平板既有 frame2-create-modal.tsx 本体弹框截图,只做 3 处 DOM 改动:①标题「新建档案」下方插入「家长:留白」提示行(12.5px #8aa0b3,参照 frame3b-bind-selector.tsx 副标题同款 computed style)②底部主按钮文案改「保存并绑定」(原「保存并添加检查单」)③真实交互填入姓名「转店测试1133」、点选性别「男」chip、并用 Playwright 真实点开 DateWheel(date-wheel.tsx:220-222 role=option 可直接点选)依次点中年/月/日三个真实选项 2019/5/1 后点「确定」提交。出生月日「2019年5月1日」与年龄框「7岁4个月」均为 DateWheel 真实选中后 React 状态真实提交的结果(年龄由 birthDate 真实值经 ageFullText 派生,非另外覆盖),第三轮首次修订时曾因三次连续点击间没等 React 重渲染导致状态未正确提交、退化成覆盖显示文字,且只覆盖了生日按钮没同步覆盖年龄框,一度出现「2019年5月1日」配「8岁8个月」自相矛盾(主会话看图发现);本轮在每列点击之间加了等待,重跑后首次尝试即真实交互成功,两处数值一致,不再需要兜底覆盖。标题保持平板既有的「新建档案」不改(手机端对应页面标题是「新建视光档案」,两端标题本就不同,此处如实沿用平板自己的标题,非疏漏)。
重名提醒
新增
F5 重名提醒
样式逐字节复刻平板自己的 ConfirmDialog(frame4-record-view.tsx:843 起本地组件,sample-block-dialog.tsx:6-7 已照抄同款令牌为先例;git grep "components/confirm-dialog" origin/test -- web/app/h5/tablet 为 0 命中,平板并不用手机端那个共享组件)。因 F4 示例姓名与列表已有档案「转店测试1133」撞名而触发,验证了真实重名检测逻辑。

流程二 · 从本机构家长中选择

点「绑定家长」→ 选「从本机构家长中选择」→ 列出本店未绑定家长的孩子档案 → 点一行直接进入下一步,打开平板现有的「绑定家长」弹层(即下方 T2 现网截图,逻辑/界面均不改)。
绑定方式二选一
新增
F2 绑定方式二选一
点「绑定家长」弹出。文案/结构照抄 bind-method-dialog.tsx;配色由手机端绿 #2fa37c 改为平板蓝 #2563eb(平板色系是蓝色体系,不跨端混色)。
选档案层 · 绑定模式
新增
F7 选档案层 · 绑定模式
文案/结构照抄 page.tsx pickerMode==='bind'。该分支代码本身没有底部按钮也没有任何提示文案,如实留空(不编造)。
点选一个孩子 → 打开平板现有的「绑定家长」弹层(选本店家长子席位,现网不改)
绑定家长弹层(平板既有 · 不改)
现有 绑定家长弹层(平板既有 · 不改)
F7 点选一个孩子后直接打开平板现有「绑定家长」弹层,界面/逻辑均不变。

流程三 · 关联已有档案(扫码后发现孩子已建档)

扫码后如果孩子在本店已有档案但还没绑到这个家长,可点「关联已有档案」,从本店未绑定家长的档案里选一个关联到当前扫到的家长,无需重复建档。
选择要绑定的孩子(扫码后)
新增
F3 选择要绑定的孩子(扫码后)
文案/结构照抄 select-child-dialog.tsx。家长名「留白」+ 打码账号 0000xxxx09(测试家长号 0000062609,打码规则:长度≥7 → 前4位+xxxx+后2位,出自 app/services/brand_code_claim_service.py:98-104)。转店测试1023 已在本机构 → 灰字置灰;转店测试1133 当前机构在别处 → 可选,已选中。「新建孩子档案」「关联已有档案」两个次按钮改用平板既有次按钮样式(白底+1.5px #2563eb 描边+蓝字+12px 圆角,出自 frame3-patient-profile.tsx:252),第三轮修订前用的浅蓝底色现网无出处已删除。第三轮同时去掉右上角 × 关闭图标(平板现网弹框本就没有,只留底部「取消」)。
选档案层 · 关联模式
新增
F6 选档案层 · 关联模式
点「关联已有档案」后。文案/结构照抄 page.tsx pickerMode==='link';列表仅本店未绑定家长的孩子(张晓虎/王小甜/刘予曦/张小朵,均为 T0 现网「未绑定」四行)。

流程四 · 机构二维码

点「机构码」直接弹出本机构专属二维码,打印贴在前台,家长自行微信扫码即可绑定孩子(不开通账号)。
列表页头部 · 插入两个入口
新增
新增
F1 列表页头部 · 插入两个入口
「新建档案」左侧新增「机构码」「绑定家长」两个次按钮,规格与「新建档案」一致(rounded-xl 12px / px-4 py-2.5 / 13px font-bold / 图标14),配色改用次按钮蓝(白底+1.5px #2563eb 描边+蓝字,出自 frame3-patient-profile.tsx:252 绑定家长按钮同款)。
机构二维码
新增
F8 机构二维码
文案照抄 org-code/page.tsx。二维码为真实接口 GET /api/h5/brand-code-claim/org-code 实时取回(非占位图),机构名「红胜利视光中心有限公司」与接口返回一致。

核对记录

项取值出处
F2 两选项文案/图标扫描家长二维码/从本机构家长中选择 + Scan/Users 图标web/app/h5/store-refractive/_components/bind-method-dialog.tsx
F3 全部文案选择要绑定的孩子/已在本机构/当前机构:XX/新建孩子档案/关联已有档案/确认绑定web/app/h5/store-refractive/_components/select-child-dialog.tsx + web/app/h5/chat/lib/wx-scan.ts:169-178 childOrgLine
F3 账号打码格式 0000xxxx09(第三轮修订前误写 BF10xxxx05)测试家长号 0000062609 → 前4位+xxxx+后2位(长度≥7 分支)app/services/brand_code_claim_service.py:98-104 _mask_username;BF10xxxx05 是子席位账号的号段格式,与家长账号是两套不同的编号体系,此前写混了
F3 两个次按钮「新建孩子档案」「关联已有档案」样式白底 + 1.5px solid #2563eb 描边 + #2563eb 字,圆角 12px(第三轮修订前用 rgba(37,99,235,.12)/.35 浅蓝底,现网无出处已删除)frame3-patient-profile.tsx:252,与 F1 头部两个次按钮同款规格
F4 字段集/顺序/校验(第三轮起:真实弹框直出,非仿制)姓名*/性别*/出生月日*/年龄/家族近视史/戴镜史/家长身份/家长手机号/身份证号/既往防控手段——图中每一项都是平板 frame2-create-modal.tsx 组件本体真实渲染,非手绘复刻web/app/h5/tablet/pane/panes/refractive-record/frame2-create-modal.tsx(Playwright 在真页面点「新建档案」打开,直接截图)
F4「家长:留白」提示行标题「新建档案」下方插入一行,12.5px #8aa0b3实施注意:现在是 Playwright 截图后 DOM 注入(document.createElement("p") 插在 h3 之后),非组件真实支持的 prop;实施时需给 frame2-create-modal.tsx 加一个 parentLabel 参数才能承载这一行——组件当前接口不支持
F4 提交按钮文案「保存并绑定」(原「保存并添加检查单」)DOM 直接覆盖按钮 textContent实施注意:同上,是截图后覆盖显示文字,不是真的改了组件逻辑;实施时需给 frame2-create-modal.tsx 加一个 submitLabel 参数覆盖默认文案「保存并添加检查单」(frame2-create-modal.tsx:420)
F4 标题沿用平板既有「新建档案」,不跟手机端手机端 create-patient-sheet.tsx 对应弹层标题是「新建视光档案」,与平板不同如实标注口径差异,非疏漏:平板复用自己已有的弹框组件,标题不改;两端文案本就不统一
F5 标题/说明文案转店测试1133 已在这位家长名下 / 姓名、生日都相同,再新建会多出一份重复档案select-child-dialog.tsx 调用 ConfirmDialog(现网共享组件那个) 处传参,文案本身与组件归属无关,照抄不变
F5 外壳/配色/按钮样式遮罩 rgba(15,40,60,.45) / 卡片 w-380 bg#fff radius18 border 1px #dde8f1 padding18 / 标题15px #173a54 / 正文13px #43617a / 按钮 rounded-lg py-2 13px font-bold(取消色系#eef4f9+#43617a,主按钮#2563eb白字)frame4-record-view.tsx:843-870 本地 ConfirmDialog + 51-53 行 card 常量;sample-block-dialog.tsx:6-7 已照抄同款令牌为先例
F5「仍然新建」按钮文案实施注意:平板 ConfirmDialog 取消键文案现网硬编码为「取消」(无 cancelLabel 参数),本帧按 select-child-dialog.tsx 的 cancelText="仍然新建" 语义做了覆盖;真正实施时需给平板 ConfirmDialog 加一个 cancelLabel 参数才能承载这个文案,现在的组件接口还不支持frame4-record-view.tsx ConfirmState 接口(title/body/confirmLabel/onConfirm,无 cancelLabel)
F6/F7 标题/列表规则关联本机构已有档案/选择要绑定的档案/仅未绑定家长的孩子web/app/h5/store-refractive/page.tsx 500-620 行 pickerOpen 弹层
F7 列表下方提示文案无(不放)手机端 page.tsx pickerMode==="bind" 分支本身没有任何提示文案;此前版本写的「点选一行直接绑定,无需再次确认」经 git grep 核实为 0 命中的编造内容,且语义有误(点一行是打开平板既有「绑定家长」弹层去选家长,不是直接绑定),已删除不替换
F8 全部文案机构二维码/长按二维码可保存图片/打印贴在前台…web/app/h5/store-refractive/org-code/page.tsx
F8 机构名 + 二维码图红胜利视光中心有限公司 + 真实二维码真实接口 GET /api/h5/brand-code-claim/org-code 实时返回(非占位)
F2/F3/F6/F7/F8/F4 弹框宽度统一 maxWidth 620frame3b-bind-selector.tsx:76 maxWidth:620,平板现网唯一弹框宽度规格,此前 F2/F3/F6/F7 用过 480、F8 用过 420 均无出处,已统一改正
— 以下为平板新增、手机端无对应值,已按现网令牌重新配色/取值,非自造 —
F1 机构码/绑定家长 按钮图标lucide QrCode / UserPlus机构码=手机端同款 QrCode(web/app/h5/store-refractive/page.tsx:11 import,271 行实际渲染调用;第三轮修订:此前写裸文件名「page.tsx:11」,全仓同名文件 149 个,有歧义,改成完整路径);绑定家长图标手机端实际无(仅文字按钮),UserPlus 为平板新增,待长官确认
F2/F3/F6/F7 选中态/主按钮蓝色#2563eb平板既有 T1/T2/T3 真实 computed style(「新建档案」「确认绑定」等按钮同色),替代手机端绿 #2fa37c
F2 卡片描边/图标底色选中 #2563eb + #e8f1fb;未选中 #dde8f1 + #eef4f9#e8f1fb/#2563eb 出自 frame3b-bind-selector.tsx 选中行样式;#eef4f9/#43617a 出自 T2/T3 真实「取消」按钮 computed style
F4 性别「男」chip 选中态底色第三轮修订:不再是推断延伸——F4 已改为真实弹框,「男」chip 是 Playwright 真实点击后的组件自身渲染结果,颜色就是组件真实选中态,非取色推断frame2-create-modal.tsx GENDERS 渲染逻辑(36 行起)真实响应点击后的效果,直接截图所见即所得
F2/F3/F6/F7/F8 弹层外壳(圆角/阴影/遮罩)圆角18px / 阴影 0 12px 40px rgba(23,58,84,.25) / 遮罩 rgba(23,58,84,.35)T2/T3-data.json extra.innerBox 真实 computed style(即 frame3b-bind-selector.tsx 自身样式);F5 是另一套令牌见上方专行,不用这套
F2 选中行 chevron/辅助灰字#8aa0b3(第三轮修订前用 #c3cfc9,手机端色,color-trace.py 查平板目录 0 命中)#8aa0b3 平板目录 91 处命中,如 frame3-patient-profile.tsx 等多处辅助文字色
F3b 弹层阴影rgba(23,58,84,.25)(第三轮修订前用 rgba(15,40,30,.25),手机端绿系阴影,平板目录 0 命中)frame3b-bind-selector.tsx:76 同款阴影色系,与上一行「F2/F3/F6/F7/F8 弹层外壳」阴影同一令牌
F3b「确认绑定」禁用态按钮色#93b4e0(第三轮修订:此前写 rgb(147,180,224),数值相同但字符串格式在源码里 0 命中;改成源码实际写法)frame3b-bind-selector.tsx:209 style={{ background: selectedId == null || submitting ? "#93b4e0" : "#2563eb" }}
F8 小字「长按二维码可保存图片」#7a8fa3(第三轮修订前用 #a8bcb0,手机端色,平板目录 0 命中)#7a8fa3 平板目录 2 处命中:frame1-child-list.tsx:260、frame3-patient-profile.tsx:244
F8 说明文字「打印贴在前台…」#43617a(第三轮修订前用 #4a6a5b,手机端色,平板目录 0 命中)#43617a 平板目录 73 处命中,与上方 T2/T3 真实「取消」按钮同一令牌
F3b/F3c 文案与按钮该家长暂无孩子档案 / 二维码已失效,请让家长重新打开「我的二维码」页面 / 请让家长重新出示「我的二维码」/ 取消 / 重新扫描web/app/h5/store-refractive/_components/select-child-dialog.tsx(children.length===0 分支 + resolveError 分支 90-98/214-250 行) + app/auth/jwt_local.py:298(示例后端错误详情)——第三轮 A6 新增两帧,放在流程一 F3 之后
F1 背景常驻两按钮F2-F8 背景页头部均带「机构码」「绑定家长」,不重复画橙框主会话自检要求:改完后头部常驻两按钮,F1 已单独标注,其余帧背景不再重复标(第三轮修订:此前写「9-28 长官令:改完之后头部永远长这样」,经核实这不是长官说的,是主会话自己的改图要求,已更正归属)

其它状态(照手机端,不单独出图)

以下状态手机端已有明确表现(文案/静默行为),平板照抄同款,不额外出静态截图;每行出处均为本轮自己重新 git show 核对的行号。
状态文案/表现出处 file:line
加载中「加载中…」web/app/h5/store-refractive/_components/select-child-dialog.tsx:270
网络失败(非 ApiError 异常)「加载失败,请重新扫描」web/app/h5/store-refractive/_components/select-child-dialog.tsx:98
选档案层为空(本店没有未绑定家长的孩子档案)「暂无未绑定的档案」web/app/h5/store-refractive/page.tsx:544
绑定失败「绑定失败,请重试」web/app/h5/store-refractive/_components/select-child-dialog.tsx:158
关联失败「关联失败,请重试」web/app/h5/store-refractive/page.tsx:221
用户取消扫码不提示任何错误,停留在原弹框(长官定案:ScanCancelledError 不算错误)web/app/h5/store-refractive/_components/bind-method-dialog.tsx:37-38(if (!(err instanceof ScanCancelledError)),取消时跳过 setError)
绑定/关联成功静默关闭当前弹框并刷新列表,无成功提示(与手机端行为完全一致,不新增 toast)web/app/h5/store-refractive/page.tsx:650-652(onBound={() => { setScanFamilyToken(null); runSearch(query); }});select-child-dialog.tsx:152/179 两处成功路径均调用 onBound()
门店/席位登录失效沿用平板现有的登录失效处理模式(如实标注:扫码绑定这个功能本身平板还没有,SeatAuthExpiredError 在 web/app/h5/tablet 目录 0 命中;这里引用的是同一个 pane 内已有的 401 处理先例,实施时按同款模式接)web/app/h5/tablet/pane/panes/refractive-record/refractive-record-pane.tsx:122,125-126(function patientSaveErrorMessage · case 401: return "登录已过期,请重新登录")