Beispiel #1
0
        /// <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);
        }
Beispiel #2
0
        /// <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);
        }