智能自助中医辨证与中成药推荐系统设计与实现
2018-12-07张千方丽华张万义薛莱张浩宇翟兆芹
张千,方丽华,张万义,薛莱,张浩宇,翟兆芹
( 1.中国石油大学(华东)计算机与通信工程学院,山东 青岛266580;2. 中石化胜利石油管理局胜利医院,山东 东营257091)
0 引言
伴随着中国移动互联网技术高速发展,基于移动终端涌现出了种类繁多的移动医疗APP,为百姓提供着便捷及时的医疗资讯和诊疗服务。目前国内的移动医疗App主要面向西医和西药,其中寻医问诊需求,是用户最为直接和迫切的需求。在健康和医疗类信息在互联网上更轻松获得的今天,用户更需要的不仅仅是唾手可得的互联网资讯,更深层次的需求是和医生专家进行直接的沟通和交流[1]。
近年来国家层面不断加码支持中医药行业的发展,特别是随着健康观念变化和医学模式转变,中医药越来越显示出独特优势,时下中医的问诊需求与日俱增。然而国内主流诊断方式多以西医为主,中医资源有限,中医专家的门诊服务供不应求。一些常见病的患者为了避免医院挂号就医难的问题,往往会选择自行到药店购买中成药,由于患者普遍缺乏中医药理论常识,因此购药时会咨询药店,针对病症推荐相应的中成药。而药店往往会存在为牟取利益,歧义引导顾客购买价格偏高药物的现象,且疗效并未达到预期效果,因此造成患者病程延长、药费昂贵且徒增抱怨。
大数据时代的来临,使互联网技术和中医诊疗技术的结合日益紧密,这将进一步促进医药行业线上线下融合。[2]在各项鼓励政策的加持下,传统中医与互联网结合的APP开始涌现,如叮当中医、小鹿医馆、平安好医生国医馆、金华佗、微中医等,市场反应颇为热烈,但目前的APP都是基于线上咨询或发展线上中医馆的模式,并非为用户提供自助便利的辨证购药服务。而中医药项目对于药店来说,是不可或缺的发展业态之一[3]。
针对上述现状及问题,本项目与山东省名中医药专家、全国名老中医药专家学术继承指导老师张万义博士合作,旨在将中医诊疗思想、中医辨证和处方经验进行整合,开发一款便民的“智能自助中医药推荐系统-万义中医APP”,为患者提供常见病的辨证诊断结果及合理的药物推荐方案。形成线上自助诊疗模式。使患者高效低价地享受到专业中医诊疗服务,无需了解中医药理便可以获得科学、高效、实惠的中成药推荐,缓解“看病难,买药贵”的现状。迎合广大民众自主购药的便利需求,探索中医药便民零售的新模式。
1 系统设计
1.1 系统设计分析
智能自助中医辨证与中成药推荐系统-万义中医主要解决时下名老中医就医资源紧缺的情况下,常见病患者自助就医购药的问题。系统涉及到不同使用者的需求,将软件设计的用户分为三种不同的权限:患者、医生、管理员。
患者无需在医院挂号、门诊,只需在万义中医问诊系统上填写常见病症的诊断问卷,即可获得辨证诊疗结果,根据诊疗结果给出合理的药物推荐方案。患者可直接去附近的药房买药,节约了就医时间和药费成本。医生的角色需求是维护病症数据库,对药品、病症、科室、诊断关系等进行增删改查。管理员负责维护整个系统,并对后台流量进行监控。为方便医生对后续常见病症的录入,开发了常见病症录入系统。整个系统后台采用springboot+mybatis +mysql+eazyui的框架结构,构成了一个完整的C/S架构的系统[4]。
1.2 系统架构
本系统总体架构包括服务端和客户端,万义中医APP的开发分为前台开发和后台开发两部分[5]。前台主要用于展示病症、提供问卷和获取用户问卷回答,后台使用Java进行数据处理以及数据库的增删改查。整个软件由APP前端、Java后台、MySQL数据库三部分构成。客户端与服务端根据C/S架构进行设计,客户端只是收集用户的信息,而处理等方面都在后台运行,减小了手机端的负担,从而使用户拥有更加完美的用户体验。采用C/S结构相对更加安全,客户端和后台可以实现异步维护,用户的个人信息安全能够保障[6]。
软件分为用户前端,管理员前端和服务端。用户在APP端选择科室病症,填写问卷,然后缴纳手续费,获取诊断结果。服务端同时为微信小程序和Android APP提供服务。服务端根据用户的请求返回签名后的订单信息,根据用户回答的问卷进行判断返回诊断结果。具体如图1所示。
图1 系统逻辑架构图
1.3 客户端架构设计与实现
1.3.1 逻辑架构
为了方便用户使用,智能自助中医辨证与中成药推荐系统在逻辑架构上分为欢迎页展示、登录、科室分类展示、选择病症、填写问卷、缴纳手续费、获取诊断结果以及反馈评价等功能步骤,用户可以按照APP的引导流程,进行相应的操作,最终实现为患者诊断病情、推荐药物的功能。
系统结构如图2所示:
图2 物理结构图
1.3.2 科室分类展示页设计
万义中医APP中科室分类功能符合用户就医的习惯,同时将杂乱无章的病症排列组合,便于用户快速找到相应的病症。科室分类的数据结构模拟了一个表格,每一个科室对应了一个病情的列表,整体效果图如图3所示:
图3 科室分类展示页
1.3.3 病情问卷页设计
万义中医App的核心功能是诊断病症,需要获取到用户的身体状况信息,因此问卷的设计是重点。病情问卷页如图4所示:
图4 病情问卷页
可以发现,问卷的组成由三个要素,标题、题干和选项。标题的名字就是病情名,题干就是病症的具体病情,选项是具体病情的具体表现。为了获取到用户的输入,对每一个选项确定一个唯一的值,可以把病名+题干+选项的组合作为主键来确定。在数据库中体现为sickdetail表。该表保存了所有的选项,选项通过sd_index聚集在题干下,题干通过ill_name组合成问卷。
题干的列表组成了问卷,问卷的标题即病名可以通过上一个Activity获得。
用户点击了某种病症后,App向服务器发起请求,服务器返回问卷的json数据,App获取数据后进行解析。这里使用谷歌的gson包对Java对象实现json序列化和反序列化。
1.3.4 支付页设计
万义中医APP在通过支付宝的接入申请后,在蚂蚁金服开放平台创建了App,获取了Appid,随即可以开始使用支付宝的支付功能。在用户填写完问卷之后,将弹出一个确认支付手续费的对话框,对话框采用Android原生的AlertDialog实现,在提交按钮上添加监听函数,同时创建AlertDialog。
点击确认后,App弹出支付宝的支付页面。生产环境中手续费为2元,支付页面的效果如下点击确认后,App弹出支付宝的支付页面。支付页面的效果如图5所示:
图5 支付页面
如果用户的手机中没有支付宝,则App会跳转到支付宝H5页面。然后填写支付宝的账号和密码,即可完成本次支付。
支付功能的实现需要开通手机相关权限,这样就完成了前端App的支付环境搭建。在支付页面,需要通过OKHTTP3在服务端获取订单信息。从服务器请求到签名后的订单信息后,由App客户端向支付宝的服务器发起支付请求,如果支付成功,则会跳转进入结果页,如果支付失败,则弹出失败的提示。
前端App订单信息的获取依赖于服务端订单信息的生成,支付宝支付接口采用RSA非对称加密算法,在创建应用后需要配置密钥。密钥包含:
应用公钥:由商户自己生成的RSA公钥(与应用私钥必须匹配),商户需上传应用公钥到支付宝开放平台,以便支付宝使用该公钥验证该交易是否是商户发起的。
应用私钥:由商户自己生成的RSA私钥(与应用公钥必须匹配),商户开发者使用应用私钥对请求字符串进行加签。
支付宝公钥:支付宝的RSA公钥,商户使用该公钥验证该结果是否是支付宝返回的。
需要使用支付宝提供的生成工具,生成公钥和私钥,将公钥上传到支付宝的网站。私钥写在代码中,按照支付宝的订单规则,生成订单信息。然后使用支付宝提供的签名工具对订单信息进行签名,签名中包含了应用私钥和Appid还有pid。签名后的订单信息将发送到App。如果公钥和私钥不匹配的话则验签失败,支付失败。注意私钥必须写在服务端,由服务端提供接口调用,不能直接写在App代码中,否则apk被反编译后,黑客可以窃取私钥,产生安全问题。公钥和私钥可以修改,修改后的公钥必须上传到蚂蚁金服开放平台,私钥必须在相应的代码处修改。
在支付宝的服务器验签成功后,此笔订单为有效订单。用户可以进行支付。
1.3.5 诊断页设计
在用户提交了问卷之后,后台需要对用户的问卷需要进行判断和处理。诊断功能的原理图如图6所示:
图6 诊断原理图
一个病情illness下面有若干个病症sick,每个病症的特点对应了一个选项的集合。用户的选择结果也构成了一个集合。在后台,系统将每个病症的选项集合与用户的选择集合求交集,交集的大小为匹配度u_matchs,将匹配度u_matchs和数据库中recipe表的matchs比较,只要u_matchs>=matchs,即可判断用户的可能病症,并且根据该病症推荐相应的药物。
2 后台功能设计和实现
万义中医App后台提供为整个系统提供了数据支持服务,同时为医生维护数据提供了入口。APP前端采用eazyUI作为前端框架。easyui是一种基于jQuery的用户界面插件集合,为创建现代化,互动,JavaScript应用程序,提供必要的功能。病症录入分为三个步骤,第一步是录入病名和科室;第二步是录入病症;第三步是录入诊断关系和对应药物。医生在录入时需要事先准备相应的数据,经过分析处理得出。
后台系统运行在tomcat服务器上,由于Spring Boot内嵌了tomcat服务器,在部署到生产环境时,需要修改项目的pom.xml文件后,再使用maven的打包功能将项目打包成可以部署在服务器上的war包。同时,在tomcat服务器默认的配置下,<Context>标签没有指定任何内容,项目的静态资源路径会出现问题,相对路径的起始路径为webApps,而不是工程路径,从而报错。需要修改tomcat的server.xml。 <Alias></Alias> 标签把 host 的别名指定为服务器的IP地址,然后在<Context>标签中,将path属性改为空,这样在使用url:http://139.199.159.173:8080/htzx/admin访问的时候,就可以使得静态资源的相对路径正确,也可以添加另外一个<Context>,把path属性改为项目名称,可以起到同样的效果。如果要把url改成更加常见的形式,如wyzy.com/admin,只需要把<Alias>标签的内容改成公司的域名,然后把tomcat的http端口修改成80端口,就可以实现常见形式的访问。
3 总结
本文基于对智能自助中医辨证与中成药推荐系统有充分理解患者就医场景的基础上,设计并实现了一个能够对常见病症在线快速诊疗及药物推荐APP。为验证系统的可靠性与作用,系统开发基本完成后,测试证明了系统的可靠性及高效性。经验证本系统创新了传统的中医诊疗模式,改传统的人工诊疗为线上自动诊疗,并具有用户认证和线上支付的功能,一定程度上解决了中医诊疗“名医诊疗贵,看病排长队”的弊病,大大缩减了中医诊疗所需的费用和时间,提高了诊疗效率。