169 lines
7.9 KiB
C#
169 lines
7.9 KiB
C#
using HRM_MQ_Consumer_Service.OData;
|
||
using System;
|
||
using System.Threading.Tasks;
|
||
using System.Xml;
|
||
|
||
namespace HRM_MQ_Consumer_Service.Parsers
|
||
{
|
||
internal class CounterpartyXMLParser
|
||
{
|
||
private Logger.Logger _logger;
|
||
private static QDocWrapper _wrapper;
|
||
|
||
public CounterpartyXMLParser()
|
||
{
|
||
_logger = new Logger.Logger("Counterparties_test");
|
||
_wrapper = new QDocWrapper(_logger);
|
||
}
|
||
public async Task<bool> Parse(string message)
|
||
{
|
||
var package = new PackageInfo();
|
||
var xml = new XmlDocument();
|
||
xml.LoadXml(message);
|
||
XmlElement xRoot = xml.DocumentElement;
|
||
XmlNodeList nodes = xRoot.SelectNodes("*");
|
||
package = GetPackageInfo(nodes, package);
|
||
|
||
foreach (var counterparty in package.AllLoadedComp)
|
||
{
|
||
if (counterparty.UpdCounterparty != null)
|
||
{
|
||
await _wrapper.UpdateCounterparty(counterparty);
|
||
}
|
||
else
|
||
{
|
||
await _wrapper.CreateCounterparty(counterparty);
|
||
}
|
||
}
|
||
|
||
_logger.Info("Package loading complete.");
|
||
return true;
|
||
}
|
||
|
||
private static PackageInfo GetPackageInfo(XmlNodeList nodeList, PackageInfo packageInfo)
|
||
{
|
||
foreach (XmlNode node in nodeList)
|
||
{
|
||
packageInfo = RecurseXmlDocumentNoSiblings(node, packageInfo);
|
||
}
|
||
return packageInfo;
|
||
}
|
||
|
||
private static PackageInfo RecurseXmlDocumentNoSiblings(XmlNode root, PackageInfo packageInfo)
|
||
{
|
||
if (root is XmlElement)
|
||
{
|
||
if (root.HasChildNodes)
|
||
return RecurseXmlDocument(root.FirstChild, packageInfo).Result;
|
||
}
|
||
return packageInfo;
|
||
}
|
||
|
||
private static async Task<PackageInfo> RecurseXmlDocument(XmlNode root, PackageInfo packageInfo)
|
||
{
|
||
if (root is XmlElement)
|
||
{
|
||
if (root.Name == "m:Дата")
|
||
// Dialogs.NotifyMessage("Дата отправки пакета " + root.InnerText);
|
||
packageInfo.DateReceived = DateTime.Parse(root.InnerText);
|
||
if (root.Name == "m:Номер")
|
||
// Dialogs.NotifyMessage("Номер пакета " + root.InnerText);
|
||
packageInfo.Id = root.InnerText;
|
||
if (root.Name == "m:Объекты")
|
||
{
|
||
|
||
XmlNodeList allObjLoad = root.ChildNodes;
|
||
if (allObjLoad.Count > 0)
|
||
{
|
||
//"Осуществляется загрузка контрагентов со следующими параметрами:"
|
||
|
||
foreach (XmlNode item in allObjLoad)
|
||
{
|
||
CounterParty tempCompany = null;
|
||
tempCompany = new CounterParty();
|
||
foreach (XmlNode Countparty in item.ChildNodes)
|
||
{
|
||
if (Countparty.Name == "m:Тип" && Countparty.InnerText != "Справочник.Контрагенты")
|
||
{
|
||
//$"Это не контрагент, тип {Countparty.InnerText}"
|
||
packageInfo.ErrorsList.Add($"Это не контрагент, тип {Countparty.InnerText}");
|
||
continue;
|
||
}
|
||
|
||
if (Countparty.Name == "m:Реквизиты")
|
||
{
|
||
foreach (XmlNode CountpartyOthers in Countparty.ChildNodes)
|
||
{
|
||
string tempKey = CountpartyOthers.ChildNodes[0].InnerText;
|
||
string tempValue = CountpartyOthers.ChildNodes[1].Name == "m:ЗначениеСсылка" ? CountpartyOthers.ChildNodes[1].ChildNodes[1].InnerText : CountpartyOthers.ChildNodes[1].InnerText;
|
||
|
||
switch (tempKey)
|
||
{
|
||
case "Наименование":
|
||
tempCompany.Name = tempValue;
|
||
break;
|
||
case "ГоловнойКонтрагент":
|
||
tempCompany.GeneralCompany = tempValue;
|
||
break;
|
||
case "НаименованиеПолное":
|
||
tempCompany.LegalName = tempValue;
|
||
break;
|
||
case "Код":
|
||
tempCompany.Code = tempValue;
|
||
break;
|
||
case "БИН":
|
||
tempCompany.Bin = tempValue;
|
||
break;
|
||
case "ЮрАдрес":
|
||
tempCompany.LegalAddress = tempValue;
|
||
break;
|
||
case "ФактАдрес":
|
||
tempCompany.PostalAddress = tempValue;
|
||
break;
|
||
case "Резидент":
|
||
tempCompany.Resident = bool.Parse(tempValue);
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!string.IsNullOrEmpty(tempCompany.Bin))
|
||
{
|
||
tempCompany.UpdCounterparty = _wrapper.GetCompanyByBIN(tempCompany.Bin).Result;
|
||
}
|
||
else
|
||
{
|
||
tempCompany.UpdCounterparty = _wrapper.GetCompanyByGuid(tempCompany.Guid).Result;
|
||
}
|
||
|
||
if (Countparty.Name == "m:Ид")
|
||
{
|
||
tempCompany.UpdCounterparty = _wrapper.GetCompanyByGuid(Countparty.InnerText).Result;
|
||
tempCompany.Guid = Countparty.InnerText;
|
||
}
|
||
if (Countparty.Name == "m:ПометкаУдаления")
|
||
tempCompany.Deleted = Countparty.InnerText;
|
||
}
|
||
//if (armad.ExchangeKZ.BusinessUnits.GetAll().FirstOrDefault(x => x.BINArmadoc == tempCompany.Bin) != null)
|
||
if (_wrapper.GetBusinessUnitByBin(tempCompany.Bin).Result)
|
||
{
|
||
continue;
|
||
}
|
||
packageInfo.AllLoadedComp.Add(tempCompany);
|
||
|
||
}
|
||
}
|
||
return packageInfo;
|
||
}
|
||
if (root.HasChildNodes)
|
||
packageInfo = RecurseXmlDocument(root.FirstChild, packageInfo).Result;
|
||
if (root.NextSibling != null)
|
||
packageInfo = RecurseXmlDocument(root.NextSibling, packageInfo).Result;
|
||
|
||
}
|
||
return packageInfo;
|
||
}
|
||
}
|
||
} |