示例#1
0
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            string version = null;

            try
            {
                //// get deployment version
                version = ApplicationDeployment.CurrentDeployment.CurrentVersion.ToString();
            }
            catch (InvalidDeploymentException)
            {
                //// you cannot read publish version when app isn't installed
                //// (e.g. during debug)
                version = "debugging, not installed";
            }
            this.Title += $" v.{version}";

            ///WebTEst部分不採MVVM
            using (Com_clDataContext dc = new Com_clDataContext())
            {
                this.DGQuery.ItemsSource = dc.sp_querytable2();
            }

            Refresh();

            Logging.Record_admin("Companion Log in", "");
        }
        private void QueryGoogle(string SearchTerm)
        {
            //Debug.Print("Query: " + SearchTerm);
            //string sanitized = HttpUtility.HtmlEncode(SearchTerm);
            //string url = @"http://google.com/complete/search?output=toolbar&q=" + sanitized;
            //WebRequest httpWebRequest = HttpWebRequest.Create(url);
            //var webResponse = httpWebRequest.GetResponse();
            //XmlDocument xmlDoc = new XmlDocument();
            //xmlDoc.Load(webResponse.GetResponseStream());
            //var result = xmlDoc.SelectNodes("//CompleteSuggestion");
            //_QueryCollection = result;

            Com_clDataContext dc  = new Com_clDataContext();
            XDocument         doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement("Toplevel",
                                                                                                        from p in dc.sp_finduid_by_info(SearchTerm)
                                                                                                        select new XElement("CompleteSuggestion",
                                                                                                                            new XElement("suggestion", new XAttribute("uid", p.uid), new XAttribute("cname", p.cname),
                                                                                                                                         new XAttribute("key", p.key)))));
            //XDocument doc = new XDocument(new XDeclaration("1.0", "UTF-8", "yes"), new XElement("Toplevel", from p in dc.sp_finduid_by_info(SearchTerm)
            //                                                                                                select new XElement("CompleteSuggestion",
            //                                                                                               new XElement("suggestion", new XAttribute("data", p.cname)))));
            XmlDocument xmlDoc = new XmlDocument();

            xmlDoc.LoadXml(doc.Document.ToString());
            var result = xmlDoc.SelectNodes("//CompleteSuggestion");

            //var result = doc.XPathSelectElements("//suggestion");
            _QueryCollection = result;
        }
示例#3
0
 internal void Web_refresh()
 {
     ///WebTEst部分不採MVVM
     using (Com_clDataContext dc = new Com_clDataContext())
     {
         this.DGQuery.ItemsSource = dc.sp_querytable2();
     }
 }
示例#4
0
        public CurrentPatient(string StrUID)
        {
            Com_clDataContext      dc = new Com_clDataContext();
            sp_ptdata_by_uidResult pt = dc.sp_ptdata_by_uid(StrUID).First();

            _uid   = StrUID;
            _cid   = (long)pt.cid;
            _cname = pt.cname;
            _mf    = pt.mf;
            _bd    = pt.bd;
            _p01   = pt.p01;
            _p02   = pt.p02;
            _p03   = pt.p03;
            _p04   = pt.p04;
        }
示例#5
0
 private void Update_Data(string sUID)
 {
     if (sUID == string.Empty)
     {
         CPatient = null;
         DGMed    = null;
         DGLab    = null;
         DGQ01    = null;
         DGQ02    = null;
         DGQ03    = null;
         DGQ04    = null;
         DGQ05    = null;
         DGQ06    = null;
         DGQ07    = null;
         DGQ08    = null;
         DGQ09    = null;
         DGQ10    = null;
     }
     else
     {
         Com_clDataContext dc = new Com_clDataContext();
         CPatient = new CurrentPatient(sUID);
         DGMed    = dc.sp_meddata_by_uid(sUID).ToList <sp_meddata_by_uidResult>();
         DGLab    = dc.sp_labdata_by_uid(sUID).ToList <sp_labdata_by_uidResult>();
         DGQ01    = dc.sp_cloudmed_by_uid(sUID).ToList <sp_cloudmed_by_uidResult>();
         DGQ02    = dc.sp_cloudlab_by_uid(sUID).ToList <sp_cloudlab_by_uidResult>();
         DGQ03    = dc.sp_cloudDEN_by_uid(sUID).ToList <sp_cloudDEN_by_uidResult>();
         DGQ04    = dc.sp_cloudOP_by_uid(sUID).ToList <sp_cloudOP_by_uidResult>();
         DGQ05    = dc.sp_cloudTCM_by_uid(sUID).ToList <sp_cloudTCM_by_uidResult>();
         DGQ06    = dc.sp_cloudREH_by_uid(sUID).ToList <sp_cloudREH_by_uidResult>();
         DGQ07    = dc.sp_cloudDIS_by_uid(sUID).ToList <sp_cloudDIS_by_uidResult>();
         DGQ08    = dc.sp_cloudALL_by_uid(sUID).ToList <sp_cloudALL_by_uidResult>();
         DGQ09    = dc.sp_cloudSCH_R_by_uid(sUID).ToList <sp_cloudSCH_R_by_uidResult>();
         DGQ10    = dc.sp_cloudSCH_U_by_uid(sUID).ToList <sp_cloudSCH_U_by_uidResult>();
         // StrID: "2020/04/25 上午 02 診 015 號 - (H223505857) 陳俞潔"
         if (unPlug)
         {
             StrID = $"{DateTime.Now.ToString("g", CultureInfo.CurrentUICulture)} - ({_currentPatient.CID}) {_currentPatient.CNAME}";
         }
     }
 }
        private static string MakeSure_source_2_lines(string temp_source)
        {
            Com_clDataContext dc = new Com_clDataContext();

            string[] s        = temp_source.Replace("<br>", "|").Split('|');
            string   o_source = s[1];
            var      q1       = from p1 in dc.p_source
                                where p1.source_id == o_source
                                select p1;

            if (q1.Count() == 0)
            {
                p_source new_source = new p_source()
                {
                    source_id   = s[1],
                    source_name = s[0]
                };
                dc.p_source.InsertOnSubmit(new_source);
                dc.SubmitChanges();
            }
            return(o_source);
        }
示例#7
0
        private async void ParsingTables(string o)
        {
            tb.ShowBalloonTip($"讀取完成 [{current_op?.UID}]", "開始解析與寫入資料庫", BalloonIcon.Info);
            log.Info($"[Info] all HTML loaded into memory. start to analyze. [{current_op?.UID}]");

            // Count = 0 代表最後一個 tab
            // 20200504 這裡一個BUG, 漏了把F_DATA_Loadcompleted刪掉,以至於不斷重複多次. ******

            /// 確定是最後一個tab這段程式到此結束
            /// 4. Parsing & Saving to SQL: async
            ///     4-1. 多工同時處理, 快速
            ///     4-2. 依照欄位資料/位置 Parsing
            ///     4-3. 存入SQL
            ///     4-4. 製作Query
            /// 查核機制?
            log.Debug($"[Start] async process, {current_op?.UID}");
            List <Response_DataModel> rds = await VPN_Dictionary.RunWriteSQL_Async(ListRetrieved);

            log.Debug($"[End] async process, {current_op?.UID}");

            /// 1. 讀取特殊註記, 如果有的話
            ///    這是在ContentPlaceHolder1_tab02
            ///    是個table
            // 每當刷新後都要重新讀一次
            // d 是parent HTML document
            HTMLDocument d = (HTMLDocument)g.Document;

            IHTMLElement Special_remark  = d?.getElementById("ContentPlaceHolder1_tab02");
            string       _special_remark = Special_remark?.innerText;

            // 製作紀錄by rd
            try
            {
                short?med_N = (short?)(from p1 in rds
                                       where p1.SQL_Tablename == SQLTableName.Medicine
                                       select p1.Count).Sum(),
                     lab_N = (short?)(from p1 in rds
                                      where p1.SQL_Tablename == SQLTableName.Laboratory
                                      select p1.Count).Sum(),
                     schedule_N = (short?)(from p1 in rds
                                           where p1.SQL_Tablename == SQLTableName.Schedule_report
                                           select p1.Count).Sum(),
                     op_N = (short?)(from p1 in rds
                                     where p1.SQL_Tablename == SQLTableName.Operations
                                     select p1.Count).Sum(),
                     dental_N = (short?)(from p1 in rds
                                         where p1.SQL_Tablename == SQLTableName.Dental
                                         select p1.Count).Sum(),
                     allergy_N = (short?)(from p1 in rds
                                          where p1.SQL_Tablename == SQLTableName.Allergy
                                          select p1.Count).Sum(),
                     discharge_N = (short?)(from p1 in rds
                                            where p1.SQL_Tablename == SQLTableName.Discharge
                                            select p1.Count).Sum(),
                     rehab_N = (short?)(from p1 in rds
                                        where p1.SQL_Tablename == SQLTableName.Rehabilitation
                                        select p1.Count).Sum(),
                     tcm_N = (short?)(from p1 in rds
                                      where p1.SQL_Tablename == SQLTableName.TraditionalChineseMedicine_detail
                                      select p1.Count).Sum();
                Com_clDataContext dc = new Com_clDataContext();
                tbl_Query2        q  = new tbl_Query2()
                {
                    uid    = ListRetrieved.First().UID,
                    QDATE  = ListRetrieved.First().QDate,
                    EDATE  = DateTime.Now,
                    remark = _special_remark
                };
                q.cloudmed_N  = med_N;
                q.cloudlab_N  = lab_N;
                q.schedule_N  = schedule_N;
                q.op_N        = op_N;
                q.dental_N    = dental_N;
                q.allergy_N   = allergy_N;
                q.discharge_N = discharge_N;
                q.rehab_N     = rehab_N;
                q.tcm_N       = tcm_N;
                dc.tbl_Query2.InsertOnSubmit(q);
                dc.SubmitChanges();
                log.Info($"[Final Step]Successfully write into tbl_Query2. From: {ListRetrieved.First().UID}, [{ListRetrieved.First().QDate}]");
                tb.ShowBalloonTip($"寫入完成 [{current_op?.UID}]", "已寫入資料庫", BalloonIcon.Info);
            }
            catch (Exception ex)
            {
                log.Error($"[Final Step]Failed to write into tbl_Querry2. From:  {ListRetrieved.First().UID}, [{ListRetrieved.First().QDate}] Error: {ex.Message}");
            }

            // 更新顯示資料
            string tempSTR = s.m.Label1.Text;

            s.m.Label1.Text = string.Empty;
            s.m.Label1.Text = tempSTR;
            s.m.Web_refresh();

            // activate hotkeys 4
            Activate_Hotkeys();

            log.Debug(o);
            log.Info("===========================================================================");
            log.Info($" ");
        }
        private void F_LoadCompleted(object sender, FrameLoadCompleteEventArgs e)
        {
            log.Debug($"++ Enter F_LoadCompleted from {e.Message}.");
            // 20200509 因為沒有先 -= F_LoadComplted, 造成了幽靈, 因此一定要 -= F_LoadComplted 在任何Exit之前.
            // 每次作業F_LoadCompleted只會被呼叫一次,沒有被洗掉的情形
            fm.FrameLoadComplete -= F_LoadCompleted;
            log.Debug($"@@ delete delegate F_LoadCompleted.");

            // 使用DocumentLoadCompletedButNotFrame, 會造成偶而不動作的症狀, 要找別的方式來處理沒插健保卡的判別
            // 方法

            if (e.Message == FrameLoadStates.DocumentLoadCompletedButNotFrame)
            {
                // 沒有lbluserID, 例如沒插健保卡
                // activate hotkeys 1
                Activate_Hotkeys();
                log.Debug($"++ Exit F_LoadCompleted (1/5). No NHI card inserted.");
                log.Info("===========================================================================");
                log.Info($" ");
                return;
            }
            /// 會有兩次
            /// 第一次讀完檔案會再執行javascript, 在local用來認證健保卡, 沒過就不會有第二次
            /// 如果認證OK, 會再透過javascript下載個案雲端資料, 觸發第二次
            /// 這段程式的目的:
            /// 1. 取得身分證字號
            /// 2. 讀取有哪些tab

            // 20210719: mark this line to simplify logging
            // log.Info($"Entered F_LoadCompleted");

            HTMLDocument d = (HTMLDocument)g.Document;
            // 確定身分證字號
            string strUID = MakeSure_UID(d.getElementById("ContentPlaceHolder1_lbluserID").innerText);

            // if (strUID = string.Empty) 離開
            if (strUID == string.Empty)
            {
                tb.ShowBalloonTip("醫療系統資料庫查無此人", "請與杏翔系統連動, 或放棄操作", BalloonIcon.Warning);

                // activate hotkeys 2
                Activate_Hotkeys();
                log.Debug($"++ Exit F_LoadCompleted (2/5). NHI card inserted but no such person.");
                log.Info("===========================================================================");
                log.Info($" ");
                return;
            }
            else
            {
                /// 表示讀卡成功
                /// show balloon with built-in icon
                tb.ShowBalloonTip("讀卡成功", $"身分證號: {strUID}", BalloonIcon.Info);
                log.Info($"  Successful NHI card read, VPN id: {strUID}.");

                /// 讀卡成功後做三件事: 讀特殊註記, 讀提醒, 開始準備讀所有資料

                /// 2. 讀取提醒, 如果有的話
                ///    這是在ContentPlaceHolder1_GV
                ///    也是個table
                IHTMLElement List_NHI_lab_reminder = d?.getElementById("ContentPlaceHolder1_GV");
                if (List_NHI_lab_reminder != null)
                {
                    HtmlDocument Html_NHI_lab_reminder = new HtmlDocument();
                    Html_NHI_lab_reminder.LoadHtml(List_NHI_lab_reminder?.outerHTML);

                    // 寫入資料庫
                    foreach (HtmlNode tr in Html_NHI_lab_reminder.DocumentNode.SelectNodes("//table/tbody/tr"))
                    {
                        HtmlDocument h_ = new HtmlDocument();
                        h_.LoadHtml(tr.InnerHtml);
                        HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                        if ((tds == null) || (tds.Count == 0))
                        {
                            continue;
                        }
                        string Lab_Name = string.Empty, Last_Date = string.Empty;
                        // tds[0] 是檢查(驗)項目類別名稱
                        Lab_Name = tds[0]?.InnerText;
                        // tds[1] 是最近1次檢查日期
                        Last_Date = tds[1]?.InnerText;

                        using (Com_clDataContext dc = new Com_clDataContext())
                        {
                            var q1 = from p1 in dc.tbl_NHI_lab_reminder
                                     where (p1.uid == strUID) && (p1.lab_name == Lab_Name) && (p1.last_date == Last_Date)
                                     select p1;
                            if (q1.Count() == 0)
                            {
                                tbl_NHI_lab_reminder newReminder = new tbl_NHI_lab_reminder()
                                {
                                    uid       = strUID,
                                    QDATE     = DateTime.Now,
                                    lab_name  = Lab_Name,
                                    last_date = Last_Date
                                };
                                dc.tbl_NHI_lab_reminder.InsertOnSubmit(newReminder);
                                dc.SubmitChanges();
                            }
                        };
                    }
                }

                /// 準備: 初始化, 欄位基礎資料/位置, 可在windows生成時就完成

                #region 準備 - 製造QueueOperation

                // Initialization
                QueueOperation?.Clear();
                ListRetrieved?.Clear();
                current_page = total_pages = 0;

                log.Info($"  start reading Operation(s).");
                // 讀取所有要讀的tab, 這些資料位於"ContentPlaceHolder1_tab"
                // IHTMLElement 無法轉型為 HTMLDocument
                // 20200429 tested successful
                IHTMLElement List_under_investigation = d?.getElementById("ContentPlaceHolder1_tab");
                // li 之下就是 a
                List <string> balloonstring = new List <string>();
                string        BalloonTip    = string.Empty;
                foreach (IHTMLElement hTML in List_under_investigation?.all)
                {
                    if (tab_id_wanted.Contains(hTML.id))
                    {
                        // 僅將要讀入的排入, 並沒有真的讀取資料
                        VPN_Operation vOP = VPN_Dictionary.Making_new_operation(hTML.id, strUID, DateTime.Now);
                        QueueOperation.Enqueue(vOP);
                        log.Info($"    讀入operation: {vOP.Short_Name}, [{strUID}]");
                        balloonstring.Add(vOP.Short_Name);
                    }
                }

                for (int i = 0; i < balloonstring.Count; i++)
                {
                    if (i == 0)
                    {
                        BalloonTip = balloonstring[i];
                    }
                    else if ((i % 3) == 0)
                    {
                        BalloonTip += $";\r\n{balloonstring[i]}";
                    }
                    else
                    {
                        BalloonTip += $"; {balloonstring[i]}";
                    }
                }
                log.Info($"  end of Reading Operation(s), 共{QueueOperation?.Count}個Operation(s).");

                #endregion 準備 - 製造QueueOperation

                #region 執行

                if (QueueOperation.Count > 0)
                {
                    // 流程控制, fm = framemonitor

                    // 載入第一個operation
                    //log.Info($"  the first operation loaded.");
                    current_op = QueueOperation.Dequeue();
                    tb.ShowBalloonTip($"開始讀取 [{current_op.UID}]", BalloonTip, BalloonIcon.Info);

                    // 判斷第一個operation是否active, (小心起見, 其實應該不可能不active)
                    // 不active就要按鍵
                    // 要注意class這個attribute是在上一層li層, 需把它改過來
                    if (d.getElementById(current_op.TAB_ID.Replace("_a_", "_li_")).className == "active")
                    {
                        // 由於此時沒有按鍵, 因此無法觸發LoadComplete, 必須人工觸發
                        fm.FrameLoadComplete += F_Data_LoadCompleted;
                        log.Debug($"@@ Add delegate F_Data_LoadCompleted.");
                        FrameLoadCompleteEventArgs ex = new FrameLoadCompleteEventArgs()
                        {
                            Message = FrameLoadStates.DirectCall
                        };
                        log.Debug($"++ Exit F_LoadCompleted (3/5). Goto F_Data_LoadCompleted by direct call.");
                        F_Data_LoadCompleted(this, ex);
                        return;
                    }
                    else
                    {
                        // 不active反而可以用按鍵, 自動會觸發F_Data_LoadCompleted
                        fm.FrameLoadComplete += F_Data_LoadCompleted;
                        log.Debug($"@@ Add delegate F_Data_LoadCompleted.");
                        // 20210719 有時候不fire
                        Thread.Sleep(150);
                        d.getElementById(current_op.TAB_ID).click();
                        log.Info($"[Action] push TAB {current_op.TAB_ID} Button.");
                        log.Debug($"++ Exit F_LoadCompleted (4/5). Go to next tab by pushing tab button.");
                        return;
                    }
                }
                else
                {
                    // 做個紀錄
                    // 一個都沒有
                    log.Info($"  no record at all.");
                    tb.ShowBalloonTip("沒有資料", "健保資料庫裡沒有資料可讀取", BalloonIcon.Info);
                    // 製作紀錄by rd
                    tbl_Query2 q = new tbl_Query2()
                    {
                        uid         = strUID,
                        QDATE       = DateTime.Now,
                        cloudmed_N  = 0,
                        cloudlab_N  = 0,
                        schedule_N  = 0,
                        op_N        = 0,
                        dental_N    = 0,
                        allergy_N   = 0,
                        discharge_N = 0,
                        rehab_N     = 0,
                        tcm_N       = 0
                    };
                    using (Com_clDataContext dc = new Com_clDataContext())
                    {
                        dc.tbl_Query2.InsertOnSubmit(q);
                        dc.SubmitChanges();
                    };

                    // activate hotkeys 3
                    Activate_Hotkeys();
                    log.Debug($"++ Exit F_LoadCompleted (5/5). NHI inserted and verified but completey no data.");
                    log.Info("===========================================================================");
                    log.Info($" ");
                }

                #endregion 執行
            }
        }
示例#9
0
 private void TimersTimer_Elapsed(object sender, ElapsedEventArgs e)
 {
     try
     {
         GetWindow g = new GetWindow("問診");
         // vb.NET里面的vbCr & vbLf 在c# 是\r\n, chr(13) chr(10)
         // 第二個是身分證字號
         //tempID = g.Key.Split('\n')[2];
         tempID = g.Key;
         //string[] ss = tempID.Split('\n');
     }
     catch
     {
         tempID = string.Empty;
     }
     if (StrID == string.Empty)
     {
         if (tempID == string.Empty)
         {
             // condition 1, strID = "" => ""                     do nothing
             return;
         }
         else
         {
             // 檢單查核, 如果分解後數目小於8, 應該就不是正確的
             // 20190930似乎有效
             if (tempID.Split(' ').Length < 8)
             {
                 //'MessageBox.Show("抓到了")
                 return;
             }
             // condition 2, strID = "" => something A            record A, starttime
             // 要做很多事情, 分解
             // 20190930 有些"問診畫面"的狀態,文字是不一樣的,這樣的話會有錯誤
             StrID = tempID;
             Com_clDataContext dc = new Com_clDataContext();
             string[]          s  = strID.Split(' '); //0 SDATE, 1 VIST, 2 RMNO, 4 Nr, 7 uid, 8 cname
             if (s[7].Substring(1, 10) == "A000000000")
             {
                 strID  = string.Empty;
                 StrUID = string.Empty;
                 return;
             }
             StrUID = s[7].Substring(1, 10);  // Propertychanged
             dc.sp_insert_access(DateTime.Parse(s[0]), s[1], byte.Parse(s[2]), byte.Parse(s[4]), strUID, s[8], true);
         }
     }
     else
     {
         if (StrID == tempID)
         {
             // condition 3, strID = something A => something A   do nothing
             return;
         }
         else if (tempID == string.Empty)
         {
             //' condition 4, strID = something A => ""            record endtime, write into database
             //' 做的事情也不少
             Com_clDataContext dc = new Com_clDataContext();
             string[]          s  = strID.Split(' '); //'0 SDATE, 1 VIST, 2 RMNO, 4 Nr, 7 uid, 8 cname
             dc.sp_insert_access(DateTime.Parse(s[0]), s[1], byte.Parse(s[2]), byte.Parse(s[4]), strUID, s[8], false);
             StrID  = tempID;
             StrUID = string.Empty;  // Propertychanged
         }
         else
         {
             //' condition 5, strID = something A => something B   I don't know if this is possible
             //' 有可能嗎? 我不知道
             //' 20191001 答案揭曉了,有可能,因為THESIS在畫form時會有A000000000臨時的資料,然後再讀資料庫蓋上,就會出現something A => something B的情況
             //' 我採用檢核若A000000000的情形就不要寫入的方式處理
             //' 檢單查核, 如果分解後數目小於8, 應該就不是正確的
             //'                MessageBox.Show("抓到了! " + vbCrLf + strID + "=>" + tempID)
             if (tempID.Split(' ').Length < 8)
             {
                 return;
             }
         }
     }
 }
        private static int Write_sch_re(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_sch_re. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int    count = 0;
            string o_drug = string.Empty, o_YM = string.Empty, drug_name = string.Empty;
            int    o_visit_n = 0, o_clinic_n = 0, o_t_dose = 0, o_t_DDD = 0, row_left = 0, row_n = 0;
            int    order_n = 0;

            try
            {
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    if (row_left > 0)
                    {
                        row_left--;
                    }
                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        //' header(order_n)是資料表的位置與實際table的對照
                        //' order_n是table的位置, header(order_n)的值是資料表的位置
                        //' 有rowspan會干擾
                        int actual_n;

                        if ((row_left != row_n) && (row_left > 0) && (order_n > 0))
                        {
                            actual_n = order_n + 1;
                            o_drug   = drug_name;
                        }
                        else
                        {
                            actual_n = order_n;
                        }
                        //' 第一輪

                        if ((order_n == 1) && int.Parse(td.GetAttributeValue("rowspan", "1")) > 1)
                        {
                            //' order_n=1 名義上第一輪成分名稱的位置
                            drug_name = td.InnerHtml.Replace("<br>", " ");
                            row_n     = int.Parse(td.GetAttributeValue("rowspan", "1"));
                            row_left  = row_n;
                        }
                        switch (header_order[actual_n])
                        {
                        case 0:
                            // 成分名稱
                            o_drug = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 1:
                            // 就醫年月
                            o_YM = td.InnerText;
                            break;

                        case 2:
                            // 就醫次數
                            if (td.InnerText != string.Empty)
                            {
                                o_visit_n = int.Parse(td.InnerText);
                            }
                            break;

                        case 3:
                            // 就醫院所數
                            if (td.InnerText != string.Empty)
                            {
                                o_clinic_n = int.Parse(td.InnerText);
                            }
                            break;

                        case 4:
                            // 總劑量
                            if (td.InnerText != string.Empty)
                            {
                                o_t_dose = int.Parse(td.InnerText);
                            }
                            break;

                        case 5:
                            // 總DDD數
                            if (td.InnerText != string.Empty)
                            {
                                o_t_DDD = int.Parse(td.InnerText);
                            }
                            break;
                        }
                        order_n++;
                    }

                    var q = from p in dc.tbl_cloudSCH_R
                            where (p.uid == strUID) && (p.drug_name == o_drug) && (p.YM == o_YM)
                            select p;
                    if (q.Count() == 0)
                    {
                        tbl_cloudSCH_R newR = new tbl_cloudSCH_R()
                        {
                            uid       = strUID,
                            QDATE     = current_date,
                            YM        = o_YM,
                            drug_name = o_drug,
                            visit_n   = (byte?)o_visit_n,
                            clinic_n  = (byte?)o_clinic_n,
                            t_dose    = (short?)o_t_dose,
                            t_DDD     = (short?)o_t_DDD
                        };

                        // 存檔

                        dc.tbl_cloudSCH_R.InsertOnSubmit(newR);
                        dc.SubmitChanges();
                    }
                    count++;
                }
                log.Debug($"        Exit Write_sch_re. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        SCH_RE of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}, [{o_drug}]");
                log.Debug($"        Exit Write_sch_re. Current ID: {strUID}.");
                return(0);
            }
        }
        public void HotKeyManagerPressed(object sender, KeyPressedEventArgs e)
        {
            if ((e.HotKey.Key == Key.F2) && (e.HotKey.Modifiers == ModifierKeys.Control))
            {
                // 20210719 mark this line to simplify logging, Reason: 太多了啦
                // log.Info("Hotkey Ctrl-F2 pressed.");

                // 20210718 簡單版本, Subjective

                // 決定日期, 有strID就用, 沒有就用今天
                string D = DateTime.Now.ToShortDateString();
                if (DateTime.TryParse(m.strID.Content.ToString().Split(' ')[0], out DateTime o))
                {
                    D = o.ToShortDateString();
                }

                Random crandom = new Random();
                // 1句的機率, 2/3*1*2/3=4/9
                // 3句的機率, 1/3*1*1/3=1/9
                // 2句的機率, 4/9
                // Short sentence
                // 1/3 機會有這一段
                int           n;
                string        output;
                List <string> strShort = new List <string> {
                    "OK.", "No specific complaints.",
                    "Satisfied with medication.", "Nothing particular.",
                    "Mostly unchanged since last visit.", "Aloof to inquiry.",
                    "For drug refill.", "Maintenance phase.",
                    "", "", "", "", "", "", "", "",
                    "", "", "", "", "", "", "", ""
                };
                n      = crandom.Next(strShort.Count);
                output = strShort[crandom.Next(n)];

                // Adjectives
                List <string> strAdj = new List <string> {
                    "Stationary ",
                    "No change in ", "Improved ",
                    "Stable ", "Unchanged ",
                    "Stable ", "Unchanged ",
                    "Fluctuated ", "Acceptable ",
                    "Tolerable ", "Fairly good ",
                    "Pretty good ", "Awesome ",
                    "Fantastic ", "Uneventful ",
                    "Stationary ", "Stationary "
                };
                n = crandom.Next(strAdj.Count);
                if (output.Length != 0)
                {
                    output += " ";
                }
                output += strAdj[crandom.Next(n)];

                // Nouns
                List <string> strNoun = new List <string> {
                    "condition.", "clinical picture.",
                    "mental status.", "state.",
                    "course.", "situation.",
                    "being.", "progress.",
                    "psychiatric state.", "circumstance.",
                    "condition.", "condition.",
                    "mental status.", "clinical picture.",
                    "state.", "sate.",
                    "mental status.", "clinical picture.",
                    "situation.", "condition."
                };
                n       = crandom.Next(strNoun.Count);
                output += strNoun[crandom.Next(n)];

                // Ask for
                // 1/3 有這一段
                n = crandom.Next(3);
                if (n == 0)
                {
                    List <string> strVerb = new List <string> {
                        "Ask for ", "Request for ",
                        "Need ", "Keep ", "Continue ", "Carry on ", "Keep on "
                    };
                    n       = crandom.Next(strVerb.Count);
                    output += $" {strVerb[crandom.Next(n)]}";

                    List <string> strAdj2 = new List <string> {
                        "same ", "the same ",
                        "present ", "current ", "identical ", "", "", "", "", ""
                    };
                    n       = crandom.Next(strAdj2.Count);
                    output += strAdj2[crandom.Next(n)];

                    List <string> strNoun2 = new List <string> {
                        "medication.",
                        "prescription refill.", "prescription.",
                        "treatment plan.", "drug treatment.",
                        "drug.", "psychiatric treatment."
                    };
                    n       = crandom.Next(strNoun2.Count);
                    output += strNoun2[crandom.Next(n)];
                }

                output = $"{D}: {output}\n";
                InputSimulator sim = new InputSimulator();
                sim.Keyboard.TextEntry(output);
            }
            if ((e.HotKey.Key == Key.Y) && (e.HotKey.Modifiers == ModifierKeys.Control))
            {
                log.Info("Hotkey Ctrl-Y pressed.");

                //更新雲端資料
                w.HotKey_Ctrl_Y();
            }
            if ((e.HotKey.Key == Key.G) && (e.HotKey.Modifiers == ModifierKeys.Control))
            {
                log.Info("Hotkey Ctrl-G pressed.");

                //讀寫雲端資料
                w.HotKey_Ctrl_G();
            }
            if ((e.HotKey.Key == Key.T) && (e.HotKey.Modifiers == ModifierKeys.Control))
            {
                log.Info("Hotkey Ctrl-T pressed.");

                //讀寫雲端資料
                Com_clDataContext dc = new Com_clDataContext();
                var    list_vpn      = dc.sp_querytable2();
                string show_list     = string.Empty;
                int    order         = 0;
                foreach (var a in list_vpn)
                {
                    if (order > 3)
                    {
                        break;
                    }
                    show_list += $"[{a.uid}] {a.cname} \r\n";
                    order++;
                }
                tb.ShowBalloonTip("最近四人", show_list, BalloonIcon.Info);
            }
        }
        private static int Write_lab(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_lab. Current ID: {strUID}.");
            int count = 0, order_n = 0;
            Com_clDataContext dc = new Com_clDataContext();

            count = 0;
            // 寫入資料庫
            foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
            {
                HtmlDocument h_ = new HtmlDocument();
                h_.LoadHtml(tr.InnerHtml);
                HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                if ((tds == null) || (tds.Count == 0))
                {
                    continue;
                }
                tbl_cloudlab_temp newLab = new tbl_cloudlab_temp()
                {
                    uid   = strUID,
                    QDATE = current_date
                };

                order_n = 0;
                foreach (HtmlNode td in tds)
                {
                    try
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 項次
                            if (td.InnerText != string.Empty)
                            {
                                newLab.item_n = short.Parse(td.InnerText);
                            }
                            break;

                        case 1:
                            newLab.source = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 2:
                            newLab.dep = td.InnerText;
                            break;

                        case 3:
                            newLab.diagnosis = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 4:
                            newLab.@class = td.InnerText;
                            break;

                        case 5:
                            newLab.order_name = td.InnerText;
                            break;

                        case 6:
                            newLab.lab_item = td.InnerText;
                            break;

                        case 7:
                            newLab.result = td.InnerText;
                            break;

                        case 8:
                            newLab.range = td.InnerText;
                            break;

                        case 9:
                            // 原本空白日期會有錯誤, 一有錯誤就直接跳到最外層try-catch,該條之後整頁都沒有讀入, 20200514修正
                            // 加入if, 排除空白日期造成的錯誤, 把try 縮小範圍, 有錯不至於放棄整頁
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                newLab.SDATE = d;
                            }
                            break;

                        case 10:
                            newLab.NHI_code = td.InnerText;
                            break;
                        }
                        order_n++;
                    }
                    catch (Exception ex)
                    {
                        log.Error($"        lab of {strUID}, Error: {ex.Message}");
                        log.Error($"        Count: {count}; Order: {order_n}]");
                    }
                }
                dc.tbl_cloudlab_temp.InsertOnSubmit(newLab);
                dc.SubmitChanges();
                count++;
            }
            // 匯入大表
            try
            {
                dc.sp_insert_tbl_cloudlab(current_date);
            }
            catch (Exception ex)
            {
                log.Error($"        lab of {strUID}, Error: {ex.Message}");
                log.Error($"        Error with writing into big table");
                Logging.Record_error(ex.Message);
            }
            try
            {
                dc.sp_insert_p_cloudlab(current_date);
            }
            catch (Exception ex)
            {
                log.Error($"        lab of {strUID}, Error: {ex.Message}");
                log.Error($"        Error with writing into p_cloudlab.");
                Logging.Record_error(ex.Message);
            }
            // 處理source
            var r = (from p in dc.tbl_cloudlab_temp
                     where p.QDATE == current_date
                     select p.source).Distinct().ToList(); // this is a query

            for (int i = 0; i < r.Count(); i++)
            {
                string[] s  = r[i].Split(' ');
                var      qq = from pp in dc.p_source
                              where pp.source_id == s[2].Substring(1)
                              select pp;
                if (qq.Count() == 0)
                {
                    p_source so = new p_source()
                    {
                        source_id   = s[2].Substring(1),
                        @class      = s[1].Substring(1),
                        source_name = s[0]
                    };
                    dc.p_source.InsertOnSubmit(so);
                    dc.SubmitChanges();
                }
            }
            log.Debug($"        Exit Write_lab. Current ID: {strUID}.");
            return(count);
        }
        private static int Write_dis(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_dis. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_source = string.Empty, o_dep = string.Empty, o_diagnosis = string.Empty;
            DateTime o_SDATE = new DateTime(), o_EDATE = new DateTime();

            int order_n = 0;

            try
            {
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 來源
                            if (td.InnerText != string.Empty)
                            {
                                o_source = MakeSure_source_2_lines(td.InnerHtml);
                            }
                            break;

                        case 1:
                            // 出院科別
                            o_dep = td.InnerText;
                            break;

                        case 2:
                            // 出院診斷
                            o_diagnosis = td.InnerText;
                            break;

                        case 3:
                            // 住院日期
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 4:
                            // 出院日期
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_EDATE = d;
                            }
                            break;
                        }
                        order_n++;
                    }

                    var q = from p in dc.tbl_cloudDIS
                            where (p.uid == strUID) && (p.source == o_source) &&
                            (p.SDATE == o_SDATE) && (p.EDATE == o_EDATE)
                            select p;
                    if (q.Count() == 0)
                    {
                        tbl_cloudDIS newDIS = new tbl_cloudDIS()
                        {
                            uid       = strUID,
                            QDATE     = current_date,
                            source    = o_source,
                            dep       = o_dep,
                            diagnosis = o_diagnosis,
                            SDATE     = o_SDATE,
                            EDATE     = o_EDATE
                        };

                        // 存檔

                        dc.tbl_cloudDIS.InsertOnSubmit(newDIS);
                        dc.SubmitChanges();
                    }
                    count++;
                }
                log.Debug($"        Exit Write_dis. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        Discharge of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}, [{o_diagnosis}]");
                log.Debug($"        Exit Write_dis. Current ID: {strUID}.");
                return(0);
            }
        }
        private static int Write_tcm_gr(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_tcm_gr. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_source = string.Empty, o_diagnosis = string.Empty, o_chronic = string.Empty, o_serial = string.Empty;
            int      o_days = 0;
            DateTime o_SDATE = new DateTime(), o_EDATE = new DateTime();

            int order_n = 0;

            // 寫入資料庫
            foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
            {
                HtmlDocument h_ = new HtmlDocument();
                h_.LoadHtml(tr.InnerHtml);
                HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                if ((tds == null) || (tds.Count == 0))
                {
                    continue;
                }
                order_n = 0;
                foreach (HtmlNode td in tds)
                {
                    try
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 來源
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                o_source = MakeSure_source_3_lines(td.InnerHtml);
                            }
                            break;

                        case 1:
                            // 主診斷
                            o_diagnosis = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 2:
                            // 給藥日數
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                o_days = int.Parse(td.InnerText);
                            }
                            break;

                        case 3:
                            // 慢連箋
                            o_chronic = td.InnerText;
                            break;

                        case 4:
                            // 就醫(調劑)日期
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 5:
                            // 慢連箋領藥日
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_EDATE = d;
                            }
                            break;

                        case 6:
                            // 就醫序號
                            o_serial = td.InnerText;
                            break;
                        }
                        order_n++;
                    }
                    catch (Exception ex)
                    {
                        log.Error($"        TCM_GR of {strUID}, Error: {ex.Message}");
                        log.Error($"        Count: {count}; Order: {order_n}, [{o_diagnosis}]");
                    }
                }
                var q = from p in dc.tbl_cloudTCM_G
                        where (p.uid == strUID) && (p.SDATE == o_SDATE) && (p.serial == o_serial)
                        select p;
                if (q.Count() == 0)
                {
                    tbl_cloudTCM_G newTCMG = new tbl_cloudTCM_G()
                    {
                        uid       = strUID,
                        QDATE     = current_date,
                        source    = o_source,
                        diagnosis = o_diagnosis,
                        days      = (byte?)o_days,
                        chronic   = o_chronic,
                        SDATE     = o_SDATE,
                        EDATE     = o_EDATE,
                        serial    = o_serial
                    };

                    // 存檔

                    dc.tbl_cloudTCM_G.InsertOnSubmit(newTCMG);
                    dc.SubmitChanges();
                }
                count++;
            }
            log.Debug($"        Exit Write_tcm_gr. Current ID: {strUID}.");
            return(count);
        }
        private static int Write_tcm_de(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_tcm_de. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_diagnosis = string.Empty, o_NHI_code = string.Empty, o_complex = string.Empty;
            string   o_base = string.Empty, o_effect = string.Empty, o_dosing = string.Empty;
            string   o_type = string.Empty, o_serial = string.Empty;
            int      o_days = 0;
            float    o_amt = 0;
            DateTime o_SDATE = new DateTime(), o_EDATE = new DateTime();

            int order_n = 0;

            // 寫入資料庫
            foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
            {
                HtmlDocument h_ = new HtmlDocument();
                h_.LoadHtml(tr.InnerHtml);
                HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                if ((tds == null) || (tds.Count == 0))
                {
                    continue;
                }
                order_n = 0;
                foreach (HtmlNode td in tds)
                {
                    try
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 主診斷名稱
                            o_diagnosis = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 1:
                            // 藥品代碼
                            o_NHI_code = td.InnerText;
                            break;

                        case 2:
                            // 複方註記
                            o_complex = td.InnerText;
                            break;

                        case 3:
                            // 基準方名
                            o_base = td.InnerText;
                            break;

                        case 4:
                            // 效能名稱
                            o_effect = td.InnerText;
                            break;

                        case 5:
                            // 用法用量
                            o_dosing = td.InnerText;
                            break;

                        case 6:
                            // 給藥日數
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                o_days = int.Parse(td.InnerText);
                            }
                            break;

                        case 7:
                            // 濟型
                            o_type = td.InnerText;
                            break;

                        case 8:
                            // 給藥總量
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                o_amt = float.Parse(td.InnerText);
                            }
                            break;

                        case 9:
                            // 就醫(調劑)日期
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 10:
                            // 慢連箋領藥日
                            if (!string.IsNullOrEmpty(td.InnerText))
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_EDATE = d;
                            }
                            break;

                        case 11:
                            // 就醫序號
                            o_serial = td.InnerText;
                            break;
                        }
                        order_n++;
                    }
                    catch (Exception ex)
                    {
                        log.Error($"        TCM_DE of {strUID}, Error: {ex.Message}");
                        log.Error($"        Count: {count}; Order: {order_n}, [{o_diagnosis}]");
                    }
                }
                // 20200515 有時候amt會有小數點, 直接轉換就會報錯, 因此先轉換成float, 再換回整數, 就可以通過

                var q = from p in dc.tbl_cloudTCM_D
                        where (p.uid == strUID) && (p.NHI_code == o_NHI_code) &&
                        (p.SDATE == o_SDATE) && (p.serial == o_serial)
                        select p;
                if (q.Count() == 0)
                {
                    tbl_cloudTCM_D newTCMD = new tbl_cloudTCM_D()
                    {
                        uid       = strUID,
                        QDATE     = current_date,
                        diagnosis = o_diagnosis,
                        NHI_code  = o_NHI_code,
                        complex   = o_complex,
                        @base     = o_base,
                        effect    = o_effect,
                        dosing    = o_dosing,
                        days      = (byte?)o_days,
                        type      = o_type,
                        amt       = (short?)o_amt,
                        SDATE     = o_SDATE,
                        EDATE     = o_EDATE,
                        serial    = o_serial
                    };

                    // 存檔

                    dc.tbl_cloudTCM_D.InsertOnSubmit(newTCMD);
                    dc.SubmitChanges();
                }
                count++;
            }
            log.Debug($"        Exit Write_tcm_de. Current ID: {strUID}.");
            return(count);
        }
        private static int Write_all(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_all. Current ID: {strUID}.");

            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_source = string.Empty, o_remark = string.Empty, o_drug_name = string.Empty;
            DateTime o_SDATE = new DateTime();
            int      order_n = 0;

            try
            {
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 上傳日期
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 1:
                            // 醫療院所
                            // 20200504: 發現是兩行的不是三行的
                            // 來源, 與別人有所不同, 只有兩行
                            if (td.InnerText != string.Empty)
                            {
                                o_source = MakeSure_source_2_lines(td.InnerHtml);
                            }
                            break;

                        case 2:
                            // 上傳註記
                            o_remark = td.InnerText;
                            break;

                        case 3:
                            // 過敏藥物
                            o_drug_name = td.InnerText;
                            break;
                        }
                        order_n++;
                    }

                    var q = from p in dc.tbl_cloudALL
                            where (p.uid == strUID) && (p.source == o_source) && (p.SDATE == o_SDATE) &&
                            (p.remark == o_remark) && (p.drug_name == o_drug_name)
                            select p;
                    if (q.Count() == 0)
                    {
                        tbl_cloudALL newALL = new tbl_cloudALL()
                        {
                            uid       = strUID,
                            QDATE     = current_date,
                            source    = o_source,
                            SDATE     = o_SDATE,
                            remark    = o_remark,
                            drug_name = o_drug_name
                        };
                        // 存檔

                        dc.tbl_cloudALL.InsertOnSubmit(newALL);
                        dc.SubmitChanges();
                    }
                    count++;
                }
                log.Debug($"        Exit Write_all. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        Allergy of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}, [{o_drug_name}]");
                log.Debug($"        Exit Write_all. Current ID: {strUID}.");
                return(-1);
            }
        }
示例#17
0
        private static int Write_reh(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_reh. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_class = string.Empty, o_source = string.Empty, o_diagnosis = string.Empty, o_type = string.Empty;
            string   o_curegrade = string.Empty, o_loca = string.Empty;
            int      o_amt = 0;
            DateTime o_begin_date = new DateTime(), o_end_date = new DateTime(), o_SDATE = new DateTime(), o_EDATE = new DateTime();

            int order_n = 0;

            try
            {
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 診別
                            o_class = td.InnerText;
                            break;

                        case 1:
                            // 來源, 與別人有所不同, 只有兩行
                            if (td.InnerText != string.Empty)
                            {
                                o_source = MakeSure_source_2_lines(td.InnerHtml);
                            }
                            break;

                        case 2:
                            // 主診斷碼
                            o_diagnosis = td.InnerText;
                            break;

                        case 3:
                            // 治療類別
                            o_type = td.InnerText;
                            break;

                        case 4:
                            // 強度
                            o_curegrade = td.InnerText;
                            break;

                        case 5:
                            // 醫令總量
                            if (td.InnerText != string.Empty)
                            {
                                o_amt = int.Parse(td.InnerText);
                            }
                            break;

                        case 6:
                            // 就醫日期/住院日期
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_begin_date = d;
                            }
                            break;

                        case 7:
                            // 治療結束日期
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_end_date = d;
                            }
                            break;

                        case 8:
                            // 診療部位
                            o_loca = td.InnerText;
                            break;

                        case 9:
                            // 執行時間-起
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 10:
                            // 執行時間-迄
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_EDATE = d;
                            }
                            break;
                        }
                        order_n++;
                    }

                    var q = from p in dc.tbl_cloudREH
                            where (p.uid == strUID) && (p.source == o_source) && (p.SDATE == o_SDATE) && (p.EDATE == o_EDATE)
                            select p;
                    if (q.Count() == 0)
                    {
                        tbl_cloudREH newREH = new tbl_cloudREH()
                        {
                            uid        = strUID,
                            QDATE      = current_date,
                            @class     = o_class,
                            source     = o_source,
                            type       = o_type,
                            diagnosis  = o_diagnosis,
                            curegrade  = o_curegrade,
                            amt        = (byte?)o_amt,
                            begin_date = o_begin_date,
                            end_date   = o_end_date,
                            loca       = o_loca,
                            SDATE      = o_SDATE,
                            EDATE      = o_EDATE
                        };

                        // 存檔

                        dc.tbl_cloudREH.InsertOnSubmit(newREH);
                        dc.SubmitChanges();
                    }
                    count++;
                }
                log.Debug($"        Exit Write_reh. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        REH of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}, [{o_diagnosis}]");
                log.Debug($"        Exit Write_reh. Current ID: {strUID}.");
                return(0);
            }
        }
        private static int Write_dental(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_dental. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_source = string.Empty, o_diagnosis = string.Empty, o_NHI_code = string.Empty;
            string   o_op_name = string.Empty, o_loca = string.Empty;
            int      o_amt = 0;
            DateTime o_SDATE = new DateTime(), o_EDATE = new DateTime();

            int order_n = 0;

            try
            {
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 來源
                            if (td.InnerText != string.Empty)
                            {
                                o_source = MakeSure_source_3_lines(td.InnerHtml);
                            }
                            break;

                        case 1:
                            // 主診斷名稱
                            o_diagnosis = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 2:
                            // 牙醫處置代碼
                            o_NHI_code = td.InnerText;
                            break;

                        case 3:
                            // 牙醫處置名稱
                            o_op_name = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 4:
                            // 診療部位
                            o_loca = td.InnerText;
                            break;

                        case 5:
                            // 執行時間-起
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 6:
                            // 執行時間-迄
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_EDATE = d;
                            }
                            break;

                        case 7:
                            // 醫令總量
                            if (td.InnerText != string.Empty)
                            {
                                o_amt = int.Parse(td.InnerText);
                            }
                            break;
                        }
                        order_n++;
                    }

                    var q = from p in dc.tbl_cloudDEN
                            where (p.uid == strUID) && (p.source == o_source) && (p.NHI_code == o_NHI_code) &&
                            (p.SDATE == o_SDATE) && (p.EDATE == o_EDATE)
                            select p;
                    if (q.Count() == 0)
                    {
                        tbl_cloudDEN newDEN = new tbl_cloudDEN()
                        {
                            uid       = strUID,
                            QDATE     = current_date,
                            source    = o_source,
                            diagnosis = o_diagnosis,
                            NHI_code  = o_NHI_code,
                            op_name   = o_op_name,
                            loca      = o_loca,
                            SDATE     = o_SDATE,
                            EDATE     = o_EDATE,
                            amt       = (byte?)o_amt
                        };

                        // 存檔

                        dc.tbl_cloudDEN.InsertOnSubmit(newDEN);
                        dc.SubmitChanges();
                    }
                    count++;
                }
                log.Debug($"        Exit Write_den. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        Dental of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}, [{o_op_name}]");
                log.Debug($"        Exit Write_den. Current ID: {strUID}.");
                return(0);
            }
        }
        private static int Write_sch_up(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Info($"        Enter Write_sch_up. Current ID: {strUID}.");
            Com_clDataContext dc = new Com_clDataContext();
            int      count = 0;
            string   o_drug = string.Empty, drug_name = string.Empty, o_STIME = string.Empty, o_clinic = string.Empty;
            int      o_t_dose = 0, o_t_DDD = 0, row_left = 0, row_n = 0;
            DateTime o_SDATE = new DateTime();
            int      order_n = 0;

            try
            {
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    if (row_left > 0)
                    {
                        row_left--;
                    }
                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        // header(order_n)是資料表的位置與實際table的對照
                        // order_n是table的位置, header(order_n)的值是資料表的位置
                        // 有rowspan會干擾
                        int actual_n;

                        if ((row_left != row_n) && (row_left > 0) && (order_n > 0))
                        {
                            actual_n = order_n + 1;
                            o_drug   = drug_name;
                        }
                        else
                        {
                            actual_n = order_n;
                        }
                        //' 第一輪

                        if ((order_n == 1) && int.Parse(td.GetAttributeValue("rowspan", "1")) > 1)
                        {
                            //' order_n=1 名義上第一輪成分名稱的位置
                            drug_name = td.InnerHtml.Replace("<br>", " ");
                            row_n     = int.Parse(td.GetAttributeValue("rowspan", "1"));
                            row_left  = row_n;
                        }
                        switch (header_order[actual_n])
                        {
                        case 0:
                            // 成分名稱
                            o_drug = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 1:
                            // 就診日期
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                o_SDATE = d;
                            }
                            break;

                        case 2:
                            // 就診時間
                            o_STIME = td.InnerText;
                            break;

                        case 3:
                            // 本院/他院
                            o_clinic = td.InnerText;
                            break;

                        case 4:
                            // 總劑量
                            if (td.InnerText != string.Empty)
                            {
                                o_t_dose = int.Parse(td.InnerText);
                            }
                            break;

                        case 5:
                            // 總DDD數
                            if (td.InnerText != string.Empty)
                            {
                                o_t_DDD = int.Parse(td.InnerText);
                            }
                            break;
                        }
                        order_n++;
                    }

                    var q = from p in dc.tbl_cloudSCH_U
                            where (p.uid == strUID) && (p.drugname == o_drug) && (p.SDATE == o_SDATE)
                            select p;
                    if (q.Count() == 0)
                    {
                        tbl_cloudSCH_U newU = new tbl_cloudSCH_U()
                        {
                            uid      = strUID,
                            QDATE    = current_date,
                            SDATE    = o_SDATE,
                            drugname = o_drug,
                            STIME    = o_STIME,
                            clinic   = o_clinic,
                            t_dose   = (short?)o_t_dose,
                            t_DDD    = (short?)o_t_DDD
                        };

                        // 存檔

                        dc.tbl_cloudSCH_U.InsertOnSubmit(newU);
                        dc.SubmitChanges();
                    }
                    count++;
                }
                log.Info($"        Exit Write_sch_up. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        SCH_UP of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}, [{o_drug}]");
                log.Info($"        Exit Write_sch_up. Current ID: {strUID}.");
                return(0);
            }
        }
        private static int Write_med(HtmlDocument html, List <int> header_order, string strUID, DateTime current_date)
        {
            log.Debug($"        Enter Write_med. Current ID: {strUID}.");
            int count = 0, order_n = 0;

            try
            {
                Com_clDataContext dc = new Com_clDataContext();
                count = 0;
                // 寫入資料庫
                foreach (HtmlNode tr in html.DocumentNode.SelectNodes("//table/tbody/tr"))
                {
                    HtmlDocument h_ = new HtmlDocument();
                    h_.LoadHtml(tr.InnerHtml);
                    HtmlNodeCollection tds = h_.DocumentNode.SelectNodes("//td");

                    if ((tds == null) || (tds.Count == 0))
                    {
                        continue;
                    }
                    tbl_cloudmed_temp newCloud = new tbl_cloudmed_temp()
                    {
                        uid   = strUID,
                        QDATE = current_date
                    };

                    order_n = 0;
                    foreach (HtmlNode td in tds)
                    {
                        switch (header_order[order_n])
                        {
                        case 0:
                            // 項次
                            if (td.InnerText != string.Empty)
                            {
                                newCloud.item_n = short.Parse(td.InnerText);
                            }
                            break;

                        case 1:
                            newCloud.source = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 2:
                            newCloud.diagnosis = td.InnerHtml.Replace("<br>", " ");
                            break;

                        case 3:
                            newCloud.atc3 = td.InnerText;
                            break;

                        case 4:
                            newCloud.atc5 = td.InnerText;
                            break;

                        case 5:
                            newCloud.comp = td.InnerText;
                            break;

                        case 6:
                            newCloud.NHI_code = td.InnerText;
                            break;

                        case 7:
                            newCloud.drug_name = td.InnerText;
                            break;

                        case 8:
                            newCloud.dosing = td.InnerText;
                            break;

                        case 9:
                            newCloud.days = td.InnerText;
                            break;

                        case 10:
                            newCloud.amt = td.InnerText;
                            break;

                        case 11:
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                newCloud.SDATE = d;
                            }
                            break;

                        case 12:
                            if (td.InnerText != string.Empty)
                            {
                                string[] temp_d = td.InnerText.Split('/');
                                DateTime.TryParse($"{int.Parse(temp_d[0]) + 1911}/{temp_d[1]}/{temp_d[2]}", out DateTime d);
                                newCloud.EDATE = d;
                            }
                            break;

                        case 13:
                            newCloud.o_source = td.InnerText;
                            break;
                        }
                        order_n++;
                    }
                    dc.tbl_cloudmed_temp.InsertOnSubmit(newCloud);
                    dc.SubmitChanges();
                    count++;
                }

                // 匯入大表
                try
                {
                    dc.sp_insert_tbl_cloudmed(current_date);
                }
                catch (Exception ex)
                {
                    log.Error($"        med of {strUID}, Error: {ex.Message}");
                    log.Error($"        Count: {count}; Order: {order_n}]");
                    Logging.Record_error(ex.Message);
                }
                try
                {
                    dc.sp_insert_p_cloudmed(current_date);
                }
                catch (Exception ex)
                {
                    log.Error($"        med of {strUID}, Error: {ex.Message}");
                    log.Error($"        Count: {count}; Order: {order_n}]");
                    Logging.Record_error(ex.Message);
                }
                // 這裡原本多了一次沒有try包覆的insert_p_cloudmed, 一但p_cloudmed有錯誤就沒辦法處理source
                // 處理source
                var r = (from p in dc.tbl_cloudmed_temp
                         where p.QDATE == current_date
                         select p.source).Distinct().ToList();  //this is a query
                for (int i = 0; i < r.Count(); i++)
                {
                    string[] s = r[i].Split(' ');
                    // source_id s(2).substring(1)
                    // class s(1).substring(1)
                    // source_name s(0)
                    var qq = from pp in dc.p_source
                             where pp.source_id == s[2].Substring(1)
                             select pp;
                    if (qq.Count() == 0)
                    {
                        p_source so = new p_source()
                        {
                            source_id   = s[2].Substring(1),
                            @class      = s[1].Substring(1),
                            source_name = s[0]
                        };
                        dc.p_source.InsertOnSubmit(so);
                        dc.SubmitChanges();
                    }
                }
                log.Debug($"        Exit Write_med. Current ID: {strUID}.");
                return(count);
            }
            catch (Exception ex)
            {
                log.Error($"        med of {strUID}, Error: {ex.Message}");
                log.Error($"        Count: {count}; Order: {order_n}]");
                log.Debug($"        Exit Write_med. Current ID: {strUID}.");
                return(0);
            }
        }