Эх сурвалжийг харах

1.一次性回傳發票處理完成通知;2.修正同時開立多張發票造成的檔案存取權限問題

Snoopy 3 жил өмнө
parent
commit
202e8c377d

+ 77 - 90
TCCInvoice/InvoiceGenerator.cs

@@ -43,11 +43,14 @@ namespace TCCInvoice
 
         private FileSystemWatcher preInvoiceResponseWatcher;
         private FileSystemWatcher sellerInvoiceResponseWatcher;
+        private List<InvoiceResponseItem> invoiceResponseItemList = new List<InvoiceResponseItem>();
         private string responseInvoiceNumber;
         private string responseDataNumber;
         private string responseInvoiceDate;
         private string responseInvoiceTime;
         private string responseInvoiceError;
+        private int totalQuantity = 0;
+        private int count = 0;
         #endregion
 
         #region Constants
@@ -198,87 +201,119 @@ namespace TCCInvoice
         #endregion
 
         #region Constructors
-        public InvoiceGenerator()
+        public InvoiceGenerator(int quantity)
         {
+            totalQuantity = quantity;
             preInvoiceResponseWatcher = new FileSystemWatcher()
             {
                 Path = PREINVOICE_RESPONSE_PATH,
                 Filter = "*.xml",
+                NotifyFilter = NotifyFilters.LastWrite,
                 IncludeSubdirectories = false,
                 EnableRaisingEvents = true,
             };
-            preInvoiceResponseWatcher.Created += PreInvoiceResponse_Created;
+            preInvoiceResponseWatcher.Changed += PreInvoiceResponse_Changed;
 
             sellerInvoiceResponseWatcher = new FileSystemWatcher()
             {
                 Path = SELLER_INVOICE_RESPONSE_PATH,
                 Filter = "*.xml",
+                NotifyFilter = NotifyFilters.LastWrite,
                 IncludeSubdirectories = false,
                 EnableRaisingEvents = true,
             };
-            sellerInvoiceResponseWatcher.Created += SellerInvoiceResponse_Created;
+            sellerInvoiceResponseWatcher.Changed += SellerInvoiceResponse_Changed;
         }
         #endregion
 
         #region Events & EventHandlers
-        public delegate void InvoiceGenerateEventHandler(string dataNumber, string invoiceNumber, 
-                                                         string invoiceDate, string invoiceTime, string randomNumber);
-        public event InvoiceGenerateEventHandler InvoiceGenerated;
+        public delegate void InvoiceCompleteEventHandler(List<InvoiceResponseItem> responseItems);
+        public event InvoiceCompleteEventHandler InvoiceCompleted;
 
-        public delegate void InvoiceAssignNumberFailEventHandler(string dataNumber, string description);
-        public event InvoiceAssignNumberFailEventHandler InvoiceAssignNumberFailed;
-
-        public delegate void InvoiceUploadFailEventHandler(string dataNumber, string invoiceNumber, string randomNumber,
-                                                           string description);
-        public event InvoiceUploadFailEventHandler InvoiceUploadFailed;
-
-        private void PreInvoiceResponse_Created(object sender, FileSystemEventArgs e)
+        private void PreInvoiceResponse_Changed(object sender, FileSystemEventArgs e)
         {
             XDocument xDoc = XDocument.Load(e.FullPath);
 
             string status = xDoc.Descendants("Status").ElementAt(0).Value;
             if (status == "1") // 配號成功
             {
-                responseInvoiceNumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
-                responseDataNumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
-                responseInvoiceDate = xDoc.Descendants("InvoiceDate").ElementAt(0).Value;
-                responseInvoiceTime = xDoc.Descendants("InvoiceTime").ElementAt(0).Value;
+                string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
+                string datanumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
+                string invoicedate = xDoc.Descendants("InvoiceDate").ElementAt(0).Value;
+                string invoicetime = xDoc.Descendants("InvoiceTime").ElementAt(0).Value;
+                string invoiceError = null;
+                invoiceResponseItemList.Add(new InvoiceResponseItem 
+                {
+                    ResponseStatus = "配號成功",
+                    ResponseInvoiceNumber = invoicenumber,
+                    ResponseDataNumber = datanumber,
+                    ResponseInvoiceDate = invoicedate,
+                    ResponseInvoiceTime = invoicetime,
+                    ResponseRandomNumber = this.randomNumber,
+                    ResponseInvoiceError = invoiceError
+                });
             }
             else // 配號失敗
             {
                 responseInvoiceError = xDoc.Descendants("Description").ElementAt(0).Value;
                 responseDataNumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
                 randomNumber = null;
-                BackupResponse(-1);
 
-                InvoiceAssignNumberFailed?.Invoke(responseDataNumber, responseInvoiceError);
+                invoiceResponseItemList.Add(new InvoiceResponseItem
+                {
+                    ResponseStatus = "配號失敗",
+                    ResponseInvoiceNumber = null,
+                    ResponseDataNumber = responseDataNumber,
+                    ResponseInvoiceDate = null,
+                    ResponseInvoiceTime = null,
+                    ResponseRandomNumber = null,
+                    ResponseInvoiceError = responseInvoiceError
+                });
+
+                count++;
+                if (count == totalQuantity)
+                {
+                    InvoiceCompleted?.Invoke(invoiceResponseItemList);
+                }
             }
         }
 
-        private void SellerInvoiceResponse_Created(object sender, FileSystemEventArgs e)
+        private void SellerInvoiceResponse_Changed(object sender, FileSystemEventArgs e)
         {
             XDocument xDoc = XDocument.Load(e.FullPath);
 
+            int index = 0;
             string status = xDoc.Descendants("Status").ElementAt(0).Value;
+            string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
+            foreach (InvoiceResponseItem item in invoiceResponseItemList)
+            {
+                if (item.ResponseInvoiceNumber == invoicenumber)
+                {
+                    index = invoiceResponseItemList.IndexOf(item);
+                }
+            }
+            
             if (status == "1") // 上傳成功
             {
-                string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
-                if (!String.IsNullOrEmpty(responseInvoiceNumber) && responseInvoiceNumber == invoicenumber)
+                invoiceResponseItemList[index].ResponseStatus = "上傳成功";
+
+                count++;
+                if (count == totalQuantity)
                 {
-                    BackupResponse(1);
-                    InvoiceGenerated?.Invoke(responseDataNumber, responseInvoiceNumber, responseInvoiceDate,
-                                             responseInvoiceTime, this.randomNumber);
+                    InvoiceCompleted?.Invoke(invoiceResponseItemList);
                 }
             }
             else // 上傳失敗
             {
-                string invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
-                responseInvoiceError = xDoc.Descendants("Description").ElementAt(0).Value;
-                if (!String.IsNullOrEmpty(responseInvoiceNumber) && responseInvoiceNumber == invoicenumber)
+                string invoiceerror = xDoc.Descendants("Description").ElementAt(0).Value;
+
+                invoiceResponseItemList[index].ResponseStatus = "上傳失敗";
+                invoiceResponseItemList[index].ResponseInvoiceError = invoiceerror;
+
+                count++;
+                if (count == totalQuantity)
                 {
-                    BackupResponse(0);
-                    InvoiceUploadFailed?.Invoke(responseDataNumber, responseInvoiceNumber, this.randomNumber, 
-                                                responseInvoiceError);
+                    InvoiceCompleted?.Invoke(invoiceResponseItemList);
                 }
             }
         }
@@ -327,45 +362,6 @@ namespace TCCInvoice
             }
         }
 
-        public void SearchResponseByDataNumber(string dataNumber)
-        {
-            string fileToCheck = RESPONSE_BACKUP_PATH + dataNumber + ".xml";
-            if (!File.Exists(fileToCheck)) // 檔案不存在
-            {
-                return;
-            }
-
-            XDocument xDoc = XDocument.Load(fileToCheck);
-
-            string invoicenumber, datanumber, invoicedate, invoicetime, description, randomnumber;
-            string status = xDoc.Descendants("Status").ElementAt(0).Value;
-            switch (status)
-            {
-                case "1" : // 發票配號成功且上傳成功
-                    invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
-                    datanumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
-                    invoicedate = xDoc.Descendants("InvoiceDate").ElementAt(0).Value;
-                    invoicetime = xDoc.Descendants("InvoiceTime").ElementAt(0).Value;
-                    randomnumber = xDoc.Descendants("RandomNumber").ElementAt(0).Value;
-                    InvoiceGenerated?.Invoke(datanumber, invoicenumber, invoicedate, invoicetime, randomnumber);
-                    break;
-                case "0" : // 發票配號成功但上傳失敗
-                    invoicenumber = xDoc.Descendants("InvoiceNumber").ElementAt(0).Value;
-                    datanumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
-                    randomnumber = xDoc.Descendants("RandomNumber").ElementAt(0).Value;
-                    description = xDoc.Descendants("Description").ElementAt(0).Value;
-                    InvoiceUploadFailed?.Invoke(datanumber, invoicenumber, randomnumber, description);
-                    break;
-                case "-1" : // 配號失敗
-                    datanumber = xDoc.Descendants("DataNumber").ElementAt(0).Value;
-                    description = xDoc.Descendants("Description").ElementAt(0).Value;
-                    InvoiceAssignNumberFailed?.Invoke(datanumber, description);
-                    break;
-                default :
-                    break;
-            }
-        }
-
         private void GeneratePreinvoiceXML()
         {
             XDocument xDoc = new XDocument();
@@ -422,25 +418,6 @@ namespace TCCInvoice
             xDoc.Save(PREINVOICE_PATH + dataNumber + ".xml");
         }
 
-        private void BackupResponse(int status)
-        {
-            XDocument xDoc = new XDocument();
-            xDoc.Declaration = new XDeclaration("1.0", "UTF-8", "");
-
-            XElement root = new XElement("Response");
-            root.Add(new XElement("Status", status.ToString()),
-                     new XElement("Description", responseInvoiceError),
-                     new XElement("DataNumber", responseDataNumber),
-                     new XElement("InvoiceNumber", responseInvoiceNumber),
-                     new XElement("InvoiceDate", responseInvoiceDate),
-                     new XElement("InvoiceTime", responseInvoiceTime),
-                     new XElement("RandomNumber", randomNumber)
-                    );
-
-            xDoc.Add(root);
-            xDoc.Save(RESPONSE_BACKUP_PATH + responseDataNumber + ".xml");
-        }
-
         private void Reset()
         {
             dataNumber = null;
@@ -509,6 +486,16 @@ namespace TCCInvoice
         #endregion
 
         #region Nested Classes
+        internal class InvoiceResponseItem
+        {
+            public string ResponseStatus { get; set; }
+            public string ResponseInvoiceNumber { get; set; }
+            public string ResponseDataNumber { get; set; }
+            public string ResponseInvoiceDate { get; set; }
+            public string ResponseInvoiceTime { get; set; }
+            public string ResponseRandomNumber { get; set; }
+            public string ResponseInvoiceError { get; set; }
+        }
         internal class InvoiceItem
         {
             public int SequenceNumber { get; set; }

+ 29 - 47
TCCInvoice/Program.cs

@@ -11,62 +11,44 @@ namespace TCCInvoice
         static void Main(string[] args)
         {
             // 建立InvoiceGenerator類別的物件
-            InvoiceGenerator myInvoice = new InvoiceGenerator();
+            InvoiceGenerator myInvoice = new InvoiceGenerator(2);
 
-            // 註冊發票號碼已開立的事件通知
-            myInvoice.InvoiceGenerated += MyInvoice_InvoiceGenerated;
-            // 註冊發票號碼配號失敗的事件通知
-            myInvoice.InvoiceAssignNumberFailed += MyInvoice_InvoiceAssignNumberFailed;
-            // 註冊發票號碼上傳失敗的事件通知
-            myInvoice.InvoiceUploadFailed += MyInvoice_InvoiceUploadFailed;
+            // 註冊發票號碼已處理完畢的事件通知
+            myInvoice.InvoiceCompleted += MyInvoice_InvoiceCompleted;
 
-            // 填具待開立發票的相關資料(Preinvoice)
-            myInvoice.DataNumber = "202202150008";
-            myInvoice.DataDate = DateTime.Today;
-            myInvoice.BuyerId = null; // 一般消費者
-            myInvoice.TotalAmount = 524;
-            myInvoice.CarrierId1 = "/CPDF.O2";
-            myInvoice.MainRemark = "交易訂單號:1234567888";
-            myInvoice.ContactEmail = "snoopy.h.huang@outlook.com";
-            myInvoice.ContactPhone = "0929168960";
-            myInvoice.AddInvoiceItem(0, "充電服務費", 41.5793, "度", 12, 499, "充電服務費每度12元");
-            myInvoice.AddInvoiceItem(1, "占用費", 30, "分鐘", 50, 25, "占用費每小時50元");
-            // 開立發票
-            myInvoice.GetInvoiceResponse();
             
-            // 搜尋發票
-            myInvoice.SearchResponseByDataNumber("202202150004");
+                // 填具待開立發票的相關資料(Preinvoice)
+                myInvoice.DataNumber = "20220215030";
+                myInvoice.DataDate = DateTime.Today;
+                myInvoice.BuyerId = null; // 一般消費者
+                myInvoice.TotalAmount = 524;
+                myInvoice.CarrierId1 = "/CPDF.O2";
+                myInvoice.MainRemark = "交易訂單號:1234567888";
+                myInvoice.ContactEmail = "snoopy.h.huang@outlook.com";
+                myInvoice.ContactPhone = "0929168960";
+                myInvoice.AddInvoiceItem(0, "充電服務費", 41.5793, "度", 12, 499, "充電服務費每度12元");
+                myInvoice.AddInvoiceItem(1, "占用費", 30, "分鐘", 50, 25, "占用費每小時50元");
+                // 開立發票
+                myInvoice.GetInvoiceResponse();
+
 
             Console.WriteLine("Press enter to exit");
             Console.ReadLine();
         }
 
-        private static void MyInvoice_InvoiceGenerated(string dataNumber, string invoiceNumber,
-                                                       string invoiceDate, string invoiceTime, string randomNumber)
-        {
-            Console.WriteLine("發票開立成功-----");
-            Console.WriteLine("單據編號:" + dataNumber);
-            Console.WriteLine("發票號碼:" + invoiceNumber);
-            Console.WriteLine("發票日期:" + invoiceDate);
-            Console.WriteLine("發票時間:" + invoiceTime);
-            Console.WriteLine("隨機碼:" + randomNumber);
-        }
-
-        private static void MyInvoice_InvoiceAssignNumberFailed(string dataNumber, string description)
-        {
-            Console.WriteLine("發票配號失敗-----");
-            Console.WriteLine("單據編號:" + dataNumber);
-            Console.WriteLine("錯誤代碼與描述:" + description);
-        }
-
-        private static void MyInvoice_InvoiceUploadFailed(string dataNumber, string invoiceNumber, string randomNumber, 
-                                                          string description)
+        private static void MyInvoice_InvoiceCompleted(List<InvoiceGenerator.InvoiceResponseItem> responseItems)
         {
-            Console.WriteLine("發票已配號但是上傳失敗-----");
-            Console.WriteLine("單據編號:" + dataNumber);
-            Console.WriteLine("發票配號:" + invoiceNumber);
-            Console.WriteLine("隨機碼:" + randomNumber);
-            Console.WriteLine("錯誤代碼與描述:" + description);
+            List<InvoiceGenerator.InvoiceResponseItem> list = new List<InvoiceGenerator.InvoiceResponseItem>(responseItems);
+            foreach (InvoiceGenerator.InvoiceResponseItem item in list)
+            {
+                Console.WriteLine(item.ResponseStatus);
+                Console.WriteLine(item.ResponseInvoiceNumber);
+                Console.WriteLine(item.ResponseDataNumber);
+                Console.WriteLine(item.ResponseInvoiceDate);
+                Console.WriteLine(item.ResponseInvoiceTime);
+                Console.WriteLine(item.ResponseRandomNumber);
+                Console.WriteLine(item.ResponseInvoiceError);
+            }
         }
     }
 }