feat(esppApi): добавлены методы взятия в работу, выполнения и списания трудозатрат

This commit is contained in:
Mikhail Kuznetsov
2023-10-27 16:39:59 +10:00
parent a84d6f8de3
commit c4c8b748f0
10 changed files with 148 additions and 29 deletions

View File

@@ -18,6 +18,35 @@ namespace PARR.EsppApi
this.esppHttpService = esppHttpService; this.esppHttpService = esppHttpService;
} }
public Task<EsppResultBase<EsppResponse>> SetStatusInWorkAsync(string recordId)//TODO упростить можно без RecordIdQuery
{
return SetStatusAsync(recordId, "2-В работе");
}
public Task<EsppResultBase<EsppResponse>> SetStatusIsDone(string recordId)//TODO упростить можно без RecordIdQuery
{
return SetStatusAsync(recordId, "4-Выполнен");
}
private async Task<EsppResultBase<EsppResponse>> SetStatusAsync(string recordId, string newStatusStr)
{
//TODO assignee сразу назначаем принудительно, чтобы было понятно кто менял объект
var result = await esppHttpService.SendAsync<EsppResponse>($"<ROOT operation=\"SaveTask\" returnFormat=\"json\">{{\"recordid\":\"{recordId}\",\"status\":\"{newStatusStr}\", \"assignee\":\"{esppOrderSettings.AccountName}\"}}</ROOT>");
if (result.Data != null && result.Data.ErrorCode != "0")
return new EsppResultBase<EsppResponse>(null, false, new Exception(result.Data.Message));
return result;
}
public async Task<EsppResultBase<EsppOrder>> FindOrderByRecordIdAsync(string recordId)
{
var result = await esppHttpService.SendAsync<EsppOrder>($"<ROOT operation=\"GetTask\" returnFormat=\"json\">\r\n{{\"recordid\":\"{recordId}\"}}\r\n</ROOT>");//TODO упростить можно без RecordIdQuery
return result;
}
public async Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersAsync(FindOrdersQuery query) public async Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersAsync(FindOrdersQuery query)
{ {
DateTime? generateDateStartWOTimeZone = query.GenerateDateStart.HasValue ? query.GenerateDateStart.Value.AddHours(esppOrderSettings.EsppUserTimeZone) : null; DateTime? generateDateStartWOTimeZone = query.GenerateDateStart.HasValue ? query.GenerateDateStart.Value.AddHours(esppOrderSettings.EsppUserTimeZone) : null;
@@ -38,7 +67,7 @@ namespace PARR.EsppApi
conditions.Add($"open.time<='{generateDateEndWOTimeZone.Value.Day}/{generateDateEndWOTimeZone.Value.Month}/{generateDateEndWOTimeZone.Value.Year}" + conditions.Add($"open.time<='{generateDateEndWOTimeZone.Value.Day}/{generateDateEndWOTimeZone.Value.Month}/{generateDateEndWOTimeZone.Value.Year}" +
$" {generateDateEndWOTimeZone.Value.Hour}:{generateDateEndWOTimeZone.Value.Minute}:{generateDateEndWOTimeZone.Value.Second}'"); $" {generateDateEndWOTimeZone.Value.Hour}:{generateDateEndWOTimeZone.Value.Minute}:{generateDateEndWOTimeZone.Value.Second}'");
if (conditions.Count < 1) if (!conditions.Any())
{ {
logger.LogDebug("Пришёл пустой запрос в EsppHttpService.FindOrdersAsync"); logger.LogDebug("Пришёл пустой запрос в EsppHttpService.FindOrdersAsync");
return new EsppResultBase<IEnumerable<EsppOrder>>(null, false); return new EsppResultBase<IEnumerable<EsppOrder>>(null, false);
@@ -49,5 +78,18 @@ namespace PARR.EsppApi
return result; return result;
} }
public async Task<EsppResultBase<EsppResponse>> AddMTnk(AddMtnkQuery mtnk)
{
var result = await esppHttpService.SendAsync<EsppResponse>(
$"<ROOT operation=\"AddMTNK\" returnFormat=\"json\">{{\"recordid\":\"{mtnk.RecordId}\"," +
$"\"joboperation\":\"{mtnk.JobOperation}\",\"time\":\"{mtnk.Time}\",\"workscope\":\"{mtnk.Workspace}\"" +
$"}}</ROOT>");
if (result.Data != null && result.Data.ErrorCode != "0")
return new EsppResultBase<EsppResponse>(null, false, new Exception(result.Data.Message));
return result;
}
} }
} }

View File

@@ -10,10 +10,26 @@ namespace PARR.EsppApi
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersAsync(FindOrdersQuery query); Task<EsppResultBase<IEnumerable<EsppOrder>>> FindOrdersAsync(FindOrdersQuery query);
/// <summary>
//взять в работу /// Поиск наряда по номеру
//выполнить + списать трудозатраты /// </summary>
//найти по номеру /// <returns></returns>
Task<EsppResultBase<EsppOrder>> FindOrderByRecordIdAsync(string recordId);
/// <summary>
/// Взять наряд в работу
/// </summary>
/// <returns></returns>
Task<EsppResultBase<EsppResponse>> SetStatusInWorkAsync(string recordId);
/// <summary>
/// Установить статус наряда как выполнен
/// </summary>
/// <returns></returns>
Task<EsppResultBase<EsppResponse>> SetStatusIsDone(string recordId);
/// <summary>
/// Списание трудозатрат по модульным ТНК
/// </summary>
/// <returns></returns>
Task<EsppResultBase<EsppResponse>> AddMTnk(AddMtnkQuery mtnk);
} }
} }

View File

@@ -37,7 +37,6 @@ namespace PARR.EsppApi.Models
return new DateTimeOffset(utc, new TimeSpan(0)); return new DateTimeOffset(utc, new TimeSpan(0));
} }
} }
} }
} }

View File

@@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PARR.EsppApi.Models
{
public class EsppResponse
{
public string Message { get; set; } = string.Empty;
public string ErrorCode { get; set; } = string.Empty;
}
}

View File

@@ -0,0 +1,27 @@
namespace PARR.EsppApi.Models.Query
{
public class AddMtnkQuery
{
/// <summary>
/// номер наряда
/// </summary>
public required string RecordId { get; set; }
/// <summary>
/// операция для списания, должна совпадать по тексту с АСУ ЕСПП
/// </summary>
public required string JobOperation { get; set; }
/// <summary>
/// время в формате чч:мм
/// </summary>
public required string Time { get; set; }
/// <summary>
/// объём работ
/// </summary>
public int Workspace { get; set; } = 1;
}
}

View File

@@ -5,15 +5,11 @@
/// </summary> /// </summary>
public class FindOrdersQuery public class FindOrdersQuery
{ {
/// <summary> /// <summary>
/// Подробное описание, содержит значение /// Подробное описание, содержит значение
/// </summary> /// </summary>
public string? DescriptionContains { get; set; } public string? DescriptionContains { get; set; }
private DateTime? _generateDateStart;
/// <summary> /// <summary>
/// Дата сначала которой выбирать созданные наряды, UTC /// Дата сначала которой выбирать созданные наряды, UTC
/// </summary> /// </summary>

View File

@@ -1,8 +1,5 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using PARR.EsppApi.Models; using PARR.EsppApi.Models;
using System;
using System.Net.Http.Json;
using System.Text;
using System.Text.Json; using System.Text.Json;
namespace PARR.EsppApi namespace PARR.EsppApi
@@ -12,7 +9,7 @@ namespace PARR.EsppApi
private readonly ILogger<EsppHttpService> logger; private readonly ILogger<EsppHttpService> logger;
private readonly HttpClient httpClient; private readonly HttpClient httpClient;
public EsppHttpService(ILogger<EsppHttpService> logger,HttpClient httpClient) public EsppHttpService(ILogger<EsppHttpService> logger, HttpClient httpClient)
{ {
this.logger = logger; this.logger = logger;
this.httpClient = httpClient; this.httpClient = httpClient;
@@ -29,19 +26,16 @@ namespace PARR.EsppApi
var response = await httpClient.SendAsync(request); var response = await httpClient.SendAsync(request);
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
{
logger.LogError($"Ошибка при получении данных из АСУ ЕСПП, StatusCode:{response.StatusCode}"); logger.LogError($"Ошибка при получении данных из АСУ ЕСПП, StatusCode:{response.StatusCode}");
}
var responseString = await response.Content.ReadAsStringAsync(); var responseString = await response.Content.ReadAsStringAsync();
logger.LogDebug($"Получил данные, строка: {responseString}"); logger.LogDebug($"Получил данные, строка: {responseString}");
var obj = JsonSerializer.Deserialize<T>(responseString); var obj = JsonSerializer.Deserialize<T>(responseString);
return new EsppResultBase<T>(obj, true);
return new EsppResultBase<T>(obj, true);
} }
catch (Exception ex) catch (Exception ex)
{ {

View File

@@ -5,7 +5,11 @@ namespace PARR.EsppApi.Settings
internal class EsppOrderSettings internal class EsppOrderSettings
{ {
public string Url { get; set; } = string.Empty; public string Url { get; set; } = string.Empty;
public string UserName { get; set; } = string.Empty; public string UserName { get; set; } = string.Empty;
public string AccountName { get; set; } = string.Empty;
public string Password { get; set; } = string.Empty; public string Password { get; set; } = string.Empty;
/// <summary> /// <summary>

View File

@@ -1,6 +1,5 @@
using PARR.EsppApi; using PARR.EsppApi;
using PARR.EsppApi.Models.Query; using PARR.EsppApi.Models.Query;
using System.ComponentModel.Design.Serialization;
namespace PARR.Test namespace PARR.Test
{ {
@@ -17,11 +16,6 @@ namespace PARR.Test
protected override async Task ExecuteAsync(CancellationToken stoppingToken) protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{ {
//while (!stoppingToken.IsCancellationRequested)
//{
// _logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now);
// await Task.Delay(1000, stoppingToken);
//}
await TestEsppApi(); await TestEsppApi();
} }
@@ -29,11 +23,43 @@ namespace PARR.Test
private async Task TestEsppApi() private async Task TestEsppApi()
{ {
var result = await esppApiService.FindOrdersAsync(new FindOrdersQuery { DescriptionContains = "Полное", GenerateDateStart = new DateTime(2023, 10, 10) , GenerateDateEnd = new DateTime(2023, 10, 24) }); //var result = await esppApiService.FindOrdersAsync(new FindOrdersQuery { DescriptionContains = "Полное", GenerateDateStart = new DateTime(2023, 10, 10) , GenerateDateEnd = new DateTime(2023, 10, 24) });
var recordId = "НАР23-00049787";
if (result.IsSuccess) var result = await esppApiService.FindOrderByRecordIdAsync(recordId);
if (result.IsSuccess && (result.Data != null && result.Data.Number.Any()))
{ {
var orders = result.Data; //var orders = result.Data;
var inWorkResult = await esppApiService.SetStatusInWorkAsync(recordId);
if (!inWorkResult.IsSuccess)
{
_logger.LogError(inWorkResult.Exception, $"Не удалось взять в работу наряда{recordId}");
return;
}
var tnk = new AddMtnkQuery { RecordId = recordId, JobOperation = "Не учтена в перечне ТНК", Time = "00:05" };
var addMtnkResult = await esppApiService.AddMTnk(tnk);
if (!addMtnkResult.IsSuccess)
{
_logger.LogError(addMtnkResult.Exception, $"Не удалось списать трудозатраты наряда {recordId}");
return;
}
var resFinish = await esppApiService.SetStatusIsDone(recordId);
if (!resFinish.IsSuccess)
{
_logger.LogError(resFinish.Exception, $"Не удалось обновить статус наряда {recordId}");
return;
}
}
else
{
_logger.LogWarning($"не найден наряд {recordId}");
} }
} }
} }

View File

@@ -26,6 +26,7 @@
"EsppOrderSettings": { "EsppOrderSettings": {
"Url": "http://rzd-espp-t-rpa-app-1.gvc.oao.rzd:8080/espp_api/OperationExecutor/", "Url": "http://rzd-espp-t-rpa-app-1.gvc.oao.rzd:8080/espp_api/OperationExecutor/",
"UserName": "Auto-PTK-DVS", "UserName": "Auto-PTK-DVS",
"AccountName": "АВТО ТЕХНОЛОГ ПТК-ДВС (AUTO-PTK-DVS)",
"Password": "123456789", "Password": "123456789",
"EsppUserTimeZone": 10 "EsppUserTimeZone": 10
} }