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;
}
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)
{
DateTime? generateDateStartWOTimeZone = query.GenerateDateStart.HasValue ? query.GenerateDateStart.Value.AddHours(esppOrderSettings.EsppUserTimeZone) : null;
@@ -29,16 +58,16 @@ namespace PARR.EsppApi
conditions.Add($"description like \"*{query.DescriptionContains}*\"");
//if (!string.IsNullOrEmpty(query.TemplateNameContains))
// conditions.Add($"templateName like \"*{query.TemplateNameContains}*\"");
if (generateDateStartWOTimeZone.HasValue)
conditions.Add($"open.time>='{generateDateStartWOTimeZone.Value.Day}/{generateDateStartWOTimeZone.Value.Month}/{generateDateStartWOTimeZone.Value.Year}" +
$" {generateDateStartWOTimeZone.Value.Hour}:{generateDateStartWOTimeZone.Value.Minute}:{generateDateStartWOTimeZone.Value.Second}'");
if (generateDateEndWOTimeZone.HasValue)
conditions.Add($"open.time<='{generateDateEndWOTimeZone.Value.Day}/{generateDateEndWOTimeZone.Value.Month}/{generateDateEndWOTimeZone.Value.Year}" +
$" {generateDateEndWOTimeZone.Value.Hour}:{generateDateEndWOTimeZone.Value.Minute}:{generateDateEndWOTimeZone.Value.Second}'");
if (conditions.Count < 1)
if (!conditions.Any())
{
logger.LogDebug("Пришёл пустой запрос в EsppHttpService.FindOrdersAsync");
return new EsppResultBase<IEnumerable<EsppOrder>>(null, false);
@@ -49,5 +78,18 @@ namespace PARR.EsppApi
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>
/// <returns></returns>
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));
}
}
}
}

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

View File

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

View File

@@ -5,7 +5,11 @@ namespace PARR.EsppApi.Settings
internal class EsppOrderSettings
{
public string Url { 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;
/// <summary>

View File

@@ -1,6 +1,5 @@
using PARR.EsppApi;
using PARR.EsppApi.Models.Query;
using System.ComponentModel.Design.Serialization;
namespace PARR.Test
{
@@ -17,11 +16,6 @@ namespace PARR.Test
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();
}
@@ -29,11 +23,43 @@ namespace PARR.Test
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": {
"Url": "http://rzd-espp-t-rpa-app-1.gvc.oao.rzd:8080/espp_api/OperationExecutor/",
"UserName": "Auto-PTK-DVS",
"AccountName": "АВТО ТЕХНОЛОГ ПТК-ДВС (AUTO-PTK-DVS)",
"Password": "123456789",
"EsppUserTimeZone": 10
}