Exchange_1C_Counterparty/HRM_MQ_Consumer_Service/Parsers/CounterpartyXMLParser.cs
2025-07-10 16:35:13 +05:00

169 lines
7.9 KiB
C#
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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