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); }
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_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); } }
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 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 執行 } }
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_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); } }
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); } }