Exemple #1
0
        public void Refresh_Data()
        {
            CSDataContext dc = new CSDataContext();

            // 20200522 add Companion Log in and out
            Admin = (from p in dc.log_Adm
                     where p.operation_name != "Log in" && p.operation_name != "Log out" && p.operation_name != "update opd" &&
                     p.operation_name != "update opd order" && p.operation_name != "OPD file format" &&
                     p.operation_name != "Change order data" && p.operation_name != "Add a new order" &&
                     p.operation_name != "Lab file format" && p.operation_name != "Change patient data" &&
                     p.operation_name != "Add a new patient" && p.operation_name != "Companion Log out" &&
                     p.operation_name != "Companion Log in"
                     orderby p.regdate descending
                     select new { p.regdate, p.operation_name, p.description }).Take(100);
            Err = (from p in dc.log_Err
                   orderby p.error_date descending
                   select new { p.error_date, p.error_message }).Take(100);
            OPD = (from p in dc.log_Adm
                   where p.operation_name == "update opd" || p.operation_name == "update opd order"
                   orderby p.regdate descending
                   select new { p.regdate, p.description }).Take(100);
            Order = (from p in dc.log_Adm
                     where p.operation_name == "Change order data" || p.operation_name == "Add a new order"
                     orderby p.regdate descending
                     select new { p.regdate, p.description }).Take(100);
            PT = (from p in dc.log_Adm
                  where p.operation_name == "Change patient data" || p.operation_name == "Add a new patient"
                  orderby p.regdate descending
                  select new { p.regdate, p.description }).Take(100);

            tb.ShowBalloonTip("完成", "訊息頁資料已更新", BalloonIcon.Info);
        }
        public void Refresh_Data()
        {
            CSDataContext dc = new CSDataContext();

            DataNoOrder = from p in dc.v_labdata_not_match_with_opd_order
                          orderby p.uid, p.l05
            select p;

            OrderNoData = from p in dc.v_opdorder_not_match_with_lab_record
                          orderby p.uid, p.SDATE
            select p;
        }
Exemple #3
0
        public void Execute(object parameter)
        {
            #region 進行配對

            CSDataContext dc = new CSDataContext();
            // 20190615 tbl_lab_record連結tbl_opd_order
            var q = from cs in dc.sp_match_lab(int.Parse(_lmVM.StrFrom), int.Parse(_lmVM.StrTO)).AsEnumerable()
                    select cs;
            int n = q.First().rows_affected;
            Logging.Record_admin("檢驗檔配對", $"{n}筆配對成功");

            #endregion 進行配對

            _lmVM.Refresh_Data();
        }
Exemple #4
0
        public void Refresh_Data()
        {
            CSDataContext dc = new CSDataContext();

            #region Function Page

            LogInOut = (from p in dc.log_Adm
                        where p.operation_name == "Log in" || p.operation_name == "Log out"
                        orderby p.regdate descending
                        select new { p.regdate, p.operation_name }).Take(100);
            // 20200522 add opd_import, for correct display
            OPD = (from p in dc.log_Adm
                   where p.operation_name == "add opd" || p.operation_name == "opd_import"
                   orderby p.regdate descending
                   select new { p.regdate }).Take(100);
            PT = (from p in dc.log_Adm
                  where p.operation_name == "病患檔案格式"
                  orderby p.regdate descending
                  select new { p.regdate }).Take(100);
            Order = (from p in dc.log_Adm
                     where p.operation_name == "計價檔格式"
                     orderby p.regdate descending
                     select new { p.regdate }).Take(100);
            Upload = (from p in dc.log_Adm
                      where p.operation_name == "健保上傳XML檔配對"
                      orderby p.regdate descending
                      select new { p.regdate }).Take(100);
            // 20200522 add PIJIA add/change, for correct display
            Pijia = (from p in dc.log_Adm
                     where p.operation_name == "新增批價檔: " || p.operation_name == "PIJIA add/change"
                     orderby p.regdate descending
                     select new { p.regdate }).Take(100);
            ChangeDepartment = (from p in dc.log_Adm
                                where p.operation_name == "change department"
                                orderby p.regdate descending
                                select new { p.regdate }).Take(100);
            Lab = (from p in dc.log_Adm
                   where p.operation_name == "Lab file format"
                   orderby p.regdate descending
                   select new { p.regdate }).Take(100);

            #endregion Function Page

            tb.ShowBalloonTip("完成", "主頁資料已更新", BalloonIcon.Info);
        }
        private void Matching()
        {
            #region 進行配對

            // 現再來配對, 使用Stored Procedure
            // 第一步Pijia配上CASENO
            // 第二步檢查CASENO是否1to1配上Pijia, 若是進行配對,並顯示正確,若否回傳錯誤幾筆,並且紀錄下來

            // 20200519 transcribed
            // 20190614 created
            // 目的是將tbl_pijia和tbl_opd配對起來
            // 分為兩步
            // 第一步將tbl_pijia配上CASENO
            CSDataContext dc = new CSDataContext();

            var q1 = from cs in dc.sp_CASENO_for_pijia().AsEnumerable()
                     select cs;
            string strOutput = $"{_begindate:d}_{_enddate:d}: {q1.First().rows_affected}筆配對";
            Logging.Record_admin("批價檔配對STEP1 Pijia", strOutput);
            log.Info($"批價檔配對STEP1 Pijia: {strOutput}");
            tb.ShowBalloonTip("批價檔配對STEP1 Pijia", strOutput, BalloonIcon.Info);
            var q2 = from pj in dc.sp_PIJIA_for_opd().AsEnumerable()
                     select pj;
            strOutput = string.Empty;
            foreach (var q in q2)
            {
                strOutput += $"{q.CASENO} {q.SDATE} {q.VIST} {q.RMNO} {q.bid} {q.cname};";
            }
            if (strOutput == string.Empty)
            {
                Logging.Record_admin("批價檔配對STEP2 OPD", "沒有重複");
                log.Info($"批價檔配對STEP2 OPD: 沒有重複");
                tb.ShowBalloonTip("批價檔配對STEP2 OPD", "沒有重複", BalloonIcon.Info);
            }
            else
            {
                strOutput += ";請修正後再上傳";
                Logging.Record_admin("批價檔配對STEP2 OPD", strOutput);
                log.Info($"批價檔配對STEP2 OPD: {strOutput}");
                tb.ShowBalloonTip("批價檔配對STEP2 OPD, CASE有重複值:", strOutput, BalloonIcon.Info);
            }

            #endregion 進行配對
        }
Exemple #6
0
 public static void Record_admin(string op, string des)
 {
     ///寫入作業訊息
     using (CSDataContext dc = new CSDataContext())
     {
         log_Adm newLog = new log_Adm()
         {
             regdate          = DateTime.Now,
             application_name = System.Reflection.Assembly.GetExecutingAssembly().FullName.Substring(0, 49),
             machine_name     = Dns.GetHostName(),
             ip_address       = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString(),
             userid           = "Ethan",
             operation_name   = op,
             description      = des
         };
         dc.log_Adm.InsertOnSubmit(newLog);
         dc.SubmitChanges();
     }
 }
Exemple #7
0
 public static void Record_error(string er)
 {
     ///created on 2020/03/28, transcribed from vb.net
     ///寫入錯誤訊息
     using (CSDataContext dc = new CSDataContext())
     {
         log_Err newErr = new log_Err()
         {
             error_date       = DateTime.Now,
             application_name = System.Reflection.Assembly.GetExecutingAssembly().FullName.Substring(0, 49),
             machine_name     = Dns.GetHostName(),
             ip_address       = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0].ToString(),
             userid           = "Ethan",
             error_message    = er
         };
         dc.log_Err.InsertOnSubmit(newErr);
         dc.SubmitChanges();
     }
 }
Exemple #8
0
        public void Build()
        {
            #region Declaration

            XmlDocument xdoc;     // TOTFA.xml
            XmlElement  xElement; // patient
            XmlElement  xChildElement;
            XmlElement  xElement2;
            XmlElement  xChildElement2;
            string      savepath;

            #endregion Declaration

            #region 寫入檔案路徑

            // 讀取要輸入的位置
            // 從杏翔病患資料輸入, 只有一種xml格式
            // Xml格式的index=2
            SaveFileDialog sFDialog = new SaveFileDialog
            {
                Filter   = "xml|*.xml",
                FileName = "TOTFA.xml"
            };

            if (sFDialog.ShowDialog() == true)
            {
                savepath = sFDialog.FileName;
            }
            else
            {
                // 取消, 什麼也沒有做
                return;
            }

            #endregion 寫入檔案路徑

            try
            {
                CSDataContext dc = new CSDataContext();
                var           q  = from pt in dc.sp_get_hdata(_strYM).AsEnumerable()
                                   select pt;
                // 建立一個 XmlDocument 物件並加入 Declaration
                xdoc = new XmlDocument();
                xdoc.AppendChild(xdoc.CreateXmlDeclaration("1.0", "big5", ""));
                // 建立根節點物件並加入 XmlDocument 中 (第0層)
                xElement      = xdoc.CreateElement("patient");
                xChildElement = xElement; // 這個舉動毫無意義,但可以避免錯誤訊息
                xdoc.AppendChild(xElement);
                // 在sections下寫入一個節點名稱為section(第1層)

                foreach (var p in q)
                {
                    if (p.r1 == 1)
                    {
                        xChildElement = xdoc.CreateElement("hdata");
                        xElement.AppendChild(xChildElement);     // patient下加個hdata
                        // 第2層節點
                        xElement2           = xdoc.CreateElement("h1");
                        xElement2.InnerText = p.h1;                   // h1 報告類別, 1:檢體檢驗報告
                        xChildElement.AppendChild(xElement2);         // hdata下加個h1
                        xElement2           = xdoc.CreateElement("h2");
                        xElement2.InnerText = p.h2;                   // h2 醫事機構代碼
                        xChildElement.AppendChild(xElement2);         // hdata下加個h2
                        xElement2           = xdoc.CreateElement("h3");
                        xElement2.InnerText = p.h3;                   // h3 醫事類別, 11:門診西醫診所
                        xChildElement.AppendChild(xElement2);         // hdata下加個h3
                        xElement2           = xdoc.CreateElement("h4");
                        xElement2.InnerText = p.h4;                   // h4 費用年月
                        xChildElement.AppendChild(xElement2);         // hdata下加個h4
                        xElement2           = xdoc.CreateElement("h5");
                        xElement2.InnerText = p.h5;                   // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h6");
                        xElement2.InnerText = p.h6;                   // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h7");
                        xElement2.InnerText = p.h7;                   // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h8");
                        xElement2.InnerText = p.h8.ToString();        // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h9");
                        xElement2.InnerText = p.h9;                   // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h10");
                        xElement2.InnerText = p.h10;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h11");
                        xElement2.InnerText = p.h11;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h17");
                        xElement2.InnerText = p.h17.ToString();       // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h18");
                        xElement2.InnerText = p.h18;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h19");
                        xElement2.InnerText = p.h19;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h20");
                        xElement2.InnerText = p.h20;                  //h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h22");
                        xElement2.InnerText = p.h22;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h23");
                        xElement2.InnerText = p.h23;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h25");
                        xElement2.InnerText = p.h25;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        xElement2           = xdoc.CreateElement("h26");
                        xElement2.InnerText = p.h26;                  // h5 申報類別, 1:送核
                        xChildElement.AppendChild(xElement2);         // hdata下加個h5
                        // 第3層節點
                        xChildElement2 = xdoc.CreateElement("rdata"); // rdata
                        xChildElement.AppendChild(xChildElement2);    // under hdata add rdata
                        xElement2           = xdoc.CreateElement("r1");
                        xElement2.InnerText = p.r1.ToString();
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r2");
                        xElement2.InnerText = p.r2;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r3");
                        xElement2.InnerText = p.r3;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r4");
                        xElement2.InnerText = p.r4;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r5");
                        xElement2.InnerText = p.r5;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r6-1");
                        xElement2.InnerText = p.r6a;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r6-2");
                        xElement2.InnerText = p.r6b;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r9");
                        xElement2.InnerText = p.r9;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r10");
                        xElement2.InnerText = p.r10;
                        xChildElement2.AppendChild(xElement2);
                    }
                    else
                    {
                        // 第3層節點
                        xChildElement2 = xdoc.CreateElement("rdata"); //rdata
                        xChildElement.AppendChild(xChildElement2);    //under hdata add rdata
                        xElement2           = xdoc.CreateElement("r1");
                        xElement2.InnerText = p.r1.ToString();
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r2");
                        xElement2.InnerText = p.r2;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r3");
                        xElement2.InnerText = p.r3;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r4");
                        xElement2.InnerText = p.r4;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r5");
                        xElement2.InnerText = p.r5;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r6-1");
                        xElement2.InnerText = p.r6a;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r6-2");
                        xElement2.InnerText = p.r6b;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r9");
                        xElement2.InnerText = p.r9;
                        xChildElement2.AppendChild(xElement2);
                        xElement2           = xdoc.CreateElement("r10");
                        xElement2.InnerText = p.r10;
                        xChildElement2.AppendChild(xElement2);
                    }
                }
                xdoc.Save(savepath);
                using (FileStream fs = new FileStream(savepath.Replace(".xml", ".zip"), FileMode.Create))
                    using (ZipArchive arch = new ZipArchive(fs, ZipArchiveMode.Create))
                    {
                        arch.CreateEntryFromFile(savepath, "TOTFA.xml");
                    }
                string output = $"{_strYM} 檢驗上傳XML製作完成.";
                log.Info(output);
                tb.ShowBalloonTip("完成!", $"{output}\r\n請上傳檔案.", BalloonIcon.Info);
                Logging.Record_admin("製作檢驗上傳檔案", output);
            }
            catch (System.Exception ex)
            {
                string output = $"{ex.Message} \r\n{ex.StackTrace}";
                log.Error(output);
                tb.ShowBalloonTip("錯誤!", output, BalloonIcon.Error);
            }
        }
        private async Task <PIJIAresult> WriteIntoSQL_async(object[,] data, string strYM)
        {
            // 20200519 獨立成一個副程式
            CSDataContext dc       = new CSDataContext();
            int           totalN   = data.GetUpperBound(0);
            int           add_N    = 0;
            int           change_N = 0;
            int           all_N    = 0;

            await Task.Run(() =>
            {
                for (int i = 2; i <= totalN; i++)
                {
                    // 找到KEY值, YM, bid: YM=strYM, bid=Item(1), 第二個值就是bid
                    // 查詢,看看是否有重複
                    // 沒有重複就是新增, 有重複就是修改
                    var q = from o in dc.tbl_pijia
                            where (o.YM == strYM) && (o.bid == (string)data[i, 2]) && (o.uid == (string)data[i, 14])
                            select o;
                    if (q.Count() == 0) // 資料庫裡面沒有 INSERT
                    {
                        // MedFee 有小數點, 所以要先變成double, 再變成int
                        tbl_pijia newPijia = new tbl_pijia()
                        {
                            YM            = strYM,
                            STATUS        = (string)data[i, header_order[1]],
                            bid           = (string)data[i, header_order[2]],
                            op            = (string)data[i, header_order[3]],
                            VDATE         = (string)data[i, header_order[4]] ?? string.Empty,
                            SDATE         = (string)data[i, header_order[5]],
                            VIST          = (string)data[i, header_order[6]],
                            RMNO          = (string)data[i, header_order[7]],
                            DEPTNAME      = (string)data[i, header_order[8]],
                            DOCTNAME      = (string)data[i, header_order[9]],
                            POSINAME      = (string)data[i, header_order[10]],
                            HEATH_CARD    = (string)data[i, header_order[11]] ?? string.Empty,
                            Youmian       = (string)data[i, header_order[12]] ?? string.Empty,
                            PAYNO         = (string)data[i, header_order[13]] ?? string.Empty,
                            uid           = (string)data[i, header_order[14]],
                            cname         = (string)data[i, header_order[15]],
                            MedFee        = (int)double.Parse((string)data[i, header_order[16]]),
                            RegFee        = int.Parse((string)data[i, header_order[17]]),
                            Copay         = int.Parse((string)data[i, header_order[18]]),
                            Deposit       = int.Parse((string)data[i, header_order[19]]),
                            SelfPay       = int.Parse((string)data[i, header_order[20]]),
                            PharmW        = int.Parse((string)data[i, header_order[21]]),
                            Arrears       = int.Parse((string)data[i, header_order[22]]),
                            Discount      = int.Parse((string)data[i, header_order[23]]),
                            AMTreceivable = int.Parse((string)data[i, header_order[24]]),
                            AMTreceived   = int.Parse((string)data[i, header_order[25]]),
                            bremark       = (string)data[i, header_order[26]] ?? string.Empty,
                            remark        = (string)data[i, header_order[27]] ?? string.Empty,
                            QDATE         = _qdate
                        };
                        // 20200526 加入QDATE
                        dc.tbl_pijia.InsertOnSubmit(newPijia);
                        dc.SubmitChanges();
                        add_N++;
                    }
                    else
                    {
                        // 資料庫裡已經有了, 檢查是否有異,有異UPDATE
                        tbl_pijia oldPijia = q.ToList()[0];     // this is a record
                        string strChange   = string.Empty;
                        bool bChange       = false;
                        if (oldPijia.STATUS != (string)data[i, header_order[1]])
                        {
                            strChange      += $";改狀態: {oldPijia.STATUS}=>{(string)data[i, header_order[1]]}";
                            bChange         = true;
                            oldPijia.STATUS = (string)data[i, header_order[1]];
                        }
                        if (oldPijia.op != (string)data[i, header_order[3]])
                        {
                            strChange  += $";改批價人員: {oldPijia.op}=>{(string)data[i, header_order[3]]}";
                            bChange     = true;
                            oldPijia.op = (string)data[i, header_order[3]];
                        }
                        if (oldPijia.VDATE != ((string)data[i, header_order[4]] ?? string.Empty))
                        {
                            strChange     += $";改作廢日期: {oldPijia.VDATE}=>{((string)data[i, header_order[4]] ?? string.Empty)}";
                            bChange        = true;
                            oldPijia.VDATE = ((string)data[i, header_order[4]] ?? string.Empty);
                        }
                        if (oldPijia.SDATE != (string)data[i, header_order[5]])
                        {
                            strChange     += $";改看診日期: {oldPijia.SDATE}=>{(string)data[i, header_order[5]]}";
                            bChange        = true;
                            oldPijia.SDATE = (string)data[i, header_order[5]];
                        }
                        if (oldPijia.VIST != (string)data[i, header_order[6]])
                        {
                            strChange    += $";改午別: {oldPijia.VIST}=>{(string)data[i, header_order[6]]}";
                            bChange       = true;
                            oldPijia.VIST = (string)data[i, header_order[6]];
                        }
                        if (oldPijia.RMNO != (string)data[i, header_order[7]])
                        {
                            strChange    += $";改診別: {oldPijia.RMNO}=>{(string)data[i, header_order[7]]}";
                            bChange       = true;
                            oldPijia.RMNO = (string)data[i, header_order[7]];
                        }
                        if (oldPijia.DEPTNAME != (string)data[i, header_order[8]])
                        {
                            strChange        += $";改科別: {oldPijia.DEPTNAME}=>{(string)data[i, header_order[8]]}";
                            bChange           = true;
                            oldPijia.DEPTNAME = (string)data[i, header_order[8]];
                        }
                        if (oldPijia.DOCTNAME != (string)data[i, header_order[9]])
                        {
                            strChange        += $";改醫師: {oldPijia.DOCTNAME}=>{(string)data[i, header_order[9]]}";
                            bChange           = true;
                            oldPijia.DOCTNAME = (string)data[i, header_order[9]];
                        }
                        if (oldPijia.POSINAME != (string)data[i, header_order[10]])
                        {
                            strChange        += $";改身分: {oldPijia.POSINAME}=>{(string)data[i, header_order[10]]}";
                            bChange           = true;
                            oldPijia.POSINAME = (string)data[i, header_order[10]];
                        }
                        if (oldPijia.HEATH_CARD != ((string)data[i, header_order[11]] ?? string.Empty))
                        {
                            strChange          += $";改就醫序號: {oldPijia.HEATH_CARD}=>{((string)data[i, header_order[11]] ?? string.Empty)}";
                            bChange             = true;
                            oldPijia.HEATH_CARD = ((string)data[i, header_order[11]] ?? string.Empty);
                        }
                        if (oldPijia.Youmian != ((string)data[i, header_order[12]] ?? string.Empty))
                        {
                            strChange       += $";改優免: {oldPijia.Youmian}=>{((string)data[i, header_order[12]] ?? string.Empty)}";
                            bChange          = true;
                            oldPijia.Youmian = ((string)data[i, header_order[12]] ?? string.Empty);
                        }
                        if (oldPijia.PAYNO != ((string)data[i, header_order[13]] ?? string.Empty))
                        {
                            strChange     += $";改部分負擔: {oldPijia.PAYNO}=>{((string)data[i, header_order[13]] ?? string.Empty)}";
                            bChange        = true;
                            oldPijia.PAYNO = ((string)data[i, header_order[13]] ?? string.Empty);
                        }
                        if (oldPijia.cname != (string)data[i, header_order[15]])
                        {
                            strChange     += $";改患者姓名: {oldPijia.cname}=>{(string)data[i, header_order[15]]}";
                            bChange        = true;
                            oldPijia.cname = (string)data[i, header_order[15]];
                        }
                        if (oldPijia.MedFee != (int)double.Parse((string)data[i, header_order[16]]))
                        {
                            strChange      += $";改醫療費用: {oldPijia.MedFee}=>{(string)data[i, header_order[16]]}";
                            bChange         = true;
                            oldPijia.MedFee = (int)double.Parse((string)data[i, header_order[16]]);
                        }
                        if (oldPijia.RegFee != int.Parse((string)data[i, header_order[17]]))
                        {
                            strChange      += $";改掛號費用: {oldPijia.RegFee}=>{(string)data[i, header_order[17]]}";
                            bChange         = true;
                            oldPijia.RegFee = int.Parse((string)data[i, header_order[17]]);
                        }
                        if (oldPijia.Copay != int.Parse((string)data[i, header_order[18]]))
                        {
                            strChange     += $";改部分負擔: {oldPijia.Copay}=>{(string)data[i, header_order[18]]}";
                            bChange        = true;
                            oldPijia.Copay = int.Parse((string)data[i, header_order[18]]);
                        }
                        if (oldPijia.Deposit != int.Parse((string)data[i, header_order[19]]))
                        {
                            strChange       += $";改押金: {oldPijia.Deposit}=>{(string)data[i, header_order[19]]}";
                            bChange          = true;
                            oldPijia.Deposit = int.Parse((string)data[i, header_order[19]]);
                        }
                        if (oldPijia.SelfPay != int.Parse((string)data[i, header_order[20]]))
                        {
                            strChange       += $";改自付金額: {oldPijia.SelfPay}=>{(string)data[i, header_order[20]]}";
                            bChange          = true;
                            oldPijia.SelfPay = int.Parse((string)data[i, header_order[20]]);
                        }
                        if (oldPijia.PharmW != int.Parse((string)data[i, header_order[21]]))
                        {
                            strChange      += $";改藥費加重: {oldPijia.PharmW}=>{(string)data[i, header_order[21]]}";
                            bChange         = true;
                            oldPijia.PharmW = int.Parse((string)data[i, header_order[21]]);
                        }
                        if (oldPijia.Arrears != int.Parse((string)data[i, header_order[22]]))
                        {
                            strChange       += $";改欠收: {oldPijia.Arrears}=>{(string)data[i, header_order[22]]}";
                            bChange          = true;
                            oldPijia.Arrears = int.Parse((string)data[i, header_order[22]]);
                        }
                        if (oldPijia.Discount != int.Parse((string)data[i, header_order[23]]))
                        {
                            strChange        += $";改折扣: {oldPijia.Discount}=>{(string)data[i, header_order[23]]}";
                            bChange           = true;
                            oldPijia.Discount = int.Parse((string)data[i, header_order[23]]);
                        }
                        if (oldPijia.AMTreceivable != int.Parse((string)data[i, header_order[24]]))
                        {
                            strChange += $";改應收金額: {oldPijia.AMTreceivable}=>{(string)data[i, header_order[24]]}";
                            bChange    = true;
                            oldPijia.AMTreceivable = int.Parse((string)data[i, header_order[24]]);
                        }
                        if (oldPijia.AMTreceived != int.Parse((string)data[i, header_order[25]]))
                        {
                            strChange           += $";改實收金額: {oldPijia.AMTreceived}=>{(string)data[i, header_order[25]]}";
                            bChange              = true;
                            oldPijia.AMTreceived = int.Parse((string)data[i, header_order[25]]);
                        }
                        if (oldPijia.bremark != ((string)data[i, header_order[26]] ?? string.Empty))
                        {
                            strChange       += $";改收據說明: {oldPijia.bremark}=>{((string)data[i, header_order[26]] ?? string.Empty)}";
                            bChange          = true;
                            oldPijia.bremark = ((string)data[i, header_order[26]] ?? string.Empty);
                        }
                        if (oldPijia.remark != ((string)data[i, header_order[27]] ?? string.Empty))
                        {
                            strChange      += $";改說明: {oldPijia.remark}=>{((string)data[i, header_order[27]] ?? string.Empty)}";
                            bChange         = true;
                            oldPijia.remark = ((string)data[i, header_order[27]] ?? string.Empty);
                        }
                        if (bChange)
                        {
                            // tbl_opd的Pijia欄位也要歸零
                            var r = from opd in dc.tbl_opd
                                    where opd.CASENO == oldPijia.CASENO
                                    select opd;
                            tbl_opd opdOPD = r.ToList()[0];
                            opdOPD.Pijia   = null;
                            // CASENO, G要歸零
                            oldPijia.CASENO = null;
                            oldPijia.G      = null;
                            // 做實改變
                            // 20200526 加入QDATE
                            oldPijia.QDATE = _qdate;
                            dc.SubmitChanges();
                            change_N++;
                            // 做記錄
                            Logging.Record_admin("修改批價資料", $"{strYM}-{(string)data[i, 13]}: {strChange}");
                        }
                    }
                    all_N++;
                }
            });

            return(new PIJIAresult()
            {
                NewPIJIA = add_N,
                ChangePIJIA = change_N,
                AllPIJIA = all_N
            });
        }
Exemple #10
0
        public void Transform()
        {
            // 檢查檔案格式
            // 檢查第一行的標題,看看是否符合
            string[] strT = new string[] { "", "身份證字號", "病患姓名", "出生日期", "性別", "原病歷號碼", "原就醫日期",
                                           "檢驗單工號", "開單日(收件日)", "開單時間", "檢驗日期", "報告日期", "報告時間",
                                           "就醫序號" };
            for (int i = 1; i <= strT.Length; i++)
            {
                if (strT[i - 1] != ((string)_data[1, i] ?? string.Empty))
                {
                    // 寫入Error Log
                    Logging.Record_error("輸入的常誠檢驗資料檔案格式不對");
                    log.Error("輸入的常誠檢驗資料檔案格式不對");
                    tb.ShowBalloonTip("錯誤", "輸入的常誠檢驗資料檔案格式不對", BalloonIcon.Error);
                    return;
                }
            }

            // 通過測試
            Logging.Record_admin("Lab file format", "correct");
            log.Info("輸入的常誠檢驗資料檔案格式正確");
            tb.ShowBalloonTip("正確", "常誠檢驗檔案格式正確", BalloonIcon.Info);

            // 要有迴路, 來讀一行一行的xls, 能夠判斷
            // 檔案結構複雜, 不好用for next, 應該用while
            // 一次性讀檔, 不用update
            // totalN+1 是excel檔的總rows數
            int           totalN = _data.GetUpperBound(0) - 1;
            int           ind    = 1; // index, 從第二行開始
            string        strUid = string.Empty;
            string        strLid = string.Empty;
            DateTime      dL05   = DateTime.Parse("1901/01/01");
            CSDataContext dc     = new CSDataContext();

            while (ind <= totalN)
            {
                ind++; //next line
                if ((string)_data[ind, 1] == "***")
                {
                    try
                    {
                        // 檢驗單工號, 第8欄, 檢查是否空白, 空白不行
                        if (_data[ind, 8].ToString().Length == 0 || _data[ind, 2].ToString().Length == 0 ||
                            !DateTime.TryParse((string)_data[ind, 12], out DateTime d1))
                        {
                            strUid = string.Empty;
                            dL05   = DateTime.Parse("1901/01/01");
                            strLid = string.Empty;
                            // 寫入Error Log
                            string output = "輸入檢驗資料時,缺少檢驗單工號,或身分證字號, 或沒有報告日期";
                            Logging.Record_error(output);
                            log.Error(output);
                            continue; // continue while就可以跳下一行
                        }
                        else
                        {
                            strLid = _data[ind, 8].ToString().Trim();
                            var La = from l in dc.tbl_lab
                                     where l.lid == strLid
                                     select l;   // a query for searching duplicates
                            if (La.Count() != 0) //如果有重複,不但這行不要讀了, 連帶後面也都不要讀(strLid=""), 直到下次"***"
                            {
                                strUid = string.Empty;
                                dL05   = DateTime.Parse("1901/01/01");
                                strLid = string.Empty;
                                continue; //跳下一行
                            }
                            // 身分證字號, 第2欄, 檢查是否空白, 空白不行
                            strUid = _data[ind, 2].ToString().Trim();
                            // 報告日期, 第12欄, 檢查是否空白, 空白不行
                            dL05 = d1;
                            // 檢查檢驗單工號是否存在,如果有就不要存了
                        }

                        // 寫入資料庫tbl_Lab, uid, lid, cname, bd, mf, cid, l01, l02, l03, l04, l05, l06
                        // 有些變數共用uid, lid, l05
                        //l01, 原就醫日期,刻意留白, 第7欄
                        tbl_lab newLb = new tbl_lab()
                        {
                            uid   = strUid,                                            //身分證字號,第2欄
                            cname = _data[ind, 3].ToString().Trim(),                   //病患姓名, 第3欄
                            mf    = _data[ind, 5].ToString().Trim(),                   //性別,第5欄
                            cid   = _data[ind, 6].ToString().Trim(),                   //原病歷號碼,第6欄
                            lid   = strLid,                                            //檢驗單工號, 第8欄
                            l03   = _data[ind, 10].ToString().Trim(),                  //開單時間, 第10欄
                            l05   = dL05,                                              //報告日期, 第12欄
                            l06   = _data[ind, 13].ToString().Trim()                   //報告時間,第13欄
                        };
                        if (DateTime.TryParse((string)_data[ind, 4], out DateTime d2)) //出生日期, 第4欄
                        {
                            newLb.bd = d2;
                        }
                        if (DateTime.TryParse((string)_data[ind, 9], out DateTime d3))  //開單日(收件日), 第9欄
                        {
                            newLb.l02 = d3;
                        }
                        if (DateTime.TryParse((string)_data[ind, 11], out DateTime d4))  //檢驗日期, 第11欄
                        {
                            newLb.l04 = d4;
                        }

                        dc.tbl_lab.InsertOnSubmit(newLb);
                        dc.SubmitChanges();
                    }
                    catch (Exception ex)
                    {
                        // 寫入錯誤訊息
                        Logging.Record_error(ex.Message);
                        log.Error(ex.Message);
                    }
                }
                else
                {
                    try
                    {
                        //如果沒讀過"***"就略過,以防檔案有錯
                        if (strLid.Length == 0 || strUid.Length == 0 || dL05 == DateTime.Parse("1901/01/01"))
                        {
                            continue;
                        }

                        // 寫入資料庫tbl_Lab_record: uid, lid, l05, iid, l07
                        tbl_lab_record newLbrd = new tbl_lab_record()
                        {
                            uid = strUid,                          //身分證字號
                            lid = strLid,                          //檢驗單工號
                            l05 = dL05,                            //報告日期
                            iid = _data[ind, 1].ToString().Trim(), //檢驗代碼, 第1欄
                            l07 = _data[ind, 4].ToString().Trim(), //檢驗值, 第4欄
                            l09 = _data[ind, 5].ToString().Trim()  //異常, 第5欄
                        };
                        dc.tbl_lab_record.InsertOnSubmit(newLbrd);
                        // 寫入資料庫p_lab_temp: l05, iid, l08, l09, l10, l11
                        p_lab_temp newTemp = new p_lab_temp()
                        {
                            l05 = dL05,                            //報告日期
                            iid = _data[ind, 1].ToString().Trim(), //檢驗代碼, 第1欄
                            l08 = _data[ind, 2].ToString().Trim(), //檢驗名稱, 第2欄
                            l10 = _data[ind, 6].ToString().Trim(), //單位, 第6欄
                            l11 = _data[ind, 7].ToString().Trim()  //參考值, 第7欄
                        };
                        dc.p_lab_temp.InsertOnSubmit(newTemp);
                        dc.SubmitChanges();
                    }
                    catch (Exception ex)
                    {
                        // 寫入錯誤訊息
                        Logging.Record_error(ex.Message);
                        log.Error(ex.Message);
                    }
                }
            }

            this.Dispose();
        }
Exemple #11
0
        private async Task <PTresult> ImportPT_async(object[,] data, IProgress <ProgressReportModel> progress, ProgressReportModel report)
        {
            int totalN   = data.GetUpperBound(0);
            int add_N    = 0;
            int change_N = 0;
            int all_N    = 0;

            await Task.Run(() =>
            {
                log.Info($"    enter ImportPT_async.");
                // 要有迴路, 來讀一行一行的xls, 能夠判斷
                for (int i = 0; i <= totalN; i++)
                {
                    // 先判斷是否已經在資料表中, 如果不是就insert否則判斷要不要update
                    // 如何判斷是否已經在資料表中?
                    CSDataContext dc = new CSDataContext();
                    string strUID    = string.Empty;
                    // 先判斷身分證字號是否空白, 原本第8, 現在第7
                    if (string.IsNullOrEmpty((string)data[i, 7]))
                    {
                        // 寫入Error Log
                        // 沒有身分證字號是不行的
                        Logging.Record_error("身分證字號是空的");
                        log.Error("身分證字號是空的");
                        return;
                    }
                    // 再判斷是否已在資料表中
                    strUID = (string)data[i, 7];    //身分證號,第7欄
                    var pt = from p in dc.tbl_patients
                             where p.uid == strUID
                             select p;    // this is a querry
                    if (pt.Count() == 0)
                    {
                        // insert
                        // 沒這個人可以新增這個人
                        // 填入資料
                        try
                        {
                            tbl_patients newPt = new tbl_patients();
                            if (string.IsNullOrEmpty((string)data[i, 0]))
                            {
                                // 寫入Error Log
                                Logging.Record_error($"{strUID} 沒有病歷號碼");
                                log.Error($"{strUID} 沒有病歷號碼");
                            }
                            else
                            {
                                newPt.cid = long.Parse((string)data[i, 0]); // 病歷號, 第1欄
                            }
                            newPt.uid = strUID;                             // 身分證號,第8欄
                            if (string.IsNullOrEmpty((string)data[i, 1]))
                            {
                                // 寫入Error Log
                                Logging.Record_error($"{strUID} 沒有姓名");
                                log.Error($"{strUID} 沒有姓名");
                            }
                            else
                            {
                                newPt.cname = (string)data[i, 1]; //姓名,第2欄
                            }
                            newPt.mf = (string)data[i, 2];        // 性別, 第3欄
                            if (string.IsNullOrEmpty((string)data[i, 8]))
                            {
                                // 寫入Error Log
                                Logging.Record_error($"{strUID} 沒有生日資料");
                                log.Error($"{strUID} 沒有生日資料");
                            }
                            else
                            {
                                string strD = (string)data[i, 8];   // 生日, 第9欄
                                newPt.bd    = DateTime.Parse($"{strD.Substring(0, 4)}/{strD.Substring(4, 2)}/{strD.Substring(6, 2)}");
                            }
                            newPt.p01   = (string)data[i, 3];  // 市內電話, 第4欄
                            newPt.p02   = (string)data[i, 4];  // 手機電話, 第5欄
                            newPt.p03   = (string)data[i, 9];  // 地址,第10欄
                            newPt.p04   = (string)data[i, 10]; // 提醒,第11欄
                            newPt.QDATE = _qdate;
                            // 2020026新增QDATE

                            dc.tbl_patients.InsertOnSubmit(newPt);
                            dc.SubmitChanges();

                            // 20190929 加姓名, 病歷號
                            Logging.Record_admin("Add a new patient", $"{data[i, 0]} {strUID} {data[i, 1]}");
                            log.Info($"Add a new patient: {data[i, 0]} {strUID} {data[i, 1]}");
                            add_N++;
                        }
                        catch (Exception ex)
                        {
                            Logging.Record_error(ex.Message);
                            log.Error(ex.Message);
                        }
                    }
                    else
                    {
                        // update
                        // 有此人喔, 走update方向
                        // 拿pt比較ws.cells(i),如果不同就修改,並且記錄
                        tbl_patients oldPt = (from p in dc.tbl_patients
                                              where p.uid == strUID
                                              select p).ToList()[0];     // this is a record
                        string strChange = string.Empty;
                        bool bChange     = false;
                        try
                        {
                            // 病歷號, 20200512加上修改病歷號
                            if (string.IsNullOrEmpty((string)data[i, 0]))
                            {
                                // 寫入Error Log
                                Logging.Record_error($"{strUID} 沒有病歷號碼");
                                log.Error($"{strUID} 沒有病歷號碼");
                            }
                            else if (oldPt.cid != long.Parse((string)data[i, 0]))
                            {
                                strChange += $"改病歷號: {oldPt.cid}=>{data[i, 0]}; ";
                                bChange    = true;
                                oldPt.cid  = long.Parse((string)data[i, 0]); // 病歷號, 第1欄
                            }
                            // 姓名
                            if (string.IsNullOrEmpty((string)data[i, 1]))
                            {
                                // 寫入Error Log
                                Logging.Record_error(strUID + " 沒有姓名");
                                log.Error($"{strUID} 沒有姓名");
                            }
                            else if (oldPt.cname != (string)data[i, 1])
                            {
                                strChange  += $"改名: {oldPt.cname}=>{data[i, 1]}; ";
                                bChange     = true;
                                oldPt.cname = (string)data[i, 1];  // 姓名,第2欄
                            }
                            // 性別
                            if (oldPt.mf != (string)data[i, 2])
                            {
                                strChange += $"改性別: {oldPt.mf}=>{data[i, 2]}; ";
                                bChange    = true;
                                oldPt.mf   = (string)data[i, 2]; // 性別, 第3欄
                            }
                            // 生日
                            if (string.IsNullOrEmpty((string)data[i, 8]))
                            {
                                // 寫入Error Log
                                Logging.Record_error($"{strUID} 沒有生日資料");
                                log.Error($"{strUID} 沒有生日資料");
                            }
                            else
                            {
                                string strBD = (string)data[i, 8];   // 生日, 第9欄
                                DateTime dBD = DateTime.Parse($"{strBD.Substring(0, 4)}/{strBD.Substring(4, 2)}/{strBD.Substring(6, 2)}");
                                if (oldPt.bd != dBD)
                                {
                                    strChange += $"改生日: {oldPt.bd}=>{dBD}; ";
                                    bChange    = true;
                                    oldPt.bd   = dBD; // 生日,第9欄
                                }
                            }
                            // 市內電話
                            if ((oldPt.p01 ?? string.Empty) != ((string)data[i, 3] ?? string.Empty))
                            {
                                strChange += $"改市內電話: {oldPt.p01}=>{data[i, 3]}; ";
                                bChange    = true;
                                oldPt.p01  = (string)data[i, 3]; // 市內電話,第4欄
                            }

                            // 手機電話
                            if ((oldPt.p02 ?? string.Empty) != ((string)data[i, 4] ?? string.Empty))
                            {
                                strChange += $"改手機電話: {oldPt.p02}=>{data[i, 4]}; ";
                                bChange    = true;
                                oldPt.p02  = (string)data[i, 4]; // 手機電話,第5欄
                            }

                            // 地址
                            if ((oldPt.p03 ?? string.Empty) != ((string)data[i, 9] ?? string.Empty))
                            {
                                strChange += $"改地址: {oldPt.p03}=>{data[i, 9]}; ";
                                bChange    = true;
                                oldPt.p03  = (string)data[i, 9]; // 地址,第10欄
                            }

                            // 提醒
                            if ((oldPt.p04 ?? string.Empty) != ((string)data[i, 10] ?? string.Empty))
                            {
                                strChange += $"改提醒: {oldPt.p04}=>{data[i, 10]}; ";
                                bChange    = true;
                                oldPt.p04  = (string)data[i, 10]; // 提醒,第11欄
                            }

                            if (bChange)
                            {
                                // 做實改變
                                // 2020026新增QDATE
                                oldPt.QDATE = _qdate;
                                dc.SubmitChanges();
                                // 做記錄
                                // 20190929 加姓名, 病歷號
                                Logging.Record_admin("Change patient data", $"{data[i, 0]} {strUID} {data[i, 1]}: {strChange}");
                                log.Info($"Change patient data: {data[i, 0]} {strUID} {data[i, 1]}: {strChange}");
                                change_N++;
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.Record_error(ex.Message);
                            log.Error(ex.Message);
                        }
                    }
                    all_N++;
                    report.PercentageComeplete = all_N * 100 / totalN;
                    progress.Report(report);
                }
                log.Info($"    exit ImportPT_async.");
            });

            return(new PTresult()
            {
                NewPT = add_N,
                ChangePT = change_N,
                AllPT = all_N
            });
        }
Exemple #12
0
        public void Transform()
        {
            #region 宣告

            DataSet ds = new DataSet();
            System.Data.DataTable dtO = new System.Data.DataTable();
            System.Data.DataTable dtP = new System.Data.DataTable();
            int new_opd_N             = 0;
            int change_opd_N          = 0;
            int change_order_N        = 0;
            int total_rows            = 0;

            #endregion 宣告

            #region 整理datatable

            //整理datatable, 分拆成兩個, 一旦可以通過,那這個檔案應該沒有問題,如果有問題,就不是正確的檔案

            try
            {
                ds.ReadXml(_loadpath, XmlReadMode.ReadSchema);
                dtP = ds.Tables[0];  // dtP for tbl_opd_order, P stands for prescription
                dtP.Columns.Remove("STATUS");
                dtP.Columns.Remove("REGNO");
                dtP.Columns.Remove("PNAME");
                dtP.Columns.Remove("SEX");
                dtP.Columns.Remove("BIRTH");
                dtP.Columns.Remove("ORI_TOTAL");
                dtP.Columns.Remove("TOTAL");
                dtP.Columns.Remove("AMT8");
                dtP.Columns.Remove("RECT_NO");
                dtO = dtP.Copy();
                // 移除dtO不必要欄位, 先轉移給暫存檔, 因為要distinct, O stands for OPD
                dtO.Columns.Remove("CODE");
                dtO.Columns.Remove("ENAME");
                dtO.Columns.Remove("TIMES_DAY");
                dtO.Columns.Remove("METHODE");
                dtO.Columns.Remove("TIME_QTY1");
                dtO.Columns.Remove("DAYS");
                dtO.Columns.Remove("BILL_QTY");
                dtO.Columns.Remove("CHRONIC");
                dtO.Columns.Remove("PUT_TYPE");
                dtO.Columns.Remove("HC");
                dtO.Columns.Remove("PRICE");
                dtO.Columns.Remove("AMT");
                dtO.Columns.Remove("ORI_AMT");
                dtO.Columns.Remove("CLASS");
                dtO.Columns.Remove("PRN_CODE");
                dtO.Columns.Remove("RESULT");
                // 移除dtP不需要的欄位(for tbl_opd_order)
                dtP.Columns.Remove("VIST");
                dtP.Columns.Remove("RMNO");
                dtP.Columns.Remove("DEPTNAME");
                dtP.Columns.Remove("DOCTNAME");
                dtP.Columns.Remove("POSINAME");
                dtP.Columns.Remove("PAYNO");
                dtP.Columns.Remove("HEATH_CARD");
                dtP.Columns.Remove("STEXT");
                dtP.Columns.Remove("OTEXT");
                dtP.Columns.Remove("ICDCODE1");
                dtP.Columns.Remove("ICDCODE2");
                dtP.Columns.Remove("ICDCODE3");
                dtO = dtO.DefaultView.ToTable(true, new string[] { "CASENO", "SDATE", "VIST", "RMNO", "DEPTNAME", "DOCTNAME",
                                                                   "IDNO", "POSINAME", "PAYNO", "HEATH_CARD", "STEXT", "OTEXT", "ICDCODE1", "ICDCODE2",
                                                                   "ICDCODE3" }); // true stands for distinct
            }
            catch (Exception ex)
            {
                Logging.Record_error(ex.Message);
                log.Error(ex.Message);
                tb.ShowBalloonTip("錯誤!", ex.Message, BalloonIcon.Error);
                return;
            }

            // 通過測試
            total_rows = dtO.Rows.Count;
            Logging.Record_admin("OPD file format", $"correct, {total_rows} records.");
            log.Info($"OPD XML 檔案格式正確, 共{total_rows}筆.");
            tb.ShowBalloonTip("正確", $"OPD XML 檔案格式正確, 共{total_rows}筆.", BalloonIcon.Info);

            #endregion 整理datatable

            #region 進行讀取資料

            //Main.ProgressBar1.Minimum = 1
            //Main.ProgressBar1.Maximum = totalN
            CSDataContext dc = new CSDataContext();

            // 開始回圈
            foreach (DataRow dtO_Row in dtO.Rows)
            {
                //Main.ProgressBar1.Value = i + 1  // 顯示一下進度
                // 檢查案號是否已經在資料庫中, dtO.CASENO, tbl_opd.CASENO
                string strCASENO = (string)dtO_Row["CASENO"];
                if (string.IsNullOrEmpty(strCASENO))
                {
                    Logging.Record_error("在輸入門診資料時, 缺少案號CASENO");
                    log.Error("在輸入門診資料時, 缺少案號CASENO");
                    tb.ShowBalloonTip("錯誤!", "在輸入門診資料時, 缺少案號CASENO", BalloonIcon.Error);
                    // 下一個
                    continue;
                }

                var q = from o in dc.tbl_opd
                        where o.CASENO == strCASENO
                        select o;
                if (q.Count() == 0) // 資料庫裡面沒有 INSERT
                {
                    try
                    {
                        tbl_opd newOPD = new tbl_opd()
                        {
                            CASENO     = strCASENO,                           // CASENO
                            VIST       = (string)dtO_Row["VIST"],             // VIST
                            RMNO       = byte.Parse((string)dtO_Row["RMNO"]), // RMNO
                            uid        = (string)dtO_Row["IDNO"],             // uid
                            DEPTNAME   = (string)dtO_Row["DEPTNAME"],         // DEPTNAME
                            DOCTNAME   = (string)dtO_Row["DOCTNAME"],         // DOCTNAME
                            POSINAME   = (string)dtO_Row["POSINAME"],         // POSINAME
                            PAYNO      = (string)dtO_Row["PAYNO"],            // PAYNO
                            HEATH_CARD = (string)dtO_Row["HEATH_CARD"],       // HEATH_CARD
                            ICDCODE1   = (string)dtO_Row["ICDCODE1"],         // ICDCODE1
                            ICDCODE2   = (string)dtO_Row["ICDCODE2"],         // ICDCODE2
                            ICDCODE3   = (string)dtO_Row["ICDCODE3"],         // ICDCODE3
                            INS_CODE   = "A",                                 // INS_CODE, default value "A"
                            STEXT      = (string)dtO_Row["STEXT"],            // STEXT
                            OTEXT      = (string)dtO_Row["OTEXT"],            // OTEXT
                            QDATE      = _qdate                               // 20200526 加入
                        };

                        string tempstr;
                        tempstr = dtO_Row["SDATE"].ToString();
                        if (DateTime.TryParse($"{tempstr.Substring(0, 4)}/{tempstr.Substring(4, 2)}/{tempstr.Substring(6, 2)}", out DateTime temp_date))
                        {
                            newOPD.SDATE = temp_date;
                        }
                        dc.tbl_opd.InsertOnSubmit(newOPD);
                        dc.SubmitChanges();
                        new_opd_N++;

                        // tbl_opd沒有資料, tbl_opd_order就一定沒有資料, 所以要加入, 這裡的挑戰是要加上醫令序
                        // datatable 此時不能使用LINQ查詢
                        List <DataRow> q2 = dtP.Select("CASENO='" + strCASENO + "'").ToList();

                        // 處理tbl_opd_order部分
                        int j = 1;
                        foreach (DataRow dtP_Row in q2)
                        {
                            tbl_opd_order newPr = new tbl_opd_order()
                            {
                                CASENO    = strCASENO,
                                uid       = (string)dtO_Row["IDNO"],
                                SDATE     = temp_date,
                                OD_idx    = (byte)(j + 1),
                                rid       = (string)dtP_Row["CODE"],      //CODE
                                TIMES_DAY = (string)dtP_Row["TIMES_DAY"], //TIMES_DAY
                                METHOD    = (string)dtP_Row["METHODE"],   //METHOD
                                TIME_QTY1 = (string)dtP_Row["TIME_QTY1"], //TIME_QTY1
                                DAYS      = (string)dtP_Row["DAYS"],      //DAYS
                                BILL_QTY  = (string)dtP_Row["BILL_QTY"],  //BILL_QTY
                                HC        = (string)dtP_Row["HC"],        //HC
                                PRICE     = (string)dtP_Row["PRICE"],     //PRICE
                                AMT       = (string)dtP_Row["AMT"],       //AMT
                                CLASS     = (string)dtP_Row["CLASS"],     //CLASS
                                CHRONIC   = (string)dtP_Row["CHRONIC"],   //CHRONIC
                                QDATE     = _qdate                        // 20200526 加入
                            };
                            dc.tbl_opd_order.InsertOnSubmit(newPr);
                            dc.SubmitChanges();
                            j++;
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Error(ex.Message);
                        tb.ShowBalloonTip("錯誤!", ex.Message, BalloonIcon.Error);
                        Logging.Record_error(ex.Message);
                    }
                }
                else    // 資料庫裡已經有了, 檢查是否有異,有異UPDATE
                {
                    // 先處理tbl_opd部分
                    tbl_opd oldOPD = (from p in dc.tbl_opd
                                      where p.CASENO == strCASENO
                                      select p).ToList()[0];     // this is a record
                    string strChange = string.Empty;
                    bool   bChange   = false;

                    try
                    {
                        string tempstr = string.Empty;
                        if (oldOPD.DEPTNAME != (string)dtO_Row["DEPTNAME"])
                        {
                            strChange      += $"改科別: {oldOPD.DEPTNAME} => {dtO_Row["DEPTNAME"]}";
                            bChange         = true;
                            oldOPD.DEPTNAME = (string)dtO_Row["DEPTNAME"]; // DEPTNAME
                        }

                        if (oldOPD.DOCTNAME != (string)dtO_Row["DOCTNAME"])
                        {
                            strChange      += $"改醫師: {oldOPD.DOCTNAME} => {dtO_Row["DOCTNAME"]}";
                            bChange         = true;
                            oldOPD.DOCTNAME = (string)dtO_Row["DOCTNAME"]; //DOCTNAME
                        }

                        if (oldOPD.POSINAME != (string)dtO_Row["POSINAME"])
                        {
                            strChange      += $"改身分: {oldOPD.POSINAME} => {dtO_Row["POSINAME"]}";
                            bChange         = true;
                            oldOPD.POSINAME = (string)dtO_Row["POSINAME"]; //POSINAME
                        }

                        if (oldOPD.PAYNO != (string)dtO_Row["PAYNO"])
                        {
                            strChange   += $"改負擔: {oldOPD.PAYNO} => {dtO_Row["PAYNO"]}";
                            bChange      = true;
                            oldOPD.PAYNO = (string)dtO_Row["PAYNO"];  //PAYNO
                        }

                        if (oldOPD.HEATH_CARD != (string)dtO_Row["HEATH_CARD"])
                        {
                            strChange        += $"改卡號: {oldOPD.HEATH_CARD} => {dtO_Row["HEATH_CARD"]}";
                            bChange           = true;
                            oldOPD.HEATH_CARD = (string)dtO_Row["HEATH_CARD"]; //HEATH_CARD
                        }

                        if (oldOPD.ICDCODE1 != (string)dtO_Row["ICDCODE1"])
                        {
                            strChange      += $"改診斷1: {oldOPD.ICDCODE1} => {dtO_Row["ICDCODE1"]}";
                            bChange         = true;
                            oldOPD.ICDCODE1 = (string)dtO_Row["ICDCODE1"]; //ICDCODE1
                        }

                        if (oldOPD.ICDCODE2 != (string)dtO_Row["ICDCODE2"])
                        {
                            strChange      += $"改診斷2: {oldOPD.ICDCODE2} => {dtO_Row["ICDCODE2"]}";
                            bChange         = true;
                            oldOPD.ICDCODE2 = (string)dtO_Row["ICDCODE2"]; //ICDCODE2
                        }

                        if (oldOPD.ICDCODE3 != (string)dtO_Row["ICDCODE3"])
                        {
                            strChange      += $"改診斷3: {oldOPD.ICDCODE3} => {dtO_Row["ICDCODE3"]}";
                            bChange         = true;
                            oldOPD.ICDCODE3 = (string)dtO_Row["ICDCODE3"]; //ICDCODE3
                        }

                        if (bChange == true)
                        {
                            // 做實改變
                            oldOPD.QDATE = _qdate;
                            dc.SubmitChanges();
                            change_opd_N++;
                            // 做記錄
                            Logging.Record_admin("update opd", $"{strCASENO}: {strChange}");
                        }
                    }
                    catch (Exception ex)
                    {
                        log.Error(strCASENO + ex.Message);
                        tb.ShowBalloonTip("錯誤!", strCASENO + ex.Message, BalloonIcon.Error);
                        Logging.Record_error(strCASENO + ex.Message);
                    }

                    // 再處理tbl_opd_order部分
                    // 先製造兩個list of tbl_opd_order
                    List <Prescription> oldPre = (from d in dc.tbl_opd_order
                                                  where d.CASENO == strCASENO
                                                  orderby d.rid, d.TIMES_DAY
                                                  select new Prescription()
                    {
                        CASENO = d.CASENO,
                        Rid = d.rid,
                        TIMES_DAY = d.TIMES_DAY,
                        METHOD = d.METHOD,
                        TIME_QTY1 = d.TIME_QTY1,
                        DAYS = d.DAYS,
                        BILL_QTY = d.BILL_QTY,
                        HC = d.HC,
                        PRICE = d.PRICE,
                        AMT = d.AMT,
                        CLAS = d.CLASS,
                        CHRONIC = d.CHRONIC
                    }).ToList();
                    List <Prescription> newPre = new List <Prescription>();
                    List <DataRow>      q2     = dtP.Select($"CASENO='{strCASENO}'", "CODE, TIMES_DAY").ToList();
                    // 這個r.count一定大於等於1

                    // 處理tbl_opd_order部分
                    int totalP = q2.Count();
                    for (int j = 0; j < totalP; j++)
                    {
                        Prescription newP = new Prescription()
                        {
                            CASENO    = strCASENO,
                            Rid       = (string)q2[j]["CODE"],      //CODE
                            TIMES_DAY = (string)q2[j]["TIMES_DAY"], //TIMES_DAY
                            METHOD    = (string)q2[j]["METHODE"],   //METHOD
                            TIME_QTY1 = (string)q2[j]["TIME_QTY1"], //TIME_QTY1
                            DAYS      = (string)q2[j]["DAYS"],      //DAYS
                            BILL_QTY  = (string)q2[j]["BILL_QTY"],  //BILL_QTY
                            HC        = (string)q2[j]["HC"],        //HC
                            PRICE     = (string)q2[j]["PRICE"],     //PRICE
                            AMT       = (string)q2[j]["AMT"],       //AMT
                            CLAS      = (string)q2[j]["CLASS"],     //CLASS
                            CHRONIC   = (string)q2[j]["CHRONIC"]    //CHRONIC
                        };
                        newPre.Add(newP);
                    }
                    // Now we have 2 lists now, but lists are only references
                    // 先比較兩者是否相同, 相同則跳下一筆
                    string strT = Exact(oldPre, newPre);
                    if (strT.Length != 0) // "" stands for identical
                    {
                        // 若不同則找出哪裡不同, 記錄下來
                        Logging.Record_admin("update opd order", $"{strCASENO}: {strT}");
                        // 最後把舊的刪掉, 插入新的

                        // 刪掉舊的
                        var q3 = from p in dc.tbl_opd_order
                                 where p.CASENO == strCASENO
                                 select p;
                        foreach (tbl_opd_order pr in q3)
                        {
                            dc.tbl_opd_order.DeleteOnSubmit(pr);
                        }
                        dc.SubmitChanges();
                        // 插入新的
                        // datatable 此時不能使用LINQ查詢
                        List <DataRow> q4 = dtP.Select($"CASENO='{strCASENO}'").ToList();

                        // 處理tbl_opd_order部分
                        int totalPr = q4.Count;
                        for (int j = 0; j < totalPr; j++)
                        {
                            tbl_opd_order newPr = new tbl_opd_order()
                            {
                                CASENO    = strCASENO,
                                uid       = oldOPD.uid,
                                SDATE     = oldOPD.SDATE,
                                OD_idx    = (byte)(j + 1),
                                rid       = (string)q4[j]["CODE"],      //CODE
                                TIMES_DAY = (string)q4[j]["TIMES_DAY"], //TIMES_DAY
                                METHOD    = (string)q4[j]["METHODE"],   //METHOD
                                TIME_QTY1 = (string)q4[j]["TIME_QTY1"], //TIME_QTY1
                                DAYS      = (string)q4[j]["DAYS"],      //DAYS
                                BILL_QTY  = (string)q4[j]["BILL_QTY"],  //BILL_QTY
                                HC        = (string)q4[j]["HC"],        //HC
                                PRICE     = (string)q4[j]["PRICE"],     //PRICE
                                AMT       = (string)q4[j]["AMT"],       //AMT
                                CLASS     = (string)q4[j]["CLASS"],     //CLASS
                                CHRONIC   = (string)q4[j]["CHRONIC"],   //CHRONIC
                                QDATE     = _qdate                      // 20200526加入
                            };
                            dc.tbl_opd_order.InsertOnSubmit(newPr);
                            dc.SubmitChanges();
                        }
                        change_order_N++;
                    }
                }
            }
            // 這樣的add opd沒什麼用
            //        Record_adm("add opd", dtO.TableName)
            string summary = $"一共讀取{new_opd_N}筆新門診紀錄, 更改{change_opd_N}筆門診紀錄, 更改{change_order_N}筆醫令.";
            tb.ShowBalloonTip("讀取完成", summary, BalloonIcon.Info);
            log.Info(summary);
            Logging.Record_admin("opd_import", summary);
            dtO.Dispose();
            dtP.Dispose();
            ds.Dispose();

            #endregion 進行讀取資料

            this.Dispose();
        }
Exemple #13
0
        public void Change()
        {
            // Dim output As DEP_return = Change_DEP(strYM)
            // MessageBox.Show("修改了" + output.m.ToString + "筆, 請匯入門診資料")
            string   savepath = @"C:\vpn\change_dep";
            int      change_N;
            DateTime minD;
            DateTime maxD;
            List <sp_change_depResult> ListChange;

            // 存放目錄,不存在就要建立一個
            if (!(System.IO.Directory.Exists(savepath)))
            {
                System.IO.Directory.CreateDirectory(savepath);
            }

            #region Making CSV

            try
            {
                // 呼叫SQL stored procedure
                using (CSDataContext dc = new CSDataContext())
                {
                    ListChange = dc.sp_change_dep(_strYM).ToList();
                }

                // 自動產生名字
                string savefile = $"\\change_dep_{_strYM}_{DateTime.Now.Year}{(DateTime.Now.Month + 100).ToString().Substring(1)}";
                savefile += $"{(DateTime.Now.Day + 100).ToString().Substring(1)}_{DateTime.Now.TimeOfDay}";
                savefile  = savefile.Replace(":", "").Replace(".", "");
                savepath += $"{savefile}.csv";

                // 製作csv檔 writing to csv
                System.IO.StreamWriter sw = new System.IO.StreamWriter(savepath);
                int i = 1;
                change_N = ListChange.Count;
                if (change_N == 0)
                {
                    tb.ShowBalloonTip("完成", "沒有什麼需要修改的", BalloonIcon.Info);
                    log.Info("change department: 沒有什麼需要修改的");
                    Logging.Record_admin("change department", "沒有什麼需要修改的");
                }
                else
                {
                    minD = DateTime.Parse("9999/12/31");
                    maxD = DateTime.Parse("0001/01/01");
                    foreach (var c in ListChange)
                    {
                        sw.Write(c.o); // 欄位名叫o
                        if (i < change_N)
                        {
                            sw.Write(sw.NewLine);
                        }
                        DateTime tempD = DateTime.Parse($"{c.o.Substring(0, 4)}/{c.o.Substring(4, 2)}/{c.o.Substring(6, 2)}");
                        // 找尋最大的值
                        if (tempD.CompareTo(maxD) > 0)
                        {
                            maxD = tempD;
                        }
                        // 找尋最小的值
                        if (tempD.CompareTo(minD) < 0)
                        {
                            minD = tempD;
                        }
                        i++;
                    }
                    // 20200518 放在foreach的loop迴圈裡是錯誤的, 我把它放出來了
                    string output = $"{minD:d}~{maxD:d}, 共{change_N}筆需要修改";
                    tb.ShowBalloonTip("需修改:", output, BalloonIcon.Info);
                    log.Info($"change department: {output}");
                    Logging.Record_admin("change department", output);
                    sw.Close();
                }
            }
            catch (System.Exception ex)
            {
                Logging.Record_error(ex.Message);
                log.Error(ex.Message);
                return;
            }

            #endregion Making CSV

            #region Environment

            try
            {
                // 營造環境
                if (AutoItX.WinExists("看診清單") == 1) //如果直接存在就直接叫用
                {
                    AutoItX.WinActivate("看診清單");
                }
                else
                {
                    Thesis.LogIN();
                    // 打開"看診清單"
                    AutoItX.Run(@"C:\Program Files (x86)\THESE\杏雲醫療資訊系統\THCClinic.exe", @"C:\Program Files (x86)\THESE\杏雲醫療資訊系統\");
                    AutoItX.WinWaitActive("看診清單");
                    AutoItX.WinActivate("看診清單");
                }
            }
            catch (Exception ex)
            {
                Logging.Record_error(ex.Message);
                log.Error(ex.Message);
                return;
            }

            #endregion Environment

            #region Execute change department

            try
            {
                string strD_o = string.Empty;
                string strV_o = string.Empty;
                string strR_o = string.Empty;

                foreach (var c in ListChange)
                {
                    string strD_n  = c.o.Substring(0, 8);
                    string strV_n  = c.o.Substring(8, 1);
                    string strR_n  = c.o.Substring(9, 2);
                    bool   changed = false;

                    string strNr  = c.o.Substring(11, 3);
                    string strDEP = c.o.Substring(14, 2);

                    // 先檢查是否換日, 如果有就換到新日期;
                    if (strD_n != strD_o)
                    {
                        // 製造3個AutoIT VB程式, 1. changeDP_DATE, 針對"看診清單", [NAME:dtpSDate]
                        // 一個參數, 格式YYYYMMDD
                        AutoItX.Run($"C:\\vpn\\exe\\changeDP_DATE.exe {strD_n}", @"C:\vpn\exe\");
                        log.Info($"Change Date from {strD_o} to {strD_n}.  Then sleep 1000ms.");
                        strD_o  = strD_n;
                        changed = true;
                        AutoItX.Sleep(1000);
                    }

                    // 再檢查是否換午別, 如果有就換到新的午別
                    if (strV_n != strV_o)
                    {
                        // 製造3個AutoIT VB程式, 2. changeDP_VIST, 針對"看診清單", [NAME:cmbVist]
                        // 一個參數, 格式V
                        AutoItX.Run($"C:\\vpn\\exe\\changeDP_VIST.exe {strV_n}", @"C:\vpn\exe\");
                        log.Info($"Change Vist from {strV_o} to {strV_n}. Then sleep 1000ms.");
                        strV_o  = strV_n;
                        changed = true;
                        AutoItX.Sleep(1000);
                    }

                    // 最後檢查是否換診間, 如果有就換到新的診間
                    if (strR_n != strR_o)
                    {
                        // 製造3個AutoIT VB程式, 3. changeDP_ROOM, 針對"看診清單", [NAME:cmbRmno]
                        // 一個參數, 格式RR
                        AutoItX.Run($"C:\\vpn\\exe\\changeDP_ROOM.exe {strR_n}", @"C:\vpn\exe\");
                        log.Info($"Change Date from {strR_o} to {strR_n}. Then sleep 1000ms.");
                        strR_o  = strR_n;
                        changed = true;
                        AutoItX.Sleep(1000);
                    }

                    if (changed)
                    {
                        AutoItX.ControlClick("看診清單", "", "[NAME:btnRefresh]");
                        log.Info($"Press Refresh button. [NAME:btnRefresh].");
                        AutoItX.WinWaitActive("看診清單");
                        changed = false;
                    }

                    // 按下新的號碼;
                    // Seq NO
                    // 輸入診號
                    AutoItX.ControlSend("看診清單", "", "[NAME:txbSqno]", strNr);
                    log.Info($"Enter {strNr}.");

                    // 按鈕
                    AutoItX.ControlClick("看診清單", "", "[NAME:btnGo]");
                    log.Info($"Press GO button. [NAME:btnGo].");

                    // 進入問診畫面
                    AutoItX.WinWaitActive("問診畫面");
                    AutoItX.Sleep(500);

                    // 製造一個AutoIT VB程式, changeDP_DEP, 針對"問診畫面"[NAME:cmbDept]
                    // 一個參數, 格式DD
                    AutoItX.Run($"C:\\vpn\\exe\\changeDP_DEP.exe {strDEP}", @"C:\vpn\exe\");

                    AutoItX.Sleep(500);
                    int idx = 0;

                    // 先問「此病患已批價, 是否繼續?」, THCClinic, 還可能問重大傷病, 超過8種藥物, 可能有重複用藥畫面
                    do
                    {
                        AutoItX.Send("{F9}");
                        AutoItX.Sleep(100);
                        idx++; // time out for 10 sec at most
                    } while (AutoItX.WinExists("THCClinic") == 0 && idx < 100);

                    // 下一個畫面「確定要重複開立收據」,
                    // 一定會有「已經批價」, 可能會有「重大傷病身分」, 可能會有「八種以上藥物]
                    // 可能會有「跨院重複開立醫囑提示」
                    idx = 0;
                    do
                    {
                        if (AutoItX.WinExists("THCClinic") == 1)
                        {
                            AutoItX.ControlClick("THCClinic", "", "[CLASSNN:Button1]");
                        }
                        if (AutoItX.WinExists("跨院重複開立醫囑提示") == 1)
                        {
                            AutoItX.ControlClick("跨院重複開立醫囑提示", "", "[NAME:OK_Button]");
                        }
                        AutoItX.Sleep(100);
                        idx++; // time out for 10 sec at most
                    } while (AutoItX.WinExists("These.CludCln.Accounting") == 0 && idx < 100);

                    // 是否重印收據
                    AutoItX.WinWaitActive("These.CludCln.Accounting");
                    AutoItX.ControlClick("These.CludCln.Accounting", "", "[CLASSNN:Button2]");
                    AutoItX.Sleep(1000);
                }

                Logging.Record_admin("change department", $"修改了{change_N}筆");
                tb.ShowBalloonTip("完成", $"修改了{change_N}筆, 請匯入門診資料.", BalloonIcon.Info);
            }
            catch (Exception ex)
            {
                Logging.Record_error(ex.Message);
                log.Error(ex.Message);
                return;
            }

            #endregion Execute change department
        }
Exemple #14
0
        private async Task <ODRresult> ImportODR_async(object[,] data, IProgress <ProgressReportModel> progress, ProgressReportModel report)
        {
            int totalN   = data.GetUpperBound(0);
            int add_N    = 0;
            int change_N = 0;
            int all_N    = 0;

            await Task.Run(() =>
            {
                log.Info($"    enter ImporODR_async.");
                // 要有迴路, 來讀一行一行的xls, 能夠判斷
                for (int i = 0; i <= totalN; i++)
                {
                    // 先判斷是否已經在資料表中, 如果不是就insert否則判斷要不要update
                    CSDataContext dc = new CSDataContext();
                    string strRID    = string.Empty;

                    // 先判斷醫令代碼是否空白, 原本第1, 現在第0
                    if (string.IsNullOrEmpty((string)data[i, 0]))
                    {
                        // 寫入Error Log
                        // 沒有醫令代碼是不行的
                        //Logging.Record_error("醫令代碼是空的");
                        log.Error("醫令代碼是空的");
                        // 20200528 發現這裡用return是不對的, continue才對
                        //return;
                        continue;
                    }

                    // 再判斷是否已在資料表中
                    strRID = (string)data[i, 0];    //醫令代碼,第0欄
                    var od = from d in dc.p_order
                             where d.rid == strRID
                             select d;    // this is a querry

                    if (od.Count() == 0)
                    {
                        // insert
                        // 沒這個醫令可以新增這個醫令
                        // 填入資料
                        try
                        {
                            p_order newOd = new p_order()
                            {
                                rid   = strRID,
                                r01   = (string)data[i, 1],  //英文規格, 第2欄, 20200513 改成1欄
                                r02   = (string)data[i, 2],  //生效日期,第3欄, 20200513 改成2欄
                                r03   = (string)data[i, 3],  //截止日期,第4欄, 20200513 改成3欄
                                r04   = (string)data[i, 4],  // 健保碼, 第5欄, 20200513 改成4欄
                                r06   = (string)data[i, 6],  //中文規格, 第7欄, 20200513 改成6欄
                                r07   = (string)data[i, 7],  //學名, 第8欄, 20200513 改成7欄
                                r08   = (string)data[i, 8],  //類別,第9欄, 20200513 改成8欄
                                r09   = (string)data[i, 9],  //健保價,第10欄, 20200513 改成9欄
                                r10   = (string)data[i, 10], //自費價, 第11欄, 20200513 改成10欄
                                r13   = (string)data[i, 13], //使用單位, 第14欄, 20190611 改成第16欄, 20200319 改成14欄, 20200513 改成13欄
                                r14   = (string)data[i, 11], //批價單位, 第15欄, 20190611 改成第14欄, 20200319 改成12欄, 20200513 改成11欄
                                r15   = (string)data[i, 14], //頻率, 第16欄, 20190611 改成第17欄, 20200319 改成15欄, 20200513 改成14欄
                                r16   = (string)data[i, 15], //途徑, 第17欄, 20190611 改成第18欄, 20200319 改成16欄, 20200513 改成15欄
                                r18   = (string)data[i, 17], //調劑方式, 第19欄, 20190611 改成第20欄, 20200319 改成18欄, 20200513 改成17欄
                                r19   = (string)data[i, 12], //批價比率, 第20欄, 20190611 改成第15欄, 20200319 改成13欄, 20200513 改成12欄
                                r25   = (string)data[i, 23], //劑型, 第26欄, 20200319 改成24欄, 20200513 改成23欄
                                r26   = (string)data[i, 24], //副作用, 第27欄, 20200319 改成25欄, 20200513 改成24欄
                                r27   = (string)data[i, 25], //用途, 第28欄, 20200319 改成26欄, 20200513 改成25欄
                                r28   = (string)data[i, 26], //用藥指示, 第29欄, 20200319 改成27欄, 20200513 改成26欄
                                r29   = (string)data[i, 27], //外觀, 第30欄, 20200319 改成28欄, 20200513 改成27欄
                                r30   = (string)data[i, 28], //程分含量, 第31欄, 20200319 改成29欄, 20200513 改成28欄
                                r31   = (string)data[i, 29], //廠牌, 第32欄, 20200319 改成30欄, 20200513 改成29欄
                                r32   = (string)data[i, 30], //用藥/排程說明, 第33欄, 20200319 改成31欄, 20200513 改成30欄
                                r33   = (string)data[i, 31], //藥品備註, 第34欄, 20200319 改成32欄, 20200513 改成31欄
                                r34   = (string)data[i, 32], //許可證字號, 第35欄, 20200319 改成33欄, 20200513 改成32欄
                                r40   = (string)data[i, 38], //檢驗代碼, 第41欄, 20200319 改成39欄, 20200513 改成38欄
                                r48   = (string)data[i, 46], //管制藥品, 第49欄, 20190611 改成第48欄, 20200319 改成47欄, 20200513 改成46欄
                                r52   = (string)data[i, 52], //門診缺藥, 第53欄, 20190929 改成第54欄, 20200319 改成53欄, 20200513 改成52欄
                                r60   = (string)data[i, 60], //異動人員, 第61欄, 20190929 改成第62欄, 20200319 改成61欄, 20200513 改成60欄
                                r61   = (string)data[i, 61], //異動日期, 第62欄, 20190929 改成第63欄, 20200319 改成62欄, 20200513 改成61欄
                                QDATE = _qdate
                            };
                            dc.p_order.InsertOnSubmit(newOd);
                            dc.SubmitChanges();
                            Logging.Record_admin("Add a new order", strRID);
                            log.Info($"Add a new order: {strRID} {data[i, 1]}");
                            add_N++;
                        }
                        catch (Exception ex)
                        {
                            Logging.Record_error(ex.Message);
                            log.Error(ex.Message);
                        }
                    }
                    else
                    {
                        // update
                        // 有此醫令喔, 走update方向
                        // 拿oldOd比較data[i),如果不同就修改,並且記錄

                        p_order oldOd = (from d in dc.p_order
                                         where d.rid == strRID
                                         select d).First();  // this is a record
                        string strChange = string.Empty;
                        bool bChange     = false;

                        try
                        {
                            // 英文規格, 第2欄, 20200513 改成1欄
                            if (oldOd.r01 != (string)data[i, 1])
                            {
                                strChange += $"改英文規格: {oldOd.r01} => {data[i, 1]}; ";
                                bChange    = true;
                                oldOd.r01  = (string)data[i, 1];
                            }
                            // 生效日期,第3欄, 20200513 改成2欄
                            if (oldOd.r02 != (string)data[i, 2])
                            {
                                strChange += $"改生效日期: {oldOd.r02} => {data[i, 2]}; ";
                                bChange    = true;
                                oldOd.r02  = (string)data[i, 2];
                            }
                            // 截止日期,第4欄, 20200513 改成3欄
                            if (oldOd.r03 != (string)data[i, 3])
                            {
                                strChange += $"改截止日期: {oldOd.r03} => {data[i, 3]}; ";
                                bChange    = true;
                                oldOd.r03  = (string)data[i, 3];
                            }
                            // 健保碼, 第5欄, 20200513 改成4欄
                            if (oldOd.r04 != (string)data[i, 4])
                            {
                                strChange += $"改健保碼: {oldOd.r04} => {data[i, 4]}; ";
                                bChange    = true;
                                oldOd.r04  = (string)data[i, 4];
                            }
                            // 中文規格, 第7欄, 20200513 改成6欄
                            if (oldOd.r06 != (string)data[i, 6])
                            {
                                strChange += $"改中文規格: {oldOd.r06} => {data[i, 6]}; ";
                                bChange    = true;
                                oldOd.r06  = (string)data[i, 6];
                            }
                            // 學名, 第8欄, 20200513 改成7欄
                            if (oldOd.r07 != (string)data[i, 7])
                            {
                                strChange += $"改學名: {oldOd.r07} => {data[i, 7]}; ";
                                bChange    = true;
                                oldOd.r07  = (string)data[i, 7];
                            }
                            // 類別,第9欄, 20200513 改成8欄
                            if (oldOd.r08 != (string)data[i, 8])
                            {
                                strChange += $"改類別: {oldOd.r08} => {data[i, 8]}; ";
                                bChange    = true;
                                oldOd.r08  = (string)data[i, 8];
                            }
                            // 健保價,第10欄, 20200513 改成9欄
                            if (oldOd.r09 != (string)data[i, 9])
                            {
                                strChange += $"改健保價: {oldOd.r09} => {data[i, 9]}; ";
                                bChange    = true;
                                oldOd.r09  = (string)data[i, 9];
                            }
                            // 自費價, 第11欄, 20200513 改成10欄
                            if (oldOd.r10 != (string)data[i, 10])
                            {
                                strChange += $"改自費價: {oldOd.r10} => {data[i, 10]}; ";
                                bChange    = true;
                                oldOd.r10  = (string)data[i, 10];
                            }
                            // 使用單位, 第14欄, 20190611 改成第16欄, 20200319 改成14欄, 20200513 改成13欄
                            if (oldOd.r13 != (string)data[i, 13])
                            {
                                strChange += $"改使用單位: {oldOd.r13} => {data[i, 13]}; ";
                                bChange    = true;
                                oldOd.r13  = (string)data[i, 13];
                            }
                            // 批價單位, 第15欄, 20190611 改成第14欄, 20200319 改成12欄, 20200513 改成11欄
                            if (oldOd.r14 != (string)data[i, 11])
                            {
                                strChange += $"改批價單位: {oldOd.r14} => {data[i, 11]}; ";
                                bChange    = true;
                                oldOd.r14  = (string)data[i, 11];
                            }
                            // 頻率, 第16欄, 20190611 改成第17欄, 20200319 改成15欄, 20200513 改成14欄
                            if (oldOd.r15 != (string)data[i, 14])
                            {
                                strChange += $"改頻率: {oldOd.r15} => {data[i, 14]}; ";
                                bChange    = true;
                                oldOd.r15  = (string)data[i, 14];
                            }
                            // 途徑, 第17欄, 20190611 改成第18欄, 20200319 改成16欄, 20200513 改成15欄
                            if (oldOd.r16 != (string)data[i, 15])
                            {
                                strChange += $"改途徑: {oldOd.r16} => {data[i, 15]}; ";
                                bChange    = true;
                                oldOd.r16  = (string)data[i, 15];
                            }
                            // 調劑方式, 第19欄, 20190611 改成第20欄, 20200319 改成18欄, 20200513 改成17欄
                            if (oldOd.r18 != (string)data[i, 17])
                            {
                                strChange += $"改調劑方式: {oldOd.r18} => {data[i, 17]}; ";
                                bChange    = true;
                                oldOd.r18  = (string)data[i, 17];
                            }
                            // 批價比率, 第20欄, 20190611 改成第15欄, 20200319 改成13欄, 20200513 改成12欄
                            if (oldOd.r19 != (string)data[i, 12])
                            {
                                strChange += $"改批價比率: {oldOd.r19} => {data[i, 12]}; ";
                                bChange    = true;
                                oldOd.r19  = (string)data[i, 12];
                            }
                            // 劑型, 第26欄, 20200319 改成24欄, 20200513 改成23欄
                            if (oldOd.r25 != (string)data[i, 23])
                            {
                                strChange += $"改劑型: {oldOd.r25} => {data[i, 23]}; ";
                                bChange    = true;
                                oldOd.r25  = (string)data[i, 23];
                            }
                            // 副作用, 第27欄, 20200319 改成25欄, 20200513 改成24欄
                            if (oldOd.r26 != (string)data[i, 24])
                            {
                                strChange += $"改副作用: {oldOd.r26} => {data[i, 24]}; ";
                                bChange    = true;
                                oldOd.r26  = (string)data[i, 24];
                            }
                            // 用途, 第28欄, 20200319 改成26欄, 20200513 改成25欄
                            if (oldOd.r27 != (string)data[i, 25])
                            {
                                strChange += $"改用途: {oldOd.r27} => {data[i, 25]}; ";
                                bChange    = true;
                                oldOd.r27  = (string)data[i, 25];
                            }
                            // 用藥指示, 第29欄, 20200319 改成27欄, 20200513 改成26欄
                            if (oldOd.r28 != (string)data[i, 26])
                            {
                                strChange += $"改用藥指示: {oldOd.r28} => {data[i, 26]}; ";
                                bChange    = true;
                                oldOd.r28  = (string)data[i, 26];
                            }
                            // 外觀, 第30欄, 20200319 改成28欄, 20200513 改成27欄
                            if (oldOd.r29 != (string)data[i, 27])
                            {
                                strChange += $"改外觀: {oldOd.r29} => {data[i, 27]}; ";
                                bChange    = true;
                                oldOd.r29  = (string)data[i, 27];
                            }
                            // 成分含量, 第31欄, 20200319 改成29欄, 20200513 改成28欄
                            if (oldOd.r30 != (string)data[i, 28])
                            {
                                strChange += $"改成分含量: {oldOd.r30} => {data[i, 28]}; ";
                                bChange    = true;
                                oldOd.r30  = (string)data[i, 28];
                            }
                            // 廠牌, 第32欄, 20200319 改成30欄, 20200513 改成29欄
                            if (oldOd.r31 != (string)data[i, 29])
                            {
                                strChange += $"改廠牌: {oldOd.r31} => {data[i, 29]}; ";
                                bChange    = true;
                                oldOd.r31  = (string)data[i, 29];
                            }
                            // 用藥/排程說明, 第33欄, 20200319 改成31欄, 20200513 改成30欄
                            if (oldOd.r32 != (string)data[i, 30])
                            {
                                strChange += $"改用藥排程說明: {oldOd.r32} => {data[i, 30]}; ";
                                bChange    = true;
                                oldOd.r32  = (string)data[i, 30];
                            }
                            // 藥品備註, 第34欄, 20200319 改成32欄, 20200513 改成31欄
                            if (oldOd.r33 != (string)data[i, 31])
                            {
                                strChange += $"改藥品備註: {oldOd.r33} => {data[i, 31]}; ";
                                bChange    = true;
                                oldOd.r33  = (string)data[i, 31];
                            }
                            // 許可證字號, 第35欄, 20200319 改成33欄, 20200513 改成32欄
                            if (oldOd.r34 != (string)data[i, 32])
                            {
                                strChange += $"改許可證字號: {oldOd.r34} => {data[i, 32]}; ";
                                bChange    = true;
                                oldOd.r34  = (string)data[i, 32];
                            }
                            // 檢驗代碼, 第41欄, 20200319 改成39欄, 20200513 改成38欄
                            if (oldOd.r40 != (string)data[i, 38])
                            {
                                strChange += $"改檢驗代碼: {oldOd.r40} => {data[i, 38]}; ";
                                bChange    = true;
                                oldOd.r40  = (string)data[i, 38];
                            }
                            // 管制藥品, 第49欄, 20190611 改成第48欄, 20200319 改成47欄, 20200513 改成46欄
                            if (oldOd.r48 != (string)data[i, 46])
                            {
                                strChange += $"改管制藥品: {oldOd.r48} => {data[i, 46]}; ";
                                bChange    = true;
                                oldOd.r48  = (string)data[i, 46];
                            }
                            // 門診缺藥, 第53欄, 20190929 改成第54欄, 20200319 改成53欄, 20200513 改成52欄
                            if (oldOd.r52 != (string)data[i, 52])
                            {
                                strChange += $"改門診缺藥: {oldOd.r52} => {data[i, 52]}; ";
                                bChange    = true;
                                oldOd.r52  = (string)data[i, 52];
                            }
                            // 異動人員, 第61欄, 20190929 改成第62欄, 20200319 改成61欄, 20200513 改成60欄
                            if (oldOd.r60 != (string)data[i, 60])
                            {
                                strChange += $"改異動人員: {oldOd.r60} => {data[i, 60]}; ";
                                bChange    = true;
                                oldOd.r60  = (string)data[i, 60];
                            }
                            // 異動日期, 第62欄, 20190929 改成第63欄, 20200319 改成62欄, 20200513 改成61欄
                            if (oldOd.r61 != (string)data[i, 61])
                            {
                                strChange += $"改異動日期: {oldOd.r61} => {data[i, 61]}; ";
                                bChange    = true;
                                oldOd.r61  = (string)data[i, 61];
                            }
                            if (bChange == true)
                            {
                                //  做實改變
                                oldOd.QDATE = _qdate;
                                dc.SubmitChanges();
                                // 做記錄
                                Logging.Record_admin("Change order data", $"{strRID}: {strChange}");
                                log.Info($"Change order data: [{strRID}] {data[i, 1]}: {strChange}");
                                change_N++;
                            }
                        }
                        catch (Exception ex)
                        {
                            Logging.Record_error(ex.Message);
                            log.Error(ex.Message);
                        }
                    }
                    all_N++;
                    report.PercentageComeplete = all_N * 100 / totalN;
                    progress.Report(report);
                }
                log.Info($"    exit ImporODR_async.");
            });

            return(new ODRresult()
            {
                NewODR = add_N,
                ChangeODR = change_N,
                AllODR = all_N
            });
        }
Exemple #15
0
        public void Transform()
        {
            #region 宣告

            XmlDocument xdoc = new XmlDocument();
            XmlNode     xOutpatient; // root of the xml
            XmlNodeList xTDATA;      // 用來放tDATA
            XmlNodeList xDDATA;      // 用來放dDATA
            XmlNode     xNodeTemp;   // 臨時的xml node操作
            string      keyT3;       // 當key值, 費用年月
            string      keyD1;       // 當key值, 案件分類
            string      keyD2;       // 當key值,流水編號
            int         dN = 0;      // dData筆數, 即當月看診人次數
            int         pN = 0;      // pData筆數, 即當月處方筆數

            //讀取XML
            // 20190615 revisited: 原本想說建立防呆機制, 結果一看才發現有天然的防呆機制,就是primary key的設置, 三個表都有,有重複值自然就不會讀了
            xdoc.Load(_loadpath);
            // root node就是outpatient, outpatient下面就是兩個node: tdata,
            xOutpatient = (XmlNode)xdoc.DocumentElement;
            //選擇section
            xTDATA = xOutpatient.SelectNodes("tdata");   //這應該只有一個
            xDDATA = xOutpatient.SelectNodes("ddata");   //這應該有很多個

            #endregion 宣告

            #region 讀取tdata

            try
            {
                //TDATA只有一個item
                xNodeTemp = xTDATA.Item(0);
                //這個唯一的item下面有42個child node/item, 就是總表了
                //20190527 我已經搞懂總表了,可以寫入SQL了
                //以下寫入SQL

                // 總表重複12次, xml_tdata
                // 宣告新的一行
                keyT3 = xNodeTemp.SelectSingleNode("t3").InnerText;
                // 如果已經曾經匯入, 就不要重複匯入, t3是key值, 不可重複
                using (CSDataContext dc = new CSDataContext())
                {
                    var q = from p in dc.xml_tdata
                            where p.t3 == keyT3
                            select p;
                    if (q.Count() != 0)
                    {
                        throw new Exception($"{keyT3} 之前已經匯入, 不可重複匯入!");
                    }
                }


                xml_tdata newT = new xml_tdata()
                {
                    t1  = xNodeTemp.SelectSingleNode("t1").InnerText,
                    t2  = xNodeTemp.SelectSingleNode("t2").InnerText,
                    t3  = xNodeTemp.SelectSingleNode("t3").InnerText,
                    t4  = char.Parse(xNodeTemp.SelectSingleNode("t4").InnerText),
                    t5  = char.Parse(xNodeTemp.SelectSingleNode("t5").InnerText),
                    t6  = xNodeTemp.SelectSingleNode("t6").InnerText,
                    t37 = int.Parse(xNodeTemp.SelectSingleNode("t37").InnerText),
                    t38 = int.Parse(xNodeTemp.SelectSingleNode("t38").InnerText),
                    t39 = int.Parse(xNodeTemp.SelectSingleNode("t39").InnerText),
                    t40 = int.Parse(xNodeTemp.SelectSingleNode("t40").InnerText),
                    t41 = xNodeTemp.SelectSingleNode("t41").InnerText,
                    t42 = xNodeTemp.SelectSingleNode("t42").InnerText
                };
                //20190527 完成
                using (CSDataContext dc = new CSDataContext())
                {
                    dc.xml_tdata.InsertOnSubmit(newT);
                    dc.SubmitChanges();
                    string output = $"匯入健保申報檔年月: {keyT3}";
                    Logging.Record_admin("匯入健保申報檔", output);
                    log.Info(output);
                }
            }
            catch (Exception ex)
            {
                string output = $"讀取tdata錯誤: {ex.Message}";
                Logging.Record_error(output);
                log.Error(output);
                tb.ShowBalloonTip("錯誤!", output, BalloonIcon.Error);
                return;
            }

            #endregion 讀取tdata

            #region 讀取ddata, pdata

            //=====================================================================================
            //2019/5/27 完成的
            //DDATA有很多個item
            foreach (XmlNode dNode in xDDATA)
            {
                //取得節點[dhead]
                xNodeTemp = dNode.SelectSingleNode("dhead");
                keyD1     = xNodeTemp.SelectSingleNode("d1").InnerText;
                keyD2     = xNodeTemp.SelectSingleNode("d2").InnerText;

                //取得節點[dbody]
                xNodeTemp = dNode.SelectSingleNode("dbody");

                //取得ddata, 下面應有dhead, dbody兩個node, dhead下有d1, d2, dbody下有30欄位
                //------------> as ddata
                try
                {
                    // 宣告新的一行
                    xml_ddata newD = new xml_ddata()
                    {
                        t3  = keyT3,
                        d1  = keyD1,
                        d2  = int.Parse(keyD2),
                        d3  = xNodeTemp.SelectSingleNode("d3")?.InnerText,
                        d4  = xNodeTemp.SelectSingleNode("d4")?.InnerText,
                        d8  = xNodeTemp.SelectSingleNode("d8")?.InnerText,
                        d9  = xNodeTemp.SelectSingleNode("d9")?.InnerText,
                        d11 = xNodeTemp.SelectSingleNode("d11")?.InnerText,
                        d15 = xNodeTemp.SelectSingleNode("d15")?.InnerText,
                        d16 = xNodeTemp.SelectSingleNode("d16")?.InnerText,
                        d17 = xNodeTemp.SelectSingleNode("d17")?.InnerText,
                        d18 = char.Parse(xNodeTemp.SelectSingleNode("d18")?.InnerText),
                        d19 = xNodeTemp.SelectSingleNode("d19")?.InnerText,
                        d20 = xNodeTemp.SelectSingleNode("d20")?.InnerText,
                        d21 = xNodeTemp.SelectSingleNode("d21")?.InnerText,
                        d22 = xNodeTemp.SelectSingleNode("d22")?.InnerText,
                        d23 = xNodeTemp.SelectSingleNode("d23")?.InnerText,
                        d28 = char.Parse(xNodeTemp.SelectSingleNode("d28")?.InnerText),
                        d29 = xNodeTemp.SelectSingleNode("d29")?.InnerText,
                        d30 = xNodeTemp.SelectSingleNode("d30")?.InnerText,
                        d32 = int.Parse(xNodeTemp.SelectSingleNode("d32")?.InnerText),
                        d33 = int.Parse(xNodeTemp.SelectSingleNode("d33")?.InnerText),
                        d34 = int.Parse(xNodeTemp.SelectSingleNode("d34")?.InnerText),
                        d35 = xNodeTemp.SelectSingleNode("d35")?.InnerText,
                        d36 = int.Parse(xNodeTemp.SelectSingleNode("d36")?.InnerText),
                        d39 = int.Parse(xNodeTemp.SelectSingleNode("d39")?.InnerText),
                        d40 = int.Parse(xNodeTemp.SelectSingleNode("d40")?.InnerText),
                        d41 = int.Parse(xNodeTemp.SelectSingleNode("d41")?.InnerText),
                        d49 = xNodeTemp.SelectSingleNode("d49")?.InnerText
                    };
                    if (int.TryParse(xNodeTemp.SelectSingleNode("d27")?.InnerText, out int i27))
                    {
                        newD.d27 = i27;
                    }
                    if (!string.IsNullOrEmpty(xNodeTemp.SelectSingleNode("d14")?.InnerText))
                    {
                        newD.d14 = char.Parse(xNodeTemp.SelectSingleNode("d14").InnerText);
                    }

                    using (CSDataContext dc = new CSDataContext())
                    {
                        dc.xml_ddata.InsertOnSubmit(newD);
                        dc.SubmitChanges();
                        dN++;
                    }
                }
                catch (Exception ex)
                {
                    string output = $"讀取ddata錯誤: {ex.Message}";
                    Logging.Record_error(output);
                    log.Error(output);
                    tb.ShowBalloonTip("錯誤!", output, BalloonIcon.Error);
                    continue;
                }
                //取得[dbody]下的節點[pdata],這可能有很多個,也可能沒有半個, 要有個if, 要有個迴圈for next
                if (xNodeTemp.SelectNodes("pdata").Count != 0)
                {
                    XmlNodeList xPDATA = xNodeTemp.SelectNodes("pdata");
                    foreach (XmlNode pNode in xPDATA)
                    {
                        try
                        {
                            xml_pdata newP = new xml_pdata()
                            {
                                t3  = keyT3,
                                d1  = keyD1,
                                d2  = int.Parse(keyD2),
                                p4  = pNode.SelectSingleNode("p4")?.InnerText,
                                p6  = pNode.SelectSingleNode("p6").InnerText,
                                p7  = pNode.SelectSingleNode("p7").InnerText,
                                p8  = double.Parse(pNode.SelectSingleNode("p8").InnerText),
                                p9  = pNode.SelectSingleNode("p9").InnerText,
                                p10 = (int)float.Parse(pNode.SelectSingleNode("p10")?.InnerText),
                                p11 = (int)float.Parse(pNode.SelectSingleNode("p11")?.InnerText),
                                p12 = int.Parse(pNode.SelectSingleNode("p12")?.InnerText),
                                p13 = int.Parse(pNode.SelectSingleNode("p13")?.InnerText),
                                p14 = pNode.SelectSingleNode("p14")?.InnerText,
                                p15 = pNode.SelectSingleNode("p15")?.InnerText,
                                p16 = pNode.SelectSingleNode("p16")?.InnerText,
                                p20 = pNode.SelectSingleNode("p20")?.InnerText
                            };
                            if (int.TryParse(pNode.SelectSingleNode("p1")?.InnerText, out int i1))
                            {
                                newP.p1 = i1;
                            }
                            if (!string.IsNullOrEmpty(pNode.SelectSingleNode("p2")?.InnerText))
                            {
                                newP.p2 = char.Parse(pNode.SelectSingleNode("p2").InnerText);
                            }
                            if (!string.IsNullOrEmpty(pNode.SelectSingleNode("p3")?.InnerText))
                            {
                                newP.p3 = char.Parse(pNode.SelectSingleNode("p3")?.InnerText);
                            }
                            if (double.TryParse(pNode.SelectSingleNode("p5")?.InnerText, out double i5))
                            {
                                newP.p5 = i5;
                            }
                            if (!string.IsNullOrEmpty(pNode.SelectSingleNode("p17")?.InnerText))
                            {
                                newP.p17 = char.Parse(pNode.SelectSingleNode("p17")?.InnerText);
                            }

                            using (CSDataContext dc = new CSDataContext())
                            {
                                dc.xml_pdata.InsertOnSubmit(newP);
                                dc.SubmitChanges();
                                pN++;
                            }
                        }
                        catch (Exception ex)
                        {
                            string output = $"讀取pdata錯誤: {ex.Message}";
                            Logging.Record_error(output);
                            log.Error(output);
                            tb.ShowBalloonTip("錯誤!", output, BalloonIcon.Error);
                            continue;
                        }
                    }
                }
            }

            #endregion 讀取ddata, pdata

            #region 進行配對

            //20190615 連結tbl_opd
            using (CSDataContext dc = new CSDataContext())
            {
                var q = (from cs in dc.sp_match_xml().AsEnumerable()
                         select cs).First();
                int    n      = q.rows_affected;
                string output = $"健保上傳XML檔配對{n}筆配對成功, 共{dN}看診人次, {pN}處方";
                Logging.Record_admin("健保上傳XML檔配對", output);
                log.Info(output);
                tb.ShowBalloonTip("匯入成功!", output, BalloonIcon.Info);
            }

            #endregion 進行配對

            this.Dispose();
        }