|
@@ -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; }
|