Add project
Basic formatting applied. Unnecessary comments have been removed. Suspicious code is covered by TODO.
This commit is contained in:
141
Hcs.Client/ClientApi/DebtRequestsApi/HcsDebtResponseImporter.cs
Normal file
141
Hcs.Client/ClientApi/DebtRequestsApi/HcsDebtResponseImporter.cs
Normal file
@ -0,0 +1,141 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
using DebtRequests = Hcs.Service.Async.DebtRequests.v14_5_0_1;
|
||||
|
||||
namespace Hcs.ClientApi.DebtRequestsApi
|
||||
{
|
||||
public class HcsDebtResponseImporter : HcsDebtRequestsMethod
|
||||
{
|
||||
public HcsDebtResponseImporter(HcsClientConfig config) : base(config)
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<HcsDebtResponseResult[]> ImportDSRResponses(
|
||||
HcsDebtResponse[] debtResponses, CancellationToken token = default)
|
||||
{
|
||||
if (debtResponses == null || debtResponses.Length == 0)
|
||||
throw new ArgumentException("Пустой debtResponses");
|
||||
|
||||
var actions = debtResponses.Select(x => ConvertToImportAction(x)).ToArray();
|
||||
|
||||
var requestHeader = CreateRequestHeader();
|
||||
var requestBody = new DebtRequests.importDSRResponsesRequest
|
||||
{
|
||||
Id = HcsConstants.SignedXmlElementId,
|
||||
// TODO: Проверить комментарий
|
||||
// Версия предустановлена в WSDL, реальная версия шаблонов дает ошибку "Bad Request"
|
||||
//version = HcsConstants.DefaultHCSVersionString,
|
||||
action = actions
|
||||
};
|
||||
|
||||
var request = new DebtRequests.importResponsesRequest
|
||||
{
|
||||
RequestHeader = requestHeader,
|
||||
importDSRResponsesRequest = requestBody
|
||||
};
|
||||
|
||||
var ack = await SendAsync(request, token);
|
||||
var result = await WaitForResultAsync(ack, true, token);
|
||||
|
||||
var responseResults = result.Items.Select(
|
||||
x => ParseDebtResponseResultSafely(x)).ToArray();
|
||||
|
||||
if (debtResponses.Length != responseResults.Length)
|
||||
throw new HcsException(
|
||||
$"Количество направленных ответов {debtResponses.Length} не совпадает" +
|
||||
$" с количеством {responseResults.Length} результатов обработки");
|
||||
|
||||
foreach (var response in debtResponses)
|
||||
{
|
||||
var found = responseResults.FirstOrDefault(x => x.TransportGuid == response.TransportGuid);
|
||||
if (found != null) found.SubrequestGuid = response.SubrequestGuid;
|
||||
}
|
||||
|
||||
return responseResults;
|
||||
}
|
||||
|
||||
private DebtRequests.importDSRResponsesRequestAction ConvertToImportAction(
|
||||
HcsDebtResponse source)
|
||||
{
|
||||
DebtRequests.DebtInfoType[] debtInfo = null;
|
||||
if (source.HasDebt)
|
||||
{
|
||||
if (IsArrayEmpty(source.PersonalData)) throw new HcsException("Не указаны должники");
|
||||
debtInfo = source.PersonalData.Select(x => new DebtRequests.DebtInfoType
|
||||
{
|
||||
person = new DebtRequests.DebtInfoTypePerson
|
||||
{
|
||||
firstName = x.FirstName,
|
||||
lastName = x.LastName,
|
||||
middleName = x.MiddleName
|
||||
}
|
||||
}).ToArray();
|
||||
}
|
||||
|
||||
var responseData = new DebtRequests.ImportDSRResponseType()
|
||||
{
|
||||
hasDebt = source.HasDebt,
|
||||
description = source.Description,
|
||||
Items = debtInfo,
|
||||
// TODO: Проверить комментарий
|
||||
//debtInfo = debtInfo, // Так было в hcs-v13
|
||||
executorGUID = ClientConfig.ExecutorGUID
|
||||
};
|
||||
|
||||
return new DebtRequests.importDSRResponsesRequestAction()
|
||||
{
|
||||
subrequestGUID = source.SubrequestGuid.ToString(),
|
||||
TransportGUID = source.TransportGuid.ToString(),
|
||||
actionType = DebtRequests.DSRResponseActionType.Send,
|
||||
responseData = responseData
|
||||
};
|
||||
}
|
||||
|
||||
private HcsDebtResponseResult ParseDebtResponseResultSafely(object resultItem)
|
||||
{
|
||||
try
|
||||
{
|
||||
return ParseDebtResponseResult(resultItem);
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
return new HcsDebtResponseResult() { Error = e };
|
||||
}
|
||||
}
|
||||
|
||||
private HcsDebtResponseResult ParseDebtResponseResult(object resultItem)
|
||||
{
|
||||
if (resultItem == null) throw new HcsException("Пустой resultItem");
|
||||
|
||||
var common = resultItem as DebtRequests.CommonResultType;
|
||||
if (common == null) throw new HcsException($"Неожиданный тип экземпляра ответа {resultItem.GetType()}");
|
||||
|
||||
if (common.Items == null || common.Items.Length == 0)
|
||||
throw new HcsException("Пустой набор common.Items");
|
||||
|
||||
var result = new HcsDebtResponseResult();
|
||||
foreach (var commonItem in common.Items)
|
||||
{
|
||||
if (commonItem == null) throw new HcsException("Пустой commonItem");
|
||||
|
||||
switch (commonItem)
|
||||
{
|
||||
case DebtRequests.CommonResultTypeError error:
|
||||
result.Error = new HcsRemoteException(error.ErrorCode, error.Description);
|
||||
break;
|
||||
case DateTime updateDate:
|
||||
result.UpdateDate = updateDate;
|
||||
break;
|
||||
default:
|
||||
throw new HcsException($"Неожиданный тип сommonItem" + commonItem.GetType());
|
||||
}
|
||||
}
|
||||
|
||||
result.TransportGuid = ParseGuid(common.TransportGUID);
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user