using System; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Hcs.ClientApi.DebtRequestsApi { public class HcsDebtRequestsApi { private HcsClientConfig config; public HcsDebtRequestsApi(HcsClientConfig config) { this.config = config; } public async Task ExportDSRByRequestNumber( string requestNumber, CancellationToken token = default) { var worker = new HcsDebtSubrequestExporter(config); return await worker.ExportDSRByRequestNumber(requestNumber, token); } /// /// Получение списка запросов о наличии задолженности направленных в данный период /// public async Task ExportDSRsByPeriodOfSending( DateTime startDate, DateTime endDate, Guid? firstSubrequestGuid, Action resultHandler, CancellationToken token = default) { var worker = new HcsDebtSubrequestExporter(config); return await worker.ExportDSRsByPeriodOfSending( startDate, endDate, firstSubrequestGuid, resultHandler, token); } /// /// Отправка пакета ответов на запросы о наличии задолженности /// public async Task ImportDSRsResponsesAsOneBatch( HcsDebtResponse[] responses, Action resultHandler, CancellationToken token = default) { var worker = new HcsDebtResponseImporter(config); var results = await worker.ImportDSRResponses(responses, token); foreach (var response in responses) { var result = results.FirstOrDefault( x => x.SubrequestGuid == response.SubrequestGuid && x.TransportGuid == response.TransportGuid); if (result == null) { result = new HcsDebtResponseResult(); result.TransportGuid = response.TransportGuid; result.SubrequestGuid = response.SubrequestGuid; result.Error = new HcsException( $"В пакете результатов приема ответов нет" + $" результата для подзапроса {response.SubrequestGuid}"); } resultHandler(response, result); } return responses.Length; } /// /// Отправка ответов на запросы о наличии задолженности для списков любой длины /// public async Task ImportDSRsResponses( HcsDebtResponse[] responses, Action resultHandler, CancellationToken token = default) { int chunkSize = 20; int i = 0; HcsDebtResponse[][] chunks = responses.GroupBy(s => i++ / chunkSize).Select(g => g.ToArray()).ToArray(); int n = 0; foreach (var chunk in chunks) { n += await ImportDSRsResponsesAsOneBatch(chunk, resultHandler, token); } return n; } /// /// Отправка ответа на один запрос о наличии задолженности /// public async Task ImportDSRResponse( HcsDebtResponse response, CancellationToken token = default) { HcsDebtResponse[] array = { response }; HcsDebtResponseResult result = null; await ImportDSRsResponses(array, (x, y) => result = y, token); return result; } } }