【Code with SOLO】我在医院信息科,用 SOLO 给医生造了一座『QR 码桥梁』

【Code with SOLO】我在医院信息科,用 SOLO 给医生造了一座『QR 码桥梁』

:pushpin: 命题:Code with SOLO · MedQR — 让 AI 写好的病历,从手机走进那台不能上网的电脑
:globe_with_meridians: 在线体验:病历 QR 传输系统(MedQR) - 工作小程序
:hammer_and_wrench: 技术栈:TRAE SOLO · 原生 HTML/JS · PWA · MEDQR v1 自研协议
:hospital: 真实场景:医院科室手机 / iPad → USB 扫码枪 → 内网无外网无 USB 工作电脑


① 摘要

我是医院信息科的,业余给医生造工具。

晚上去科室巡查的时候一位年轻医生提出一个建议:他用手机里的AI把杂乱问诊记录整理成完美病历,对着内网电脑发呆10分钟——这台电脑不连外网、禁了USB存储、关了蓝牙。他一直的做法是:「手打」。

三千字,他想徒手打一遍。

于是我沟通下来,用 TRAE SOLO 一周做了 MedQR 病历 QR 传输系统:手机生成 QR 序列 → USB 扫码枪逐张扫 → 内网网页拼回原文 → 一键复制或下载。手打 5 分钟 → 扫码 30 秒,1000 倍提速,零跨网。

一个人 + SOLO,一周业余时间完成。


② 需求确认

人民群众的想法是比较多的,有些可以实现,有些不能,但最多的是可以沟通后实现的。

目前的场景是医院内部电脑不可以联网,也不可以使用U盘,但是有时候,想把外网的纯文本资料,比如微信、豆包等的查询结果输入内部电脑。以前除了手打就没办法了。

医院信息科干了几年,我太清楚这条「最后一公里」长什么样:

内网铁律 现状
不连外网 防火墙 + 安全策略组双层封堵
禁 USB 存储 全员注册表禁用,插上识别但不挂载
禁蓝牙 BIOS 已关,物理拔卡
禁个人云盘 域名级阻断

只剩一条窄缝:USB 扫码枪——医院发药、收银、扫腕带都靠它,HID 模式当键盘用,全院上百把,没人会禁它。

桌面 AI 一年比一年强,内网铁律一年比一年严,中间这条路没人走

于是我决定走一趟的引子。


③ 那把活着的扫码枪

第二天上午经过住院部护士站,我看到一位护士给老太太扫腕带,扫码枪「滴」一声,红光一闪,电脑屏幕上立刻多出一行字。

我在原地愣了几秒。

HID 模式 = 一把「系统认可的合规键盘」。 它是医院花了 5 年堵 USB 口之后,唯一还活着、有人维护、所有医生都会用的输入设备。

链路其实极短:

手机生成 QR 序列 → 屏幕播放 → 扫码枪扫屏 → 解析为按键输入 → 内网网页拼回原文

没有外网、没有存储、没有蓝牙,只有一束红光从手机屏幕跳到内网电脑——单向、可控、不破坏内网安全

我把这条链画给安全策略组的同事看,对方端着保温杯转了一圈,说:

「这没毛病,扫码枪输入跟键盘输入是一回事,本来就不在我们防的范围里。」

OK,开造。


④ 那一周和 SOLO 一起做的事

这是全文重头。我尽量把"和 SOLO 怎么对话"拍出来——它不是代码生成器,更像一个比我冷静的工程师。

4.1 协议层:和 SOLO 吵了一架的 SHA256 字段

第一版我让 SOLO 直接把完整 SHA256(64 字符)塞进每片 QR:

我:“这样每片都能独立校验,最稳。”

SOLO 反过来问:

「每片都塞 64 字符校验,QR 容量被吃掉 1/4,分片数量直接翻倍。原文校验只需要在『全部收齐』那一刻做一次,为什么要每片都背着完整哈希?」

我顶了一句:“那要是中途某一片错了呢?”

它也不让步:

「序号 i 已经能定位丢片,重复扫描自动跳过。原文级校验放在拼接完成后做一次 SHA256,只取前 4 字节就够区分篡改和正确——单帧字段从 96 字节砍到 24 字节。」

来回 3 轮,最终拍板的协议长这样:

MEDQR|v=1|s=<sid>|i=<idx>|n=<total>|h=<sha256>|d=<base64>
  v  协议版本(1)
  s  会话 ID(8 字节随机)
  i  片序号(从 0 开始)
  n  总片数
  h  原文 SHA256 前 4 字节
  d  Base64 编码的分片数据

我承认它对。每片 QR 容量瞬间宽出 30%,扫码识别率明显上去了。

4.2 手机端:让 SOLO 一次搞定 PWA + 离线兜底

需求很硬:医生手机切到飞行模式也能用、不依赖任何外部 CDN。

我跟 SOLO 说:“给我一个能加到主屏幕的 PWA,断网也能渲染 QR。”

它一次性产出了三件套:manifest.json + service-worker.js + 主页 HTML,还主动加了屏幕亮度建议——亮度低于 80% 时弹提示,因为暗屏下扫码识别率会掉到 70% 以下。这条建议我自己测之前根本没想到。

QR 生成库我顺手让它从 CDN 引,被它驳回:

「断网就废了。我把 qrcode-generator 单文件放进 /lib/ 目录,本地兜底。」

加完一行 <script src="lib/qrcode.min.js"> 就齐了,全离线。

4.3 内网端:把整套接收逻辑压进一个 HTML 文件

这一端的约束最硬:

  • 不能 npm install
  • 不能装 Node
  • 不能联网
  • 必须能拷到任意一台医院主任的桌面、双击即开

我跟 SOLO 摊牌:“我宁可不要 React、不要 TypeScript、不要任何框架,也要让这玩意儿单文件交付。”

它把 QR 解码、序列拼接、SHA256 校验、丢片重补、复制 / 下载——全压进一个 index.html,最后大小是 27,521 字节,27 KB,含两份依赖库 inline。

它还主动加了一个让我服气的彩蛋:

进度格 含义
:green_square: 绿格 已收
:white_large_square: 灰格 待补
:yellow_square: 黄闪 重复片(提示扫码枪已扫过)

非工程师的医生一眼看懂——这是 SOLO 自己加的交互,我没要求。

4.4 合规自检:让 SOLO 反过来扮演医院安全策略组

到了交付阶段,我让 SOLO 切换角色:

「现在你是医院信息安全策略组的人,反过来挑这份 HTML 的刺。它能联网吗?能写盘吗?能调外部资源吗?」

SOLO 自检了 4 条 assert:

  1. 无 fetch / XMLHttpRequest — grep 全文确认零外部请求
  2. 无 IndexedDB / localStorage 写入 — 浏览器内存处理,关掉网页清零
  3. 无外部 CDN 依赖 — 所有 JS 库本地 inline
  4. 无 cookie / 会话状态 — 不动浏览器存储

每条它都给我一段定位代码 + 一段反向验证脚本。我把这份自检报告打印出来,附在内部上线申请里——安全策略组那边一次过。

我对 SOLO 最大的好感来自这一节:它不只是写代码,它能扮演评审者把项目反向打一遍。


⑤ 30 秒看完整条流

:bullseye:打开 病历 QR 传输 · 发送端 复制文本到手机,点击生成二维码

:bullseye: 手机调整亮度到最高,展示二维码给扫码枪。如有防偷窥膜需要离近一点且垂直面向扫码枪。

:bullseye: 收集完成并转换为文字

:bullseye: 内网最终成果

整条流走一遍:

  1. 手机打开发送端 → 粘贴 AI 写好的病历文本 → 点「生成二维码」
  2. 屏幕亮度拉满,自动播放 QR 序列(约每秒一帧)
  3. 内网电脑浏览器打开接收端,光标留在输入区
  4. USB 扫码枪对准手机屏幕,挨张扫过去
  5. 实时显示「已收 X / N 片」,绿格 = 已收、灰格 = 待补、黄闪 = 重复片
  6. 全部收齐自动 SHA256 校验 → 完整文本出现 → 「复制全文」或「下载 .txt」
方案 时间
主任原方案:手打抄写 ≈ 5 分钟(三千字病历)
MedQR 扫码传输 ≈ 30 秒

10 倍提速,零跨网,零存盘。


⑥ 医生后来怎么说

第一次试用那天,我守在他旁边。

扫码枪扫完最后一张,他盯着屏幕等了两秒,等到完整文本已经贴在那躺着,他转头跟我说:

「比我想象中安静。扫完那一下我以为还在算,结果文本已经在那躺着了。」

没什么戏剧性,就是这么平淡。

但我们花一周省下来的,是医生的 5 分钟、更是患者的 5 分钟。

:warning: 踩坑实录

上线前我自测一切顺利,第二天第一次就翻车了——他手机的「自动锁屏 30 秒」把 QR 播放序列腰斩。

我加了一条「保持屏幕常亮」的提示,又让 SOLO 在播放期间调用 Wake Lock API 自动锁屏抑制。这种坑只有真实用户能踩出来。


⑦ 写在最后

习大大说过:空谈误国,实干兴邦。我们的重点是做起来,不要怕错,不要所失败。

以前觉得做一个内网工具至少要:立项、申请经费、走采购流程、走 IT 实施流程。

有了 SOLO 之后,我一个信息科的,业余时间就能给主任造一座桥。

不复杂、不张扬,安静地架在那里——让主任晚上 10 点不用再发那条「要不我手打吧」的私信。

这是我理解的「Code with SOLO」:

不是写更花哨的代码,是让真问题更快地有解。


关于我 + 项目入口

链接
详情页(含完整介绍 + 协议规范) hj1982.cn/tools/medqr
手机发送端(PWA) hj1982.cn/tools/medqr-sender/
内网接收端(在线试用 / 单文件下载) hj1982.cn/tools/medqr-receiver/
个人主站 hj1982.cn
同作者姊妹篇 · 亲子赛道 普通父母也能陪孩子学 AI

关于我:医院信息科,业余维护个人站 hj1982.cn。写过亲子向、教育向稿子,这次拿一个工程向作品来交作业。欢迎拍砖。

致谢 TRAE SOLO —— 它不是替我写代码的工具,是和我一起拍板的工程伙伴。


2 个赞

哥们儿不用打三千字了,至少省半小时。QR码那块压缩率有限,病历长的话分段扫,扫枪慢一点但好在不用装驱动。

2 个赞

就是那个二维码压缩的逻辑,试了好几种方案,最后发现用分段编码才能稳定传输,稍微长点就不行,翻了好几个文档才整好。

2 个赞

单个二维码携带最大的文字量是多少? 后续可以考虑超长后,移动端可以切分成多个二维码,并开启自动切换,而PC端可以连续扫描多个二维码,并且完成信息拼接

3 个赞

是的,你考虑得周到。而且我也是考虑了如此实现的。
每个二维码大概300多个汉字,极限可以放600左右,但是属于硬上限了。
以下是文档,其中 i跟n就是你说的。 0/5 之类的

MEDQR|v=1|s=|i=|n=|h=|d=
v 协议版本(1)
s 会话 ID(8 字节随机)
i 片序号(从 0 开始)
n 总片数
h 原文 SHA256 前 4 字节
d Base64 编码的分片数据

2 个赞

目前单QR大概能塞1KB左右,中文是300字

2 个赞

单张大概1400字节左右。你说那个切分的方案挺靠谱的,我后面版本打算加上,自动分片扫描拼接这种事对扫码枪来说应该不难。

2 个赞

v1协议理论能到4k,实际我做了分片,一次拼完,没想搞自动翻页那么复杂。

2 个赞

正在跑压力测试,看几千字病历分拆成二维码到底费不费劲。你说那个自动切换和拼接思路,我周末试试。

4 个赞

标准 QR 码容积也就 3KB 左右。你这个拆分想法挺好,准备下个版本加进去,顺手再做个进度条。对了,扫码枪那个波形声也挺吵的,后续打算加个静默模式。

4 个赞

兄弟你好,我是临床科室的,之前也做了一个这个QRcode的内外网传输系统。扫码器经常有问题,码太大了扫码时间会延长,举着手机会很累,不知道是不是你们扫码枪比较好,我们的码变了之后必须要手动再扫一次才行,你们是怎么解决这个问题的?

5 个赞

忘了有人回了 手动再扫我们也有 后来改成输入框不关直接注册keydown事件 灯亮了扫枪外挂脚本自读一遍

4 个赞

我们用的也是普通扫码枪,码大确实慢,我试过分段二维码,目前还在调试,主要是手机切换生成跟枪的节奏对不上。

3 个赞

我有一个问题,接收端的代码是怎么传输到电脑上的 :rofl: 也是用二维码的形式吗

4 个赞

以前超市有种扫码枪,就用那个扫上去

3 个赞

扫码枪有个模式可以0秒出。

3 个赞

哈?0秒出,那得啥扫码枪

3 个赞

我们科那扫码枪是自己改过的,底座加了放大透镜。普通的确实慢。

3 个赞

扫码枪没那么神,就是普通的霍尼韦尔,主要是我把码做成了动态切片,一张码只放 200 字。

3 个赞

啊这样,我就说扫码枪哪有那么玄乎嘛

3 个赞