灵医智惠CDSS标准版C/S SDK开发指南v1——HIS/EMR系统¶
SDK初始化¶
客户端安装¶
在医生电脑上,下载灵医智惠CDSS程序01cdss.exe
,按照提示安装即可。
动态库引用¶
在HIS/EMR等医疗信息系统代码中引入01cdss.dll
动态库,以csharp为例,引入动态库代码如下:
[DllImport("01cdss.dll", EntryPoint = "OpenCDSSByPath",
CallingConvention = CallingConvention.Cdecl)]
public static extern void OpenCDSSByPath(string cdssPath);
[DllImport("01cdss.dll", EntryPoint = "SetReceiveHandle",
CallingConvention = CallingConvention.Cdecl)]
public static extern void SetReceiveHandle(string systemType, int handleNum);
[DllImport("01cdss.dll", EntryPoint = "SetSecurityKeys",
CallingConvention = CallingConvention.Cdecl)]
public static extern void SetSecurityKeys(string ak, string sk);
[DllImport("01cdss.dll", EntryPoint = "UserLogin",
CallingConvention = CallingConvention.Cdecl)]
public static extern void UserLogin(string userInfo);
[DllImport("01cdss.dll", EntryPoint = "SendMessageToCDSS",
CallingConvention = CallingConvention.Cdecl)]
public static extern int SendMessageToCDSS(string message, int handleNum, int trigger);
[DllImport("01cdss.dll", EntryPoint = "BroadcastMessageToCDSS",
CallingConvention = CallingConvention.Cdecl)]
public static extern void BroadcastMessageToCDSS(string msg, int handleNum);
[DllImport("01cdss.dll", EntryPoint = "CloseCDSS",
CallingConvention = CallingConvention.Cdecl)]
public static extern void CloseCDSS();
开启CDSS程序¶
HIS/EMR等信息系统程序启动后,可调用DLL的OpenCDSSByPath(string cdssPath)
方法打开CDSS程序,不使用此方法也可设置CDSS程序开机启动;
注册¶
// systemType: 信息系统类型
// | HIS | 医生工作站(医嘱) |
// | EMR | 电子病历系统 |
// | LIS | 检查系统 |
// | RIS | 检验系统 |
// | OAMS | 手术系统 |
// handleNum: 窗口句柄号
SetReceiveHandle(string systemType, int handleNum);
// ak和sk请联系灵医智惠CDSS技术人员提供
SetSecurityKeys(string ak, string sk);
HIS/EMR等信息系统程序启动后:
* 1)调用DLL提供的SetReceiveHandle(string systemType, int handleNum)
方法注册程序信息,用于告知接收Windows消息(医嘱回填数据)的窗体,若接受回传数据的界面在同一个窗体内,则只需要注册一次即可。
* 2)调用DLL提供的SetSecurityKeys(string ak, string sk)
方法注册密钥信息,ak和sk请联系灵医智惠CDSS技术人员提供。
用户登录¶
// userInfo: 用户信息,值为JSON字符串,用户包括医生/护士/药师等
// {
// "name": "医生/护士/药师姓名",
// "id": "医生/护士/药师ID",
// "department": "科室",
// "hospital": "医院名称"
// }
UserLogin(string userInfo);
当用户登录HIS系统时,调用DLL提供的UserLogin(string userInfo)
方法注册用户基本信息。
SDK接口定义¶
灵医智惠CDSS支持多种触发方式,见下方表格:
trigger取值 | 触发类型 | 触发交互逻辑 | 是否可选 |
---|---|---|---|
0 | 人工手动触发 | 点击新增的CDSS按钮 | 必选 |
11 | 后台自动触发 | 打开医嘱/病历 | 必选 |
12 | 后台自动触发 | 关闭医嘱/病历 | 必选 |
13 | 后台自动触发 | 保存医嘱/病历 | 必选 |
14 | 后台自动触发 | 提交医嘱/病历 | 必选 |
20 | 后台自动触发 | 智能问诊 | 必选 |
新增按钮手动触发¶
// message: 患者数据,必须符合《患者数据规范》
// handleNum: 窗口句柄号
// trigger=0: 触发方式为按钮手动触发
string message = "{\"xx\":\"xx\"}";
SendMessageToCDSS(message, handleNum, 0);
当医生编辑病历过程中,点击新增的按钮手动触发,将当前病历数据按规定的Json格式通过异步接口发送给CDSS程序。新增按钮的样式与文案由医院、HIS厂商、灵医智惠三方共同讨论确定。
打开病历文档时自动触发¶
// message: 患者数据,必须符合《患者数据规范》
// handleNum: 窗口句柄号
// trigger=11: 触发方式为打开病历文档时自动触发
string message = "{\"xx\":\"xx\"}";
SendMessageToCDSS(message, handleNum, 11);
当医生**打开一份病历时后台自动触发**,将当前病历数据按规定的Json格式通过异步接口发送给CDSS程序。 触发条件包括:1) 打开新的病历文档窗口或选项卡,2) 切换到已经存在的病历文档窗口或选项卡。
关闭病历文档时自动触发¶
// message: 空字符串
// handleNum: 窗口句柄号
// trigger=12: 触发方式为关闭病历文档时自动触发
SendMessageToCDSS("", handleNum, 12);
当医生**关闭病历窗口时后台自动触发**,通过异步接口发送给CDSS程序。切换到已经存在的病历文档窗口或选项卡时,先执行trigger=12告知当前窗口或选项卡已关闭,再执行trigger=11发送新窗口或选项卡中的病历内容。
保存病历文档时自动触发¶
// message: 患者数据,必须符合《患者数据规范》
// handleNum: 窗口句柄号
// trigger=13: 触发方式为保存病历文档时自动触发
string message = "{\"xx\":\"xx\"}";
SendMessageToCDSS(message, handleNum, 13);
当医生完成病历编辑后,点击保存按钮时后台自动触发,将当前病历数据按规定的Json格式通过异步接口发送给CDSS程序。
提交病历文档时自动触发¶
// message: 患者数据,必须符合《患者数据规范》
// handleNum: 窗口句柄号
// trigger=14: 触发方式为提交病历文档时自动触发
string message = "{\"xx\":\"xx\"}";
SendMessageToCDSS(message, handleNum, 14);
当医生完成病历编辑后,点击提交按钮时后台自动触发,将当前病历数据按规定的Json格式通过异步接口发送给CDSS程序。
打开智能问诊页面¶
// message: 患者与医生信息
// handleNum: 窗口句柄号
// trigger=20: 打开智能问诊页面
string message = "{\"姓名\":\"xx\",\"性别\":\"xx\",\"年龄\":\"xx\",\"医生\":\"xx\",\"科室\":\"xx\",\"医院\":\"xx\"}";
SendMessageToCDSS(message, handleNum, 20);
点击智能问诊按钮时触发,将患者信息与医生信息按照规定的Json格式通过异步接口发送给CDSS程序。
关闭CDSS程序¶
当用户关闭HIS/EMR系统时,调用DLL提供的CloseCDSS()
方法关闭CDSS程序,如设置开机启动,不需调用此方法。
点击CDSS悬浮图标手动触发与回填信息¶
1)当医生**点击灵医智惠CDSS程序的悬浮窗时**,灵医智惠CDSS程序会主动给HIS/EMR程序发送windows消息,请求最新的病历数据。
2)当医生**勾选灵医智惠CDSS程序推荐的病例模板、诊断结果、治疗方案结果时**,灵医智惠CDSS程序会主动给HIS/EMR程序发送windows消息,将病例、诊断和治疗方案发送给HIS/EMR程序,HIS/EMR程序可以完成回填操作。
private static int WMA_InterPro = 0x004A;
public struct CopyData
{
public IntPtr dwData;
public int cbData;
[MarshalAs(UnmanagedType.LPStr)]
public string lpData;
}
protected override void DefWndProc(ref System.Windows.Forms.Message m)
{
if (m.Msg == WMA_InterPro) {
string msg = ((CopyData)Marshal.PtrToStructure(m.LParam, typeof(CopyData))).lpData;
JObject jo = (JObject)JsonConvert.DeserializeObject(msg);
// type=CDSS/诊断/药物/手术/检验/检查
string type = jo.ContainsKey("type") ? jo["type"].ToString() : "";
// updateType=add/delete, add表示新增,delete表示删除
string updateType = jo.ContainsKey("updateType") ? jo["updateType"].ToString() : "";
// 回填项目名称
string name = jo.ContainsKey("name")? jo["name"].ToString():"";
// 回填项目编码
string hospitalCode = jo.ContainsKey("hospitalCode")? jo["hospitalCode"].ToString():"";
// 回填智能问诊病历信息
string data = jo.ContainsKey("data") ? jo["data"].ToString() : "";
if ("CDSS".Equals(type)) {
// 当type="CDSS"时,将最新的病历数据广播给CDSS程序
// message: 患者数据,符合规定格式的JSON字符串
// handleNum: 窗口句柄号
BroadcastMessageToCDSS(message, handleNum);
} else if ("诊断".Equals(type)) {
// 回填诊断,诊断名称:name, 诊断编码:hospitalCode, 更新类型:updateType(add为新增, delete为删除)
} else if ("药物".Equals(type)) {
// 回填医嘱用药,药物名称:name, 药物编码:hospitalCode, 更新类型:updateType(add为新增, delete为删除)
} else if ("手术".Equals(type)) {
// 回填医嘱手术,手术名称:name, 手术编码:hospitalCode, 更新类型:updateType(add为新增, delete为删除)
} else if ("检验".Equals(type)) {
// 回填检验,检验名称:name, 检验编码:hospitalCode, 更新类型:updateType(add为新增, delete为删除)
} else if ("检查".Equals(type)) {
// 回填检查,检查名称:name, 检查编码:hospitalCode, 更新类型:updateType(add为新增, delete为删除)
}else if ("smart".Equals(type)) {
// 回填智能问诊病历信息
JObject joData = (JObject)JsonConvert.DeserializeObject(data);
// 回填主诉信息
string chief_complaint = joData.ContainsKey("chief_complaint") ? joData["chief_complaint"].ToString() : "";
// 回填现病史信息
string present_illness = joData.ContainsKey("present_illness") ? joData["present_illness"].ToString() : "";
}else if ("reminder-emr".Equals(type)) {
// 质控提醒信息返回
JArray reminderArry = JArray.Parse(data);
foreach(JToken reminderData in reminderArry){
// 质控提醒项目ID(医嘱单号)
string reminderDocId = ((JObject)reminderData)["doc_id"].ToString();
// 质控提醒项目名称(医嘱项)
string reminderName = ((JObject)reminderData)["name"].ToString();
// 质控提醒级别(notice/warning/error)
string reminderLevel = ((JObject)reminderData)["level"].ToString();
// 质控提醒信息
string reminderMessage = ((JObject)reminderData)["message"].ToString();
// 质控提醒类型(文书/检验/检查/手术/治疗)
string reminderType = ((JObject)reminderData)["type"].ToString();
}
}
} else {
base.DefWndProc(ref m);
}
}
SDK入参:患者数据规范¶
门诊记录¶
请点击箭头查看内容
{
"场景": ["门诊记录"],
"trigger": "保存/提交/CDSS", // 触发CDSS的方式
// 1) 保存:点击保存时自动触发;
// 2) 提交:点击提交时自动触发;
// 3) CDSS:点击单独新增的CDSS按钮触发。
// 工作人员信息
"医院": "", // [必填]医院名称
"科室": "", // [必填]科室名称
"医生": "", // [必填]工作人员姓名
"uid": "", // [必填]医疗信息系统账号
// 患者信息
"诊疗类型": "门诊/急诊/体检", // [必填]
"诊疗次数": "", // "1":初诊,大于1表示复诊
"rid": "", // [必填] 住院号 或者 门诊号
"pid": "", // [必填] 患者ID
"年龄": "28岁", // [必填] xx岁/xx月/xx天/xx小时
"性别": "男/女", // [必填]
"出生日期": "", // YYYY-MM-DD
"职业": "",
"出生地": "",
"现住地": "",
"费用类型": "医保/商保/自费/公费/等",
"身高": "180cm",
"体重": "70kg",
"ABO血型": "A/B/AB/O",
"Rh血型": "阴/阳",
"婚姻状态": "未婚/已婚/离异/丧偶",
// 门诊记录
"门诊科室": "",
"门诊日期": "yyyy-MM-dd HH:mm:ss",
"主诉": "",
"现病史": "",
"既往史": "",
"个人史": "",
"月经史": "",
"婚育史": "",
"家族史": "",
"过敏史": "",
"接种史": "",
"体格检查": "",
"辅助检查": "",
"专科检查": "",
"诊断": [
{
"诊断类型": "初步诊断/补充诊断/确诊诊断/其他诊断/门诊诊断",
"诊断结果": "",
"主要诊断": "是/否"
}
]
}
入院记录¶
请点击箭头查看内容
{
"场景": ["入院记录"],
"trigger": "保存/提交/CDSS", // 触发CDSS的方式
// 1) 保存:点击保存时自动触发;
// 2) 提交:点击提交时自动触发;
// 3) CDSS:点击单独新增的CDSS按钮触发。
// 工作人员信息
"医院": "", // [必填]医院名称
"科室": "", // [必填]科室名称
"医生": "", // [必填]工作人员姓名
"uid": "", // [必填]医疗信息系统账号
// 患者信息
"诊疗类型": "门诊/急诊/体检", // [必填]
"诊疗次数": "", // "1":初诊,大于1表示复诊
"rid": "", // [必填] 住院号 或者 门诊号
"pid": "", // [必填] 患者ID
"年龄": "28岁", // [必填] xx岁/xx月/xx天/xx小时
"性别": "男/女", // [必填]
"出生日期": "", // YYYY-MM-DD
"职业": "",
"出生地": "",
"现住地": "",
"费用类型": "医保/商保/自费/公费/等",
"身高": "180cm",
"体重": "70kg",
"ABO血型": "A/B/AB/O",
"Rh血型": "阴/阳",
"婚姻状态": "未婚/已婚/离异/丧偶",
// 入院记录
"入院科室": "",
"入院日期": "yyyy-MM-dd HH:mm:ss",
"主诉": "",
"现病史": "",
"既往史": "",
"个人史": "",
"月经史": "",
"婚育史": "",
"家族史": "",
"过敏史": "",
"接种史": "",
"体格检查": "",
"辅助检查": "",
"专科检查": "",
"诊断": [
{
"诊断类型": "初步诊断/入院诊断/补充诊断/确诊诊断/其他诊断/鉴别诊断/出院诊断",
"诊断结果": "",
"主要诊断": "是/否"
}
]
}
医嘱¶
请点击箭头查看内容
{
"场景": ["医嘱"],
"trigger": "保存/提交/CDSS", // 触发CDSS的方式
// 1) 保存:点击保存时自动触发;
// 2) 提交:点击提交时自动触发;
// 3) CDSS:点击单独新增的CDSS按钮触发。
// 工作人员信息
"医院": "", // [必填]医院名称
"科室": "", // [必填]科室名称
"医生": "", // [必填]工作人员姓名
"uid": "", // [必填]医疗信息系统账号
// 患者信息
"诊疗类型": "门诊/急诊/体检", // [必填]
"rid": "", // [必填] 住院号 或者 门诊号
"pid": "", // [必填] 患者ID
"年龄": "28岁", // [必填] xx岁/xx月/xx天/xx小时
"性别": "男/女", // [必填]
"医嘱": [
{
"处方ID": "", // 处方号
"医嘱单号": "", // [必填] 医嘱项目的唯一ID,一个门诊处方下的药品之间医嘱ID不同,处方ID相同,请注意:医嘱ID是全局唯一的,不是医嘱项目院内编码
"医嘱类型": "用药/检验/检查/诊疗/手术/护理/出院带药", // [必填]
"医嘱项": "", // [必填]
"长期或临时": "长期/临时", // [必填]
"医嘱状态": "新开/执行/停止/取消", // [必填]
"创建时间": "yyyy-MM-dd HH:mm:ss", // 医嘱创建时间
"审核时间": "yyyy-MM-dd HH:mm:ss", // 医嘱审核时间
"开始时间": "yyyy-MM-dd HH:mm:ss", // 医嘱下达的预期开始时间
"结束时间": "yyyy-MM-dd HH:mm:ss", // 医嘱下达的预期结束时间
"医嘱开立科室": "",
"医嘱开立者": "",
"医嘱审核科室": "",
"医嘱审核者": "",
// 以下为用药医嘱独有字段
"用药天数":"",
"国药准字号": "", // 医嘱类型=用药时 [必填]
"输液单号": "1",
"服药途径": "口服/皮下注射/肌肉注射/静脉注射/外用/雾化吸入/等", // 医嘱类型=用药时 [必填]
"服药频率": "", // 医嘱类型=用药时 [必填]
"单次剂量": "", // 医嘱类型=用药时 [必填]
"总剂量": "", // 医嘱类型=用药时 [必填]
"剂量单位": "", // 医嘱类型=用药时 [必填]
"药物商品名": "", // 医嘱类型=用药时 [必填]
"药物通用名": "",
"药物编码": "",
"药物类别": "电解质平衡调节药",
"药物剂型": "注射剂/片剂/胶囊剂/丸剂/散剂/气雾剂/等",
// 以下为检查医嘱、检验医嘱独有字段
"报告单号": "" // 检验报告单号或者检查报告单号
},
{ // 医嘱执行记录, 不需要传完整的医嘱信息,只需要传如下字段即可,同一条医嘱多次执行拆成多条医嘱(这些医嘱ID相同,执行时间不同)
"医嘱单号": "", // [必填] 医嘱ID
"医嘱类型": "用药/检验/检查/诊疗/手术/护理/出院带药", // [必填]
"医嘱项": "", // [必填]
"长期或临时": "长期/临时", // [必填]
"医嘱状态": "新开/执行/停止/取消", // [必填]
"执行时间": "yyyy-MM-dd HH:mm:ss", // [必填] 医嘱实际执行的时间
"医嘱执行科室": "",
"医嘱执行者": "",
"皮试结果": "" // 皮试结果
}
]
}