feat(esppApi): добавлены методы взятия в работу, выполнения и списания трудозатрат
This commit is contained in:
@@ -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;
|
||||||
@@ -29,16 +58,16 @@ namespace PARR.EsppApi
|
|||||||
conditions.Add($"description like \"*{query.DescriptionContains}*\"");
|
conditions.Add($"description like \"*{query.DescriptionContains}*\"");
|
||||||
//if (!string.IsNullOrEmpty(query.TemplateNameContains))
|
//if (!string.IsNullOrEmpty(query.TemplateNameContains))
|
||||||
// conditions.Add($"templateName like \"*{query.TemplateNameContains}*\"");
|
// conditions.Add($"templateName like \"*{query.TemplateNameContains}*\"");
|
||||||
|
|
||||||
if (generateDateStartWOTimeZone.HasValue)
|
if (generateDateStartWOTimeZone.HasValue)
|
||||||
conditions.Add($"open.time>='{generateDateStartWOTimeZone.Value.Day}/{generateDateStartWOTimeZone.Value.Month}/{generateDateStartWOTimeZone.Value.Year}" +
|
conditions.Add($"open.time>='{generateDateStartWOTimeZone.Value.Day}/{generateDateStartWOTimeZone.Value.Month}/{generateDateStartWOTimeZone.Value.Year}" +
|
||||||
$" {generateDateStartWOTimeZone.Value.Hour}:{generateDateStartWOTimeZone.Value.Minute}:{generateDateStartWOTimeZone.Value.Second}'");
|
$" {generateDateStartWOTimeZone.Value.Hour}:{generateDateStartWOTimeZone.Value.Minute}:{generateDateStartWOTimeZone.Value.Second}'");
|
||||||
|
|
||||||
if (generateDateEndWOTimeZone.HasValue)
|
if (generateDateEndWOTimeZone.HasValue)
|
||||||
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
//взять в работу
|
|
||||||
//выполнить + списать трудозатраты
|
|
||||||
//найти по номеру
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ namespace PARR.EsppApi.Models
|
|||||||
return new DateTimeOffset(utc, new TimeSpan(0));
|
return new DateTimeOffset(utc, new TimeSpan(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
14
PARR.EsppApi/Models/EsppResponse.cs
Normal file
14
PARR.EsppApi/Models/EsppResponse.cs
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
27
PARR.EsppApi/Models/Query/AddMtnkQuery.cs
Normal file
27
PARR.EsppApi/Models/Query/AddMtnkQuery.cs
Normal 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;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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>
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user