查看原文
其他

花 4 小时写的 JS 脚本,帮医院省了 40 万澳元

前端大全 2021-02-08

(给前端大全加星标,提升前端技能

英文:Josh Case,翻译:前端大全 / yangholmes

转载请提前联系授权,未经许可转载可能会被平台封号

JavaScript 自动化脚本在医学领域的一次实践

(完整代码,请见正文末尾)


不知道你有没有在 Notepad 上面写过程序,但我真的不推荐这么做。但是,当灵感来临的时候,必须用最容易获取的工具将想法记录下来。

如果你在平常的工作或生活中,对大量的“复制-粘贴”和简单数据录入任务感到厌烦的话,那么你应该需要 自动化 来帮助解决问题。

自动化 指的是一类批量处理乏味重复任务的电脑程序,它可以解放人类的双手去做更多有意义的事情。

最近我就遇到了这种情况,我加入了澳大利亚一家医院的普通外科团队。这个团队专门雇用了 4~6 个初级医生,在大家开始工作之前,花费 60 分钟去手动更新病患清单,每份清单都是根据病患当前的治疗计划和病历记录整理而来。

事实上,为了高级医生更容易消化理解,所有的临床资料都整理成了便携且容易阅读的格式。这些文档被亲切地称为 清单(The List™) 。这是一份脱敏的清单示例:

The List

一旦信息以这种格式整理妥当,就可以得到一份便于阅读的病患情况概览。但是问题在于,整理出 清单(The List™) 是一件特别乏味而且耗时的任务,所有我认识的所有初级医生都很害怕做这项工作。有一个周末,我们需要将 清单(The List™) 列出的 40 个病患最近 24 小时的验血结果录入一个指定的表格中,只有这样才能正式开展我们的工作!我的天啊。

整理清单让工作变得没有乐趣,而且可能会导致医生们产生厌倦。相比起填充电子表格,我知道的大多数临床医生更愿意把时间花在治疗病人上。

不幸的是,在澳大利亚乃至全世界大部分医院,都把数据存放在相互独立的仓库里,没有做整合。结果导致收集不同来源信息并集中处理,成为了一笔巨大的行政开销。

在这种情况下,每个工作日通常会安排 5 个初级医生花费 15 分钟到 1 个小时去准备 清单(The List™) 。打开病人信息系统,拷贝病人详情,在病理系统比对数据,再拷贝出新的信息——简直令人作呕。

为了简单起见,我们假定工作日有 5 个医生每天花费 30 分钟,周末有 1 个医生每天花费 1.5 小时的时间进行数据处理工作。

假设我们需要支付医生加班费(每小时 50 澳元),我们可以计算出每年为这项工作的支出为:

每年支出(澳元) = 50 * (5 * 5 * 0.5 + 2 * 1.5) * 52

总共是 40,300澳元 每年。这可是好大的一笔公共支出。

但这就是所谓的重复性高并且是简单数据录入的工作,我们能不能试着让它自动化呢?

答案是肯定的。

作为一个懒惰、令人讨厌的Y世代译注:即 1981-199 6年之间出生的千禧年世代),在从事这项工作不到一周之后,我坚信一定有更好的解决方法。

一开始我打算和医院的 IT 部门沟通,希望可以允许我部署一套 Python 应用程序来完成这项任务,但是我很快就意识到这将要花费 6 个月的时间发送邮件,他们才会考虑同意让我开始尝试解决眼前的这个问题。

此外,在任何一台电脑上维护一个能够良好运行脚本的 Python 环境都绝对会是令人头疼的问题。所以 Python 的办法看起来行不通。

我突然意识到(补充一下,上午班的时候)根本就不需要IT执行权限来解决这个问题。

我连午饭都不想吃了,马上从一堆软件中启动了我的 *Notepad* ,把灵感都记下来。非常时刻要采取非常措施。

我工作的这家医院在使用一款名为 The Viewer 的应用程序,这款应用程序试图将我上面介绍的相互独立的不同数据仓库整合集中起来,而且是一款基于浏览器的网页应用,异步加载特定患者的(治疗)信息和入院信息。

因为我很在意保护患者的隐私,而且我对避免患者信息数据意外泄露非常偏执,所以我决定不展示 The Viewer 的软件截图了。

打开 The Viewer 软件,首先是一个空白网页,接下来浏览器会向数据仓库发送请求以获取病人的数据——最近的验血情况、最近的扫描结果、最近的门诊预约情况等等。数据仓库返回数据之后,软件将会把数据展示到到这个空白网页里面去。

用任意的浏览器打开任意一个网页,在页面任意位置点击右键打开上下文菜单,点击 检查(Inspect) 打开一个特殊的菜单,在这个菜单中选中 网络(Network) 选项卡,在这个页面里你可以查看当前打开网页的所有网络流量。

例如在网络选项卡中查看 joshcase.dev

Network Tab

对于普通人来说,这个图真的是眼花缭乱。不过还是可以看出一些特征:图片的加载请求如 josh-case.png (放置在网页页脚上的素材)、样式表的加载请求如 main.css (存放网页结构/样式信息的文件)和正文配图 list.png 的文件加载请求。

通过多次刷新页面和探索,我终于发现 The Viewer 软件是通过一个叫 GetCompletedContent 的脚本,从所有信息仓库中获取数据。

更重要的是,当你从网络选项卡中点击特定的网络请求时,你可以查看这个请求发送了那些参数,也就是说,你可以弄清楚服务器需要什么样的数据结构:


network parameters


再一次说明,这个图片不是 The Viewer 的截图,这是MailChimp网站的 joshcase.dev 请求,但你依旧可以看出来服务器期望什么样的查询字符串参数数据结构。

搞清楚这些之后,我就可以开始对 The Viewer 病理API进行逆向工程了,使用JavaScript对服务器进行轮询,查找指定病人的信息。通过研究 GetCompletedContent 我搞清楚了请求的接口和请求参数的数据结构,就可以自动将指定病人的信息拉取回来。

现在我要做的就是,像 GetCompletedContent 那样,向 The Viewer 服务器发送相似的请求:

request

使用JavaScript处理这个问题的精妙之处就在于,它在可以在医院的任何时间任何机器上执行——所有现代浏览器都可以解释并运行JavaScript。

如果你是个新手不相信我说的话,你可以试着在这个页面上的任意一个地方右键并点击 检查(Inspect) ,在弹出的菜单里找到 控制台(Console) 选项卡,拷贝下面一段代码,粘贴到控制台的输入栏里面:

alert("JavaScript will run anywhere.");

接着按下回车键。很厉害对吧?!

在我写完模拟 GetCompletedContent 请求验血结果数据仓库的脚本之后,还有一些实施的细节需要解决(比如解析返回数据并把数据格式化成漂亮可供阅读的表格这些细节)。不过绝大部分数据探测的工作就已经完成了。

这项原本需要 5 个人花费 45 分钟才能完成的工作,现在只需要 1 个人花 10 分钟就搞定了。

在未来 10 年,可能可以帮医院省下400,000澳元!

有没有觉得技术特别了不起呢?

脚本源码:

github.com/joshcase/pathology.js/blob/master/pathology.js

关于英文作者:Josh Case

澳大利亚初级医生和软件开发者。致力于创新、全球健康、重症监护和临床医生编程教学。书籍《Code Blue: An Introduction to Programming for Doctors and Medical Students》的作者。




- EOF -

推荐阅读  点击标题可跳转

1、JavaScript ES12 新特性抢先体验

2、JavaScript 弱依赖项的使用场景

3、你需要了解的几种 JavaScript 异常类型


觉得本文对你有帮助?请分享给更多人

推荐关注「前端大全」,提升前端技能

点赞和在看就是最大的支持❤️

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存