/// <summary> /// 推送病人檢驗資料至名醫實時通APP /// </summary> /// <param name="HospID">醫事機構代碼</param> /// <param name="UserId">使用者身份證ID</param> /// <param name="PLMRowid">檢驗主檔資料序號</param> /// <returns> /// sReturnCode:回應代碼 /// 00=推送成功 /// 01=推送成功,但寫log失敗 /// 900=沒授權 /// 901=取不到 Token /// 902=取不到病人的檢驗資料 /// 998=Get Token發生了 exception 狀況 /// 999=推送失敗 /// </returns> public string PushDHO(string HospID, string UserId, string PLMRowid) { string sReturnCode = String.Empty; string sOrg_code = "TW" + HospID; #region 切換醫療機構所屬資料庫 LIS_HISEntities db_his = new LIS_HISEntities(); GetLink(); db_his = new LIS_HISEntities(myClass.GetSQLConnectionString(dbs, "his" + HospID, userid, password, @"res://*/Models.LIS_HISModel.csdl|res://*/Models.LIS_HISModel.ssdl|res://*/Models.LIS_HISModel.msl")); #endregion // 確認傳進來的病人是否有在名醫實時通裡面授權 // 2021-03-16 修正此病人可能有一隻手機以上並註冊一個以上的帳號,所以,改成以迴圈方式處理 var db_dho = (from du in db_zmcms.DHO_Users where du.user_id == UserId && du.org_code == sOrg_code select new { du.org_code, du.dho_uid, du.user_id }); foreach (var dt_dho_uid in db_dho) { #region 設定 Json 類別及相關變數初值 GENERAL db_general = new GENERAL(); db_general = null; List<EXAMS> listEXAMS = new List<EXAMS>(); List<EXAMITEMS> listEXAMITEMS = new List<EXAMITEMS>(); LISDATA db_lisdata = new LISDATA(); List<USER> listUser = new List<USER>(); string access_token = String.Empty; string sHospID = HospID; // 病人所屬的醫事機構代碼 string sHospName = String.Empty; // 病人所屬的醫事機構名稱 string sUserId = UserId; // 病人的資料 id string sDHOUid = dt_dho_uid.dho_uid; // 病人的 DHO uid #endregion if (dt_dho_uid != null) // 表示名醫實時通裡面有資料可以推播 { // 開始傳送檢驗資料 #region 取得醫事機構名稱 var db_sh = (from sh in db_zmcms.sysHospital where sh.HospID == sHospID select new { sh.HospName }).First(); if (db_sh != null) { sHospName = db_sh.HospName; } #endregion // 取得病人的檢驗資料及檢驗數值。 var lis_result = from lplm in db_his.lisPatientLaboratoryMaster where lplm.PLMRowid == PLMRowid join lpld in db_his.lisPatientLaboratoryDetail on lplm.PLMRowid equals lpld.PLMRowid join lhli in db_his.lisHospitalLaboratoryItem on lpld.PLDCode equals lhli.HLICode where lhli.LLISubRowid != null && lhli.LLISubRowid != "" join lli in db_his.lisLaboratoryItem on lhli.LLISubRowid equals lli.LLIRowid select new { lli.LLINhiCode, lli.LLIUnit, lhli.LLISubRowid, lplm.PLMPTIdno, lplm.PLMPTName, lplm.PLMApplyDate, lpld.PLDCode, lpld.PLDName, lpld.PLDValue, lpld.PLDStrValue }; // 若有檢驗資料執行下面程序 if (lis_result != null) { DateTime dtPLMApplyDate = DateTime.Now; foreach (var dt_lis in lis_result) { dtPLMApplyDate = (DateTime)dt_lis.PLMApplyDate; listEXAMITEMS.Add(new EXAMITEMS { exam_item_id = dt_lis.LLINhiCode, prefered_unit = "", //dt_lis.LLIUnit, si_value = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? dt_lis.PLDValue.ToString() : "", cu_value = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? dt_lis.PLDValue.ToString() : "", cu_string = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? "" : dt_lis.PLDStrValue.Replace('(',' ').TrimStart(), si_string = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? "" : dt_lis.PLDStrValue.Replace(')', ' ').TrimEnd() }); } if (listEXAMITEMS.Count > 0) { listEXAMS.Add(new EXAMS { resource_id = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds(), exam_name = sHospID + " " + sHospName, exam_date = dtPLMApplyDate.ToString("yyyy-MM-dd HH:mm:ss"), exam_items = listEXAMITEMS }); listUser.Add(new USER { dho_uid = sDHOUid, general = db_general, exams = listEXAMS }); } } // 如果上面的檢驗有取到資料則執行下面的程序 if (listUser.Count > 0) { // Get Access_Token // var access_token = myDHOClass.GetAccessTokens("TW" + sHospID + "*"); // var access_token = myDHOClass.GetAccessTokens("CMSTEST001*"); // Get Access_Token try { access_token = myDHOClass.GetAccessTokens("TW" + sHospID + "*"); if (!String.IsNullOrEmpty(access_token)) { db_lisdata.access_token = access_token; db_lisdata.nrange = "NR_YEADONG"; db_lisdata.users = listUser; LISJSONDATA gt = new LISJSONDATA(); gt.data = JsonConvert.SerializeObject(db_lisdata); string sJsonString = JsonConvert.SerializeObject(gt); // 推送資料 sReturnCode = Post2DHO(sJsonString); } else { sReturnCode = "901"; } } catch (Exception e) { sReturnCode = e.ToString(); sReturnCode = "998"; } } else { sReturnCode = "902"; } // 無論有無推播都要把 listUser 清空. listUser.Clear(); } else { sReturnCode = "900"; } // 無論推送成功否一律寫 Log, EF SaveData try { lisDHOLog dhol = new lisDHOLog(); dhol.DHORowid = Guid.NewGuid().ToString(); dhol.DHOHospID = HospID; dhol.DHOPTRowid = UserId; dhol.DHOResourceID = listEXAMS.First().resource_id; dhol.DHOExamName = listEXAMS.First().exam_name; dhol.DHOExamDate = listEXAMS.First().exam_date; dhol.DHOExamItems = JsonConvert.SerializeObject(listEXAMS.First().exam_items); dhol.DHOCode = sReturnCode; dhol.DHOSendDateTime = DateTime.Now; dhol.DHOSendType = "M"; db_his.lisDHOLog.Add(dhol); db_his.SaveChanges(); } catch (Exception e) { sReturnCode = e.ToString(); sReturnCode = "01"; } } return (sReturnCode); }
/// <summary> /// 推送病人檢驗資料至名醫實時通APP /// </summary> /// <param name="HospID">醫事機構代碼</param> /// <param name="UserId">使用者身份證ID</param> /// <param name="PLMRowid">檢驗主檔資料序號</param> /// <returns> /// sReturnCode:回應代碼 /// 00=推送成功 /// 01=推送成功,但寫log失敗 /// 900=沒授權 /// 901=取不到 Token /// 902=取不到病人的檢驗資料 /// 998=Get Token發生了 exception 狀況 /// 999=推送失敗 /// </returns> public string PushDHO(string HospID, string UserId, string PLMRowid) { string sReturnCode = String.Empty; string sOrg_code = "TW" + HospID; // 2021-04-14 修正有下列字樣時在Post至DHO的時候 strValue 需轉成 "-" string[] sMinus = { "Non-reactive", "NOT FOUND", "(-)", "NORMAL" }; string[] sPlus = { "(+)" }; #region 切換醫療機構所屬資料庫 LIS_HISEntities db_his = new LIS_HISEntities(); GetLink(); db_his = new LIS_HISEntities(myClass.GetSQLConnectionString(dbs, "his" + HospID, userid, password, @"res://*/Models.LIS_HISModel.csdl|res://*/Models.LIS_HISModel.ssdl|res://*/Models.LIS_HISModel.msl")); #endregion // 確認醫事機構所屬的名醫實時通格式,若沒設定格式就不推直接給 Error Code var db_DROnline = (from sh in db_zmcms.sysHospital where sh.HospID == HospID join shp in db_zmcms.sysHospitalParam on sh.HospRowid equals shp.HospRowid select new { shp.HospDrOnline }).First(); if (db_DROnline != null) { string sHospRowid = String.Empty; string sDrOnline = db_DROnline.HospDrOnline.Trim(); // 確認傳進來的病人是否有在名醫實時通裡面授權 // 2021-03-16 修正此病人可能有一隻手機以上並註冊一個以上的帳號,所以,改成迴圈方式處理 var db_dho = (from du in db_zmcms.DHO_Users where du.user_id == UserId && du.org_code == sOrg_code select new { du.org_code, du.dho_uid, du.user_id }); foreach (var dt_dho_uid in db_dho) { #region 設定 Json 類別及相關變數初值 GENERAL db_general = new GENERAL(); db_general = null; List <EXAMS> listEXAMS = new List <EXAMS>(); List <EXAMITEMS> listEXAMITEMS = new List <EXAMITEMS>(); LISDATA db_lisdata = new LISDATA(); List <USER> listUser = new List <USER>(); string access_token = String.Empty; string sHospID = HospID; // 病人所屬的醫事機構代碼 string sHospName = String.Empty; // 病人所屬的醫事機構名稱 string sUserId = UserId; // 病人的資料 id string sDHOUid = dt_dho_uid.dho_uid; // 病人的 DHO uid #endregion if (dt_dho_uid != null) // 表示名醫實時通裡面有資料可以推播 { // 開始傳送檢驗資料 #region 取得醫事機構名稱 var db_sh = (from sh in db_zmcms.sysHospital where sh.HospID == sHospID select new { sh.HospRowid, sh.HospName }).First(); if (db_sh != null) { sHospRowid = db_sh.HospRowid; sHospName = db_sh.HospName; } #endregion // 20210623 修正取得檢驗項目來源 // 需考慮一家醫事機構在 lisLaboratorySchedule 會有二筆以上的設定 var db_sche = (from sche in db_zmlis.lisLaboratorySchedule where sche.HospRowid == sHospRowid join llm in db_zmlis.lisLaboratoryMaster on sche.LLMRowid equals llm.LLMRowid join lhli in db_zmlis.lisHospitalLaboratoryItem on llm.LLMRowid equals lhli.LLMRowid where llm.LLMFormat == "XML" && lhli.LLISubRowid != null join lli in db_zmlis.lisLaboratoryItem on lhli.LLISubRowid equals lli.LLIRowid select new { lli.LLINhiCode, lli.LLIUnit, lhli.HLICode, lhli.LLISubRowid }).AsEnumerable(); // 把資料轉成 DataTable //DataTable dt_sche = myClass.LinqQueryToDataTable(db_sche); // 取得病人的檢驗資料及檢驗數值。 var db_result = (from lplm in db_his.lisPatientLaboratoryMaster where lplm.PLMRowid == PLMRowid join lpld in db_his.lisPatientLaboratoryDetail on lplm.PLMRowid equals lpld.PLMRowid //join lhli in db_his.lisHospitalLaboratoryItem on //join lhli in dt_sche on //lpld.PLDCode equals lhli.HLICode //where lhli.LLISubRowid != null && lhli.LLISubRowid != "" //join lli in db_his.lisLaboratoryItem on lhli.LLISubRowid equals lli.LLIRowid select new { //lli.LLINhiCode, //lli.LLIUnit, //lhli.LLISubRowid, lplm.PLMPTIdno, lplm.PLMPTName, lplm.PLMApplyDate, lpld.PLDCode, lpld.PLDName, lpld.PLDValue, PLDStrValue = (sMinus.Contains(lpld.PLDStrValue)) ? "-" : (sPlus.Contains(lpld.PLDStrValue)) ? "+" : lpld.PLDStrValue }).AsEnumerable(); // 把資料轉成 DataTable //DataTable dt_result = myClass.LinqQueryToDataTable(db_result); var lis_result = from a in db_result join b in db_sche on a.PLDCode equals b.HLICode where b.LLISubRowid != null && b.LLISubRowid != "" select new { b.LLINhiCode, b.LLIUnit, b.LLISubRowid, a.PLMPTIdno, a.PLMPTName, a.PLMApplyDate, a.PLDCode, a.PLDName, a.PLDValue, a.PLDStrValue }; // 若有檢驗資料執行下面程序 if (lis_result != null) { DateTime dtPLMApplyDate = DateTime.Now; foreach (var dt_lis in lis_result) { dtPLMApplyDate = (DateTime)dt_lis.PLMApplyDate; listEXAMITEMS.Add(new EXAMITEMS { exam_item_id = dt_lis.LLINhiCode, prefered_unit = "", //dt_lis.LLIUnit, si_value = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? dt_lis.PLDValue.ToString() : "", cu_value = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? dt_lis.PLDValue.ToString() : "", cu_string = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? "" : dt_lis.PLDStrValue, si_string = (String.IsNullOrEmpty(dt_lis.PLDStrValue)) ? "" : dt_lis.PLDStrValue }); } if (listEXAMITEMS.Count > 0) { listEXAMS.Add(new EXAMS { resource_id = (int)DateTimeOffset.UtcNow.ToUnixTimeSeconds(), exam_name = sHospID + " " + sHospName, exam_date = dtPLMApplyDate.ToString("yyyy-MM-dd HH:mm:ss"), exam_items = listEXAMITEMS }); listUser.Add(new USER { dho_uid = sDHOUid, general = db_general, exams = listEXAMS }); } } // 如果上面的檢驗有取到資料則執行下面的程序 if (listUser.Count > 0) { // Get Access_Token // var access_token = myDHOClass.GetAccessTokens("TW" + sHospID + "*"); // var access_token = myDHOClass.GetAccessTokens("CMSTEST001*"); // Get Access_Token try { access_token = myDHOClass.GetAccessTokens("TW" + sHospID + "*"); if (!String.IsNullOrEmpty(access_token)) { db_lisdata.access_token = access_token; //db_lisdata.nrange = "NR_YEADONG"; // 亞東介接參數 db_lisdata.nrange = sDrOnline; db_lisdata.users = listUser; LISJSONDATA gt = new LISJSONDATA(); gt.data = JsonConvert.SerializeObject(db_lisdata); string sJsonString = JsonConvert.SerializeObject(gt); // 推送資料 sReturnCode = Post2DHO(sJsonString); } else { sReturnCode = "91"; } } catch (Exception e) { sReturnCode = e.ToString(); sReturnCode = "93"; } } else { sReturnCode = "92"; } // 無論有無推播都要把 listUser 清空. listUser.Clear(); } else { sReturnCode = "90"; } // 無論推送成功否一律寫 Log, EF SaveData try { lisDHOLog dhol = new lisDHOLog(); dhol.DHORowid = Guid.NewGuid().ToString(); dhol.DHOHospID = HospID; dhol.DHOPTRowid = UserId; dhol.DHOResourceID = listEXAMS.First().resource_id; dhol.DHOExamName = listEXAMS.First().exam_name; dhol.DHOExamDate = listEXAMS.First().exam_date; dhol.DHOExamItems = JsonConvert.SerializeObject(listEXAMS.First().exam_items); dhol.DHOCode = sReturnCode; dhol.DHOSendDateTime = DateTime.Now; dhol.DHOSendType = "M"; db_his.lisDHOLog.Add(dhol); db_his.SaveChanges(); } catch (Exception e) { //sReturnCode = e.ToString(); sReturnCode = sReturnCode + "01"; } } } else { // 該醫事機構沒有設定介接參數 sReturnCode = "98"; } // sReturnCode : // 00 : 成功 // 11 : Error // 99 : 檢驗資料與名醫實時通App傳輸當中出現問題 // 98 : 該醫事機構沒有設定介接參數 // sReturnCode+01 : 後二碼01表示寫 Log 資料失敗 // 90 : 名醫實時通裡面沒有資料可以推播 // 92 : 檢驗沒有取到資料 // 93 : 介接名醫實時通API時系統出現例外狀況 // 91 : Access Token 取得失敗 return(sReturnCode); }