交付出件箱

← 返回出件箱

平板端扫码绑定 · 方案(48B.8)

2026-09-28 · 长官令「平板需要加,平板也是在微信里打开的,出方案出图,必须要做」
本件只是方案,代码一行没动。
方案图:https://dev-tokyo.tail3912a6.ts.net/scan-binding-tablet-v1-20260928.html

一句话

平板「视光档案」列表顶上加两个按钮:「机构码」「绑定家长」。功能、流程、文案和手机端一模一样,只是外观换成平板自己那套(蓝色、大弹框)。后端一个接口都不用加。

做完以后店员在平板上怎么用

  1. 打开平板「视光档案」,搜索框右边多了两个按钮:机构码、绑定家长(「新建档案」还在最右边)
  2. 点 绑定家长 → 弹出两个选项(和手机一样):
  3. 扫描家长二维码 → 微信相机扫家长手机上的「我的二维码」→ 看到这位家长名下的孩子 → 选一个 → 绑到本店
  4. 从本机构家长中选择 → 先选孩子,再弹出平板原来那个「绑定家长」框(原样不改)
  5. 点 机构码 → 弹出本店的二维码。家长可以直接拿手机对着平板扫;也可以长按保存,打印贴在前台
  6. 孩子档案页里原来那个「绑定家长」按钮不动

为什么这么放

✅ 9-28 晚长官定:平板「绑定家长」按钮加小人图标(与同排「机构码」二维码图标、「新建档案」+ 图标一致;方案图现版即带图标)。

请长官定 / 回一句(2 件)

  1. 看方案图:两个按钮的位置、几个弹框的样子行不行
  2. ~~店里的平板是 iPad 还是安卓?~~ 9-28 长官答:两种都有。还请您用 iPhone 试一次:先进首页再点「视光档案」→「绑定家长」→「扫描家长二维码」,相机能不能打开?
  3. 为什么问:微信在苹果设备上有个老规矩,页面是「点进来」的(不是直接打开的),调微信扫一扫可能会失败。平板视光档案和手机门店端都是点进来的
  4. 如果 iPhone 上能打开相机 → 说明没这问题,照常做
  5. 如果打不开 → 我会顺手在共用的扫码工具里加上苹果设备的处理(手机、平板一起受益)

发生产会多一个

平板这件做完是一个新的 MR。它用到的接口和页面生产上还没有,所以只能跟扫码绑定这批一起发。发生产清单会从 6 个变成 7 个:757 + 758 + 759 + 761 + 768 + 773 + 平板这个。

还是按您的令:先不发生产。


技术附录(给实施和交接看)

现状(已核实 · origin/test)

改动范围

位置 改什么
frame1-child-list.tsx:81 前 插「机构码」「绑定家长」两个次按钮(白底 + 1.5px #2563eb 描边 + 蓝字,尺寸同「新建档案」);新增两个回调 prop
refractive-record-pane.tsx 新增弹框状态(绑定方式 / 选孩子 / 选档案层 bind·link / 机构码);绑定成功后重拉列表
平板新增弹框组件(放 refractive-record/ 目录) 绑定方式、选孩子、选档案层、机构码,外壳全部照 3b(宽 620,平板现网唯一弹框宽度);不加右上角「×」(平板现网弹框都没有,frame3b-bind-selector.tsx:13 只引 Search),每个弹框底部都有「取消 / 关闭」
扫码后新建孩子 复用平板现有 frame2-create-modal.tsx,只加两个参数:标题下一行「家长:XX」、主按钮文案「保存并绑定」;标题沿用平板的「新建档案」(手机端叫「新建视光档案」,平板沿用平板自己的叫法)
各种状态 全部照手机端 select-child-dialog.tsx:家长名下没孩子「该家长暂无孩子档案」、扫码出错(二维码无效/已失效 +「取消」「重新扫描」)、加载中、网络失败、选档案层为空「暂无未绑定的档案」、绑定/关联失败;用户取消扫码不提示;绑定成功静默关闭并刷新列表、无成功提示(与手机端一致)
重名提醒 用平板自己的确认框样式(frame4-record-view.tsx:843 起的本地 ConfirmDialog,蓝色系),不用手机端共用的 h5/components/confirm-dialog.tsx(绿色系,平板 0 处引用)。⚠️ 该确认框取消键文案写死「取消」,实施时要加文案参数以显示「仍然新建」
复用不改 接口函数取自 store-refractive/lib/api.ts(resolveFamilyScan / claimFamilyScan / createChildForFamilyScan / linkChildForFamilyScan / getOrgCode);扫码与纯函数取自 chat/lib/wx-scan.ts(scanQrCode / childOrgLine / currentOrgOf);「从本机构家长中选择」后一步沿用平板现有 listBindableSeats / bindPatientSeat + 3b 弹层
机构码弹框小字 用视光档案蓝灰:说明 #43617a、小字 #7a8fa3(出自 frame4-record-view.tsx:843 起的确认框正文色、frame3-patient-profile.tsx:243;方案图已按此改好)
不动 手机端全部组件(已真机验过);后端 0 改动;档案页「绑定家长」
第二轮自检补充 见下方「第二轮自检」5 条:扫码带上语音权限(wx-scan.ts)、平板确认框导出并加取消文案参数、扫码建档新写提交函数、列表入口绑定新写确认函数、表头搜索框防挤压

为什么平板自己写界面、不直接复用手机弹框:手机弹框宽 328、绿色系,搬到平板既窄又串色;给手机组件加「平板模式」开关会动到已验收的手机代码。所以只复用接口和逻辑函数,界面按平板令牌单独写。代价是两套界面各一份,属于有意取舍。

风险

第二轮自检(9-28 晚 · 逻辑与功能,对照 origin/test 代码逐条核实)

确认没问题的(有代码依据)

查什么 结论 依据
平板登录的账号能不能调扫码绑定接口 能。接口只拒家长号;test 上家长号在平板登录那一步就被拦了 app/auth/middleware.py:411-422 require_store_seat 只拒 seat_type=="parent";origin/test seat_auth.py:251-270 scene=tablet 只认门店号
扫码认领别家店的孩子后,平板列表里能不能看到 能。平板和手机列表是同一个后端查询,认领写的 service_org_id 会被识别 平板 searchPatients → GET /api/h5/refractive-records/patients → refractive_record_service.py:223-226 用 _org_visibility_clause;认领写 brand_code_claim_service.py:208
平板新建档案表单的字段,扫码建档接口收不收 全收。平板 10 个字段都在接口的 PatientCreateIn 里,3 个必填平板都有 frame2-create-modal.tsx:247-258 vs app/schemas/refractive_record.py:180-209
机构码在平板上能不能长按保存 能。手机端用后端出的 <img>,不是 SVG;平板照抄同一写法 store-refractive/org-code/page.tsx:6-7,116-121
绑定成功后「静默关闭 + 刷新列表、无提示」是否和手机一致 一致(扫码三条路径) 手机 page.tsx:649-652 onBound = 关弹框 + runSearch

方案原文没写到、实施时必须处理的(5 条)

  1. 🔴 扫码会把平板聊天的「微信语音」弄坏。平板聊天页常驻,不随菜单切换卸载(origin/test pane/page.tsx:180-190)。一进平板,它就用语音接口 config 一次微信(use-tablet-wechat-voice.ts:80),而且只 config 这一次。扫码时 config 的接口清单只有 scanQRCode,会把语音权限覆盖掉,之后回聊天用语音就失败,要刷新才恢复。→ 处理:wx-scan.ts 扫码 config 的接口清单里一并带上 checkJsApi + WECHAT_VOICE_APIS(同目录 chat/lib/wechat-voice.ts 已导出),扫码后语音权限还在。改的是手机、平板共用的扫码工具,只是清单变多,不改流程。
  2. 🟡 重名提醒用的平板确认框目前是私有的:frame4-record-view.tsx:843 的 ConfirmDialog 没有 export,取消键文案写死「取消」。→ 处理:加 export,加一个可选的取消文案参数(默认「取消」,老调用方零改动)。
  3. 🟡 扫码建档要单独写提交函数。新建弹框本身不调接口,靠 onSubmit 回调(frame2-create-modal.tsx:243-259),所以弹框确实只加两个参数就够。但现有的提交函数 onCreatePatientFrame2(refractive-record-pane.tsx:383-401)建完会跳进档案详情页,不能直接拿来用。→ 处理:新写一个提交函数,调 createChildForFamilyScan,完成后静默关闭并刷新列表,另外处理重名提醒。
  4. 🟡 列表页入口的「从本机构家长中选择」要单独写确认函数。平板现有的确认绑定(refractive-record-pane.tsx:479-503)依赖「当前打开的档案」activePatient,只更新详情页。→ 处理:3b 弹框界面原样复用,另写一个列表用的确认函数,绑定对象取「选档案层」选中的孩子,成功后刷新列表,行上的「已绑定/未绑定」要变。选档案层只列本店未绑定家长的档案,和手机一致(手机 page.tsx:542,549 .filter(p => !p.bound_seat))。
  5. 🟡 表头一行挤了 4 样东西,没有防挤压兜底。表头(frame1-child-list.tsx:65)没有换行兜底,搜索框(:66)没有 min-w-0。左菜单手动展开(240px)加竖屏时,搜索框会被挤得很窄。→ 处理:搜索框加 min-w-0;验收时量两种宽度:横屏 1024 收起菜单、竖屏 768 展开菜单。

不需要改的:后端 0 改动的结论不变;手机端组件不动的结论不变。第 1 条改的是共用扫码工具,手机端要回归一次(iPhone 扫家长码一次)。

验收(做完后)