2023-11-20 12:26:33 +10:00
using Microsoft.Extensions.Logging ;
2023-11-20 16:59:58 +10:00
using PARR.Constants ;
2023-11-20 12:26:33 +10:00
using PARR.DAL.Models ;
using PARR.EsppApi ;
2023-11-28 15:33:59 +10:00
using PARR.EsppApi.Constants ;
2023-11-20 16:59:58 +10:00
using PARR.EsppApi.Models.Query ;
2023-11-21 12:26:08 +10:00
using PARR.EsppOrderManager.Settings ;
2023-11-20 12:26:33 +10:00
namespace PARR.EsppOrderManager.Services
{
internal class EsppOrderService : IEsppOrderService
{
private readonly ILogger < EsppOrderService > logger ;
private readonly IEsppApiService esppApiService ;
2023-11-21 12:26:08 +10:00
private readonly EsppPoligonSettings esppPoligonSettings ;
2023-11-20 12:26:33 +10:00
public EsppOrderService (
ILogger < EsppOrderService > logger ,
2023-11-21 12:26:08 +10:00
IEsppApiService esppApiService ,
EsppPoligonSettings esppPoligonSettings
2023-11-20 12:26:33 +10:00
)
{
this . logger = logger ;
this . esppApiService = esppApiService ;
2023-11-21 12:26:08 +10:00
this . esppPoligonSettings = esppPoligonSettings ;
2023-11-20 12:26:33 +10:00
}
public async Task < bool > ChangeOrderToEsppAsync ( Order order , string resultMsg , TimeSpan duration )
{
// Наряд нужно провести по всем статусам
// Найти наряд, посмотреть е г о текущий статус (вдруг статус в ЕСПП был изменен, а в бд нет)
// Сначала взять в работу
// Списать Т Н К
// Выполнить
var esppOrderResult = await esppApiService . FindOrderByRecordIdAsync ( order . Number ) ;
if ( ! esppOrderResult . IsSuccess | | esppOrderResult . Data = = null )
{
logger . LogError ( $"Н е найден наряд в ЕСПП: {order.Number}" ) ;
return false ;
}
// проверяем, совпадает ли NextStatus с о статусом в ЕСПП
2023-11-20 16:59:58 +10:00
// Если совпадают, значит в еспп поменяли и не изменили в БД раньше (может ошибка была, может руками кто сделал)
2023-11-20 12:26:33 +10:00
// так что говорим, как будто бы все ок
if ( IsEquelEsppStatusAndNextStatus ( order . NextStatusCode ! . Value , esppOrderResult . Data . StatusEnum ) )
{
logger . LogInformation ( $"Для наряда {order.Number}, статус в ЕСПП совпадает с {nameof(order.NextStatusCode)} = {order.NextStatus!.Description}. " +
$"Статус в ЕСПП менять не нужно." ) ;
return true ;
}
2023-11-20 16:59:58 +10:00
// Установить статус 2-В работе
if ( order . NextStatusCode = = ( int ) OrderStatusEnum . InWork )
if ( esppOrderResult . Data . StatusEnum = = OrderStatusEnum . New | | esppOrderResult . Data . StatusEnum = = OrderStatusEnum . Stop )
2023-11-21 14:37:41 +10:00
return await SetInWorkStatusAsync ( order . Number , "" ) ; //resultMsg);
2023-11-20 16:59:58 +10:00
// Списать трудозатраты и установить статус 4-Выполнен
if ( order . NextStatusCode = = ( int ) OrderStatusEnum . Complete )
{
var statusIsWork = esppOrderResult . Data . StatusEnum = = OrderStatusEnum . InWork ;
// если текущий статус != 2-В работе, сначала меняем статус на 2-В работе, а затем уже списываем трудозатраты и меняем на 4-Выполнен
if ( ! statusIsWork )
2023-11-21 14:37:41 +10:00
statusIsWork = await SetInWorkStatusAsync ( order . Number , "" ) ; //resultMsg);
2023-11-20 16:59:58 +10:00
if ( statusIsWork )
{
// заполняем Т Н К
var tnk = new AddMtnkQuery
{
JobOperation = order ! . Template ! . ApplicationsInWork ! . Work ! . Name ,
RecordId = order . Number ,
2023-11-21 12:26:08 +10:00
Time = duration . ToString ( "hh\\:mm" )
2023-11-20 16:59:58 +10:00
} ;
2023-11-21 12:26:08 +10:00
if ( esppPoligonSettings . IsEnabled )
{
//для теста, подемеяем значения из БД
tnk . JobOperation = esppPoligonSettings . TnkValue ;
}
2023-11-20 16:59:58 +10:00
return await SetCompleteStatusAsync ( order . Number , resultMsg , tnk ) ;
}
else
{
logger . LogError ( $"Для наряда {order.Number} не могу изменить статус на {OrderStatusEnum.Complete}, так как текущий статус не {OrderStatusEnum.InWork}. " +
$"Текущий статус в ЕСПП: {esppOrderResult.Data.Status}" ) ;
return false ;
}
}
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
return false ;
}
/// <summary>
/// Установка статуса 4-Выполнен
/// </summary>
/// <param name="orderNumber"></param>
/// <param name="resultMsg"></param>
/// <param name="tnk"></param>
/// <returns></returns>
private async Task < bool > SetCompleteStatusAsync ( string orderNumber , string resultMsg , AddMtnkQuery tnk )
{
// списываем трудозатраты
var resultTnk = await esppApiService . AddMTnkAsync ( tnk ) ;
if ( ! resultTnk . IsSuccess )
{
logger . LogError ( resultTnk . Exception , $"Ошибка при списывании трудозатрат для наряда {orderNumber}." ) ;
return false ;
}
2023-11-21 12:26:08 +10:00
else
logger . LogDebug ( $"В ЕСПП, для наряда {orderNumber} списаны трудозатраты. Операция: {tnk.JobOperation}, время: {tnk.Time}" ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
// выполняем наряд
2023-11-28 15:33:59 +10:00
var result = await esppApiService . SetStatusIsDoneAsync ( orderNumber , resultMsg , EsppOrderClosingCodeEnum . Auto ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
if ( result . IsSuccess )
{
logger . LogDebug ( $"В ЕСПП, для наряда {orderNumber} установлен статус {OrderStatusEnum.Complete}" ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
return true ;
}
else
{
logger . LogError ( result . Exception , $"В ЕСПП, для наряда {orderNumber} не удалось установить статус {OrderStatusEnum.Complete}." ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
return false ;
}
}
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
/// <summary>
/// Установка статуса 2-В работе
/// </summary>
/// <param name="orderNumber"></param>
/// <param name="resultMsg"></param>
/// <returns></returns>
2023-11-21 14:37:41 +10:00
private async Task < bool > SetInWorkStatusAsync ( string orderNumber , string resultMsg = "" )
2023-11-20 16:59:58 +10:00
{
var result = await esppApiService . SetStatusInWorkAsync ( orderNumber , resultMsg ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
if ( result . IsSuccess )
{
logger . LogDebug ( $"В ЕСПП, для наряда {orderNumber} установлен статус {OrderStatusEnum.InWork}" ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
return true ;
}
else
{
logger . LogError ( result . Exception , $"В ЕСПП, для наряда {orderNumber} не удалось установить статус {OrderStatusEnum.InWork}." ) ;
2023-11-20 12:26:33 +10:00
2023-11-20 16:59:58 +10:00
return false ;
}
2023-11-20 12:26:33 +10:00
}
/// <summary>
/// Совпадает ли NextStatus и Еспп статусом
/// </summary>
/// <returns></returns>
private bool IsEquelEsppStatusAndNextStatus ( int nextStatusCode , OrderStatusEnum esppStatus )
{
return nextStatusCode = = ( int ) esppStatus ;
}
}
}