Skip to content

灵医智惠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程序

//cdssPath : 01cdss程序所在路径,如:c:\\xxx\\
OpenCDSSByPath(string cdssPath);

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程序

CloseCDSS();

当用户关闭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",               // [必填] 医嘱实际执行的时间
      "医嘱执行科室": "",
      "医嘱执行者": "",
      "皮试结果": ""                                   // 皮试结果
    }
  ]
}