feat(esppOrderManager): логика изменения статусов наряда. Добавлен проект с константами, вынес в него OrderStatusEnum. (EsppApi)Обновлена модель EsppOrder, при изменении статуса наряда, добавлено поле Решение.
This commit is contained in:
22
PARR.API.sln
22
PARR.API.sln
@@ -35,21 +35,23 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.GeneratorTemplates", "
|
|||||||
EndProject
|
EndProject
|
||||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.GeneratorTemplatesWorker", "PARR.GeneratorTemplatesWorker\PARR.GeneratorTemplatesWorker.csproj", "{BE11D005-D3FE-4F29-93A2-7379E729C78D}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.GeneratorTemplatesWorker", "PARR.GeneratorTemplatesWorker\PARR.GeneratorTemplatesWorker.csproj", "{BE11D005-D3FE-4F29-93A2-7379E729C78D}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderLoader", "PARR.EsppOrderLoader\PARR.EsppOrderLoader.csproj", "{F83395F9-CE33-40A5-BA1A-4A1233E9AA67}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderLoader", "PARR.EsppOrderLoader\PARR.EsppOrderLoader.csproj", "{F83395F9-CE33-40A5-BA1A-4A1233E9AA67}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderLoaderWorker", "PARR.EsppOrderLoaderWorker\PARR.EsppOrderLoaderWorker.csproj", "{868ED9E0-42AD-4540-90BE-31A57A21CD93}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderLoaderWorker", "PARR.EsppOrderLoaderWorker\PARR.EsppOrderLoaderWorker.csproj", "{868ED9E0-42AD-4540-90BE-31A57A21CD93}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.Master", "PARR.Master\PARR.Master.csproj", "{EB730B71-83BB-4787-8096-07F1D45CB55B}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Master", "PARR.Master\PARR.Master.csproj", "{EB730B71-83BB-4787-8096-07F1D45CB55B}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.MasterWorker", "PARR.MasterWorker\PARR.MasterWorker.csproj", "{DC64DE01-2C7F-4557-9F97-DBFA21E74C1C}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.MasterWorker", "PARR.MasterWorker\PARR.MasterWorker.csproj", "{DC64DE01-2C7F-4557-9F97-DBFA21E74C1C}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderManager", "PARR.EsppOrderManager\PARR.EsppOrderManager.csproj", "{771E46EC-8EB5-4BBE-9631-C6EBF7A237C1}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderManager", "PARR.EsppOrderManager\PARR.EsppOrderManager.csproj", "{771E46EC-8EB5-4BBE-9631-C6EBF7A237C1}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppOrderManagerWorker", "PARR.EsppOrderManagerWorker\PARR.EsppOrderManagerWorker.csproj", "{026C7940-9938-4294-B896-A6FFB0A33017}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppOrderManagerWorker", "PARR.EsppOrderManagerWorker\PARR.EsppOrderManagerWorker.csproj", "{026C7940-9938-4294-B896-A6FFB0A33017}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.EsppApi", "PARR.EsppApi\PARR.EsppApi.csproj", "{47A87CEC-9A16-4044-A7A3-E1430BE6C3AC}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.EsppApi", "PARR.EsppApi\PARR.EsppApi.csproj", "{47A87CEC-9A16-4044-A7A3-E1430BE6C3AC}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.Test", "PARR.Test\PARR.Test.csproj", "{CFE2A198-67BF-4828-8E8D-31A01858FDA7}"
|
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PARR.Test", "PARR.Test\PARR.Test.csproj", "{CFE2A198-67BF-4828-8E8D-31A01858FDA7}"
|
||||||
|
EndProject
|
||||||
|
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PARR.Constants", "PARR.Constants\PARR.Constants.csproj", "{46B09885-C9FB-449C-ACAA-24C671194C4D}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@@ -135,6 +137,10 @@ Global
|
|||||||
{CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
{CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
{CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
{CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
{CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Release|Any CPU.Build.0 = Release|Any CPU
|
{CFE2A198-67BF-4828-8E8D-31A01858FDA7}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
|
{46B09885-C9FB-449C-ACAA-24C671194C4D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||||
|
{46B09885-C9FB-449C-ACAA-24C671194C4D}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||||
|
{46B09885-C9FB-449C-ACAA-24C671194C4D}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||||
|
{46B09885-C9FB-449C-ACAA-24C671194C4D}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
namespace PARR.DAL.Contracts
|
namespace PARR.Constants
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Статус Наряда в ЕСПП
|
||||||
|
/// </summary>
|
||||||
public enum OrderStatusEnum
|
public enum OrderStatusEnum
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
9
PARR.Constants/PARR.Constants.csproj
Normal file
9
PARR.Constants/PARR.Constants.csproj
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
<Nullable>enable</Nullable>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
</Project>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
using Microsoft.EntityFrameworkCore;
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using PARR.Constants;
|
||||||
using PARR.DAL.Contracts;
|
using PARR.DAL.Contracts;
|
||||||
using PARR.DAL.Models;
|
using PARR.DAL.Models;
|
||||||
using PARR.DAL.Models.AIHIT;
|
using PARR.DAL.Models.AIHIT;
|
||||||
|
|||||||
@@ -17,4 +17,8 @@
|
|||||||
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
|
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="7.0.4" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\PARR.Constants\PARR.Constants.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
|
using PARR.Constants;
|
||||||
using PARR.DAL.Context;
|
using PARR.DAL.Context;
|
||||||
using PARR.DAL.Contracts;
|
|
||||||
using PARR.DAL.Models;
|
using PARR.DAL.Models;
|
||||||
using PARR.DAL.Services.Interfaces;
|
using PARR.DAL.Services.Interfaces;
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using PARR.DAL.Contracts;
|
using PARR.Constants;
|
||||||
|
using PARR.DAL.Contracts;
|
||||||
using PARR.DAL.Models;
|
using PARR.DAL.Models;
|
||||||
|
|
||||||
namespace PARR.DAL.Services.Interfaces
|
namespace PARR.DAL.Services.Interfaces
|
||||||
|
|||||||
@@ -18,21 +18,27 @@ namespace PARR.EsppApi
|
|||||||
this.esppHttpService = esppHttpService;
|
this.esppHttpService = esppHttpService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<EsppResultBase<EsppResponse>> SetStatusInWorkAsync(string recordId)//TODO упростить можно без RecordIdQuery
|
public Task<EsppResultBase<EsppResponse>> SetStatusInWorkAsync(string recordId, string resultMsg)//TODO упростить можно без RecordIdQuery
|
||||||
{
|
{
|
||||||
return SetStatusAsync(recordId, "2-В работе");
|
return SetStatusAsync(recordId, "2-В работе", resultMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<EsppResultBase<EsppResponse>> SetStatusIsDone(string recordId)//TODO упростить можно без RecordIdQuery
|
public Task<EsppResultBase<EsppResponse>> SetStatusIsDoneAsync(string recordId, string resultMsg)//TODO упростить можно без RecordIdQuery
|
||||||
{
|
{
|
||||||
|
return SetStatusAsync(recordId, "4-Выполнен", resultMsg);
|
||||||
return SetStatusAsync(recordId, "4-Выполнен");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task<EsppResultBase<EsppResponse>> SetStatusAsync(string recordId, string newStatusStr)
|
private async Task<EsppResultBase<EsppResponse>> SetStatusAsync(string recordId, string newStatusStr, string resultMsg)
|
||||||
{
|
{
|
||||||
//TODO assignee сразу назначаем принудительно, чтобы было понятно кто менял объект
|
//TODO assignee сразу назначаем принудительно, чтобы было понятно кто менял объект
|
||||||
var result = await esppHttpService.SendAsync<EsppResponse>($"<ROOT operation=\"SaveTask\" returnFormat=\"json\">{{\"recordid\":\"{recordId}\",\"status\":\"{newStatusStr}\", \"assignee\":\"{esppOrderSettings.AccountName}\"}}</ROOT>");
|
var query = $"<ROOT operation=\"SaveTask\" returnFormat=\"json\">{{" +
|
||||||
|
$"\"recordid\":\"{recordId}\"," +
|
||||||
|
$"\"status\":\"{newStatusStr}\"," +
|
||||||
|
$"\"assignee\":\"{esppOrderSettings.AccountName}\"" +
|
||||||
|
$"\"resolution\":\"{resultMsg}\"," +
|
||||||
|
$"}}</ROOT>";
|
||||||
|
|
||||||
|
var result = await esppHttpService.SendAsync<EsppResponse>(query);
|
||||||
|
|
||||||
if (result.Data != null && result.Data.ErrorCode != "0")
|
if (result.Data != null && result.Data.ErrorCode != "0")
|
||||||
return new EsppResultBase<EsppResponse>(null, false, new Exception(result.Data.Message));
|
return new EsppResultBase<EsppResponse>(null, false, new Exception(result.Data.Message));
|
||||||
@@ -79,7 +85,7 @@ namespace PARR.EsppApi
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<EsppResultBase<EsppResponse>> AddMTnk(AddMtnkQuery mtnk)
|
public async Task<EsppResultBase<EsppResponse>> AddMTnkAsync(AddMtnkQuery mtnk)
|
||||||
{
|
{
|
||||||
var result = await esppHttpService.SendAsync<EsppResponse>(
|
var result = await esppHttpService.SendAsync<EsppResponse>(
|
||||||
$"<ROOT operation=\"AddMTNK\" returnFormat=\"json\">{{\"recordid\":\"{mtnk.RecordId}\"," +
|
$"<ROOT operation=\"AddMTNK\" returnFormat=\"json\">{{\"recordid\":\"{mtnk.RecordId}\"," +
|
||||||
|
|||||||
@@ -21,19 +21,19 @@ namespace PARR.EsppApi
|
|||||||
/// Взять наряд в работу
|
/// Взять наряд в работу
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<EsppResultBase<EsppResponse>> SetStatusInWorkAsync(string recordId);
|
Task<EsppResultBase<EsppResponse>> SetStatusInWorkAsync(string recordId, string resultMsg);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Установить статус наряда как выполнен
|
/// Установить статус наряда как выполнен
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<EsppResultBase<EsppResponse>> SetStatusIsDone(string recordId);
|
Task<EsppResultBase<EsppResponse>> SetStatusIsDoneAsync(string recordId, string resultMsg);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Списание трудозатрат по модульным ТНК
|
/// Списание трудозатрат по модульным ТНК
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
Task<EsppResultBase<EsppResponse>> AddMTnk(AddMtnkQuery mtnk);
|
Task<EsppResultBase<EsppResponse>> AddMTnkAsync(AddMtnkQuery mtnk);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
using PARR.EsppApi.Settings;
|
using PARR.Constants;
|
||||||
|
using PARR.EsppApi.Settings;
|
||||||
using System.Globalization;
|
using System.Globalization;
|
||||||
using System.Text.Json.Serialization;
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
@@ -15,6 +16,9 @@ namespace PARR.EsppApi.Models
|
|||||||
[JsonPropertyName("assignment")]
|
[JsonPropertyName("assignment")]
|
||||||
public string? WorkGroup { get; set; }
|
public string? WorkGroup { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Статус наряда в формате строки
|
||||||
|
/// </summary>
|
||||||
[JsonPropertyName("status")]
|
[JsonPropertyName("status")]
|
||||||
public string Status { get; set; } = string.Empty;
|
public string Status { get; set; } = string.Empty;
|
||||||
|
|
||||||
@@ -37,6 +41,32 @@ namespace PARR.EsppApi.Models
|
|||||||
return new DateTimeOffset(utc, new TimeSpan(0));
|
return new DateTimeOffset(utc, new TimeSpan(0));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Статус наряда в формате OrderStatusEnum
|
||||||
|
/// </summary>
|
||||||
|
public OrderStatusEnum StatusEnum
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
switch (Status.Trim())
|
||||||
|
{
|
||||||
|
case "1-Направлен в группу":
|
||||||
|
return OrderStatusEnum.New;
|
||||||
|
case "2-В работе":
|
||||||
|
return OrderStatusEnum.InWork;
|
||||||
|
case "3-Приостановлен":
|
||||||
|
return OrderStatusEnum.Stop;
|
||||||
|
case "4-Выполнен":
|
||||||
|
return OrderStatusEnum.Complete;
|
||||||
|
case "5-Закрыт":
|
||||||
|
return OrderStatusEnum.Closed;
|
||||||
|
default:
|
||||||
|
//logger.LogWarning($"Не смог распознать статус наряда, вернул значение по умполчанию: {OrderStatusEnum.New.ToString()}, входящее значение: {statusName}");
|
||||||
|
return OrderStatusEnum.New;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,4 @@
|
|||||||
using System;
|
namespace PARR.EsppApi.Models
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Text;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace PARR.EsppApi.Models
|
|
||||||
{
|
{
|
||||||
public class EsppResponse
|
public class EsppResponse
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ using PARR.DAL.Contracts;
|
|||||||
using PARR.DAL.Models;
|
using PARR.DAL.Models;
|
||||||
using PARR.DAL.Services.Interfaces;
|
using PARR.DAL.Services.Interfaces;
|
||||||
using PARR.EsppApi;
|
using PARR.EsppApi;
|
||||||
|
using PARR.EsppApi.Models.Query;
|
||||||
|
using PARR.EsppOrderManager.Services;
|
||||||
using PARR.EsppOrderManager.Settings;
|
using PARR.EsppOrderManager.Settings;
|
||||||
|
|
||||||
namespace PARR.EsppOrderManager
|
namespace PARR.EsppOrderManager
|
||||||
@@ -17,7 +19,7 @@ namespace PARR.EsppOrderManager
|
|||||||
private readonly ILogger<EsppOrderManager> logger;
|
private readonly ILogger<EsppOrderManager> logger;
|
||||||
private readonly ITransformService transformService;
|
private readonly ITransformService transformService;
|
||||||
private readonly IOrderService orderService;
|
private readonly IOrderService orderService;
|
||||||
private readonly IEsppApiService esppApiService;
|
private readonly IEsppOrderService esppOrderService;
|
||||||
|
|
||||||
public EsppOrderManager(
|
public EsppOrderManager(
|
||||||
MqSettings mqSettings,
|
MqSettings mqSettings,
|
||||||
@@ -25,7 +27,7 @@ namespace PARR.EsppOrderManager
|
|||||||
ILogger<EsppOrderManager> logger,
|
ILogger<EsppOrderManager> logger,
|
||||||
ITransformService transformService,
|
ITransformService transformService,
|
||||||
IOrderService orderService,
|
IOrderService orderService,
|
||||||
IEsppApiService esppApiService
|
IEsppOrderService esppOrderService
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.mqSettings = mqSettings;
|
this.mqSettings = mqSettings;
|
||||||
@@ -33,7 +35,7 @@ namespace PARR.EsppOrderManager
|
|||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.transformService = transformService;
|
this.transformService = transformService;
|
||||||
this.orderService = orderService;
|
this.orderService = orderService;
|
||||||
this.esppApiService = esppApiService;
|
this.esppOrderService = esppOrderService;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async void Start()
|
public async void Start()
|
||||||
@@ -67,6 +69,7 @@ namespace PARR.EsppOrderManager
|
|||||||
.Include(t => t.AgentHistories).ThenInclude(t => t.AgentHistoryLevel)
|
.Include(t => t.AgentHistories).ThenInclude(t => t.AgentHistoryLevel)
|
||||||
.Include(t => t.OrderStatus)
|
.Include(t => t.OrderStatus)
|
||||||
.Include(t => t.NextStatus)
|
.Include(t => t.NextStatus)
|
||||||
|
.Include(t => t.Template).ThenInclude(t => t!.ApplicationsInWork).ThenInclude(t => t!.Work).ThenInclude(t => t!.Tnk)
|
||||||
.FirstOrDefaultAsync(t => t.Id == obj.OrderId);
|
.FirstOrDefaultAsync(t => t.Id == obj.OrderId);
|
||||||
|
|
||||||
if (order == null)
|
if (order == null)
|
||||||
@@ -81,15 +84,39 @@ namespace PARR.EsppOrderManager
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!order.NextStatusCode.HasValue)
|
||||||
|
{
|
||||||
|
logger.LogWarning($"У наряда {order.Id}, {order.Number} не установлено поле {nameof(order.NextStatusCode)}");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
var resultMsg = GenerateResultMsg(order);
|
var resultMsg = GenerateResultMsg(order);
|
||||||
var workDuration = CalcWorkDuration(order);
|
var workDuration = CalcWorkDuration(order);
|
||||||
|
|
||||||
//todo:!!! менять статус наряда. Можн ли закрыть не беря в работу?
|
// Изменям статус наряда в ЕСПП
|
||||||
|
var result = await esppOrderService.ChangeOrderToEsppAsync(order, resultMsg, workDuration);
|
||||||
|
|
||||||
|
if (result)
|
||||||
|
{
|
||||||
|
logger.LogInformation($"Статусы наряда {order.Number} в ЕСПП обновлены. Установлен статус: {order.NextStatus!.Description}");
|
||||||
|
|
||||||
|
//обновляем статусы в БД
|
||||||
|
order.StatusCode = order.NextStatusCode.Value;
|
||||||
|
if (!await orderService.CommitAsync())
|
||||||
|
{
|
||||||
|
logger.LogError($"Ошибка при обновлении статуса в БД у наряда: {order.Number}. Не установлен статус {order.NextStatus!.Description}");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
logger.LogError($"Ошибка при обновлении статуса наряда {order.Number}. Статус не изменен.");
|
||||||
|
|
||||||
|
logger.LogDebug($"Закончил работу с сообщением: {msg}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Генерирует текс поля Решение, в зависимости от статуса наряда и от истории Агента
|
/// Генерирует текст поля Решение, в зависимости от статуса наряда и от истории Агента
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="order"></param>
|
/// <param name="order"></param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
@@ -99,15 +126,17 @@ namespace PARR.EsppOrderManager
|
|||||||
.OrderBy(t => t.DateCreated)
|
.OrderBy(t => t.DateCreated)
|
||||||
.Select(t => $"{t.DateCreated} :: {t.AgentHistoryLevel?.Name} :: {t.Message}");
|
.Select(t => $"{t.DateCreated} :: {t.AgentHistoryLevel?.Name} :: {t.Message}");
|
||||||
|
|
||||||
|
var baseMsg = order.Template!.ApplicationsInWork!.Solution + "\r\n";
|
||||||
|
|
||||||
var msgAgent = "Работы выполнены средствами автоматизации. \r\n" +
|
var msgAgent = "Работы выполнены средствами автоматизации. \r\n" +
|
||||||
"Журнал работы: \r\n" +
|
"Журнал работы: \r\n" +
|
||||||
$"{string.Join("\r\n", agentHistory)}";
|
$"{string.Join("\r\n", agentHistory)}";
|
||||||
|
|
||||||
var msgAgentEmpty = "Работы должны были выполниться средствами автоматизации. " +
|
var msgAgentEmpty = "Работы должны были выполняться средствами автоматизации. " +
|
||||||
"Но от средств автоматизации не поступило сообщений. " +
|
"От средств автоматизации не поступило сообщений. " +
|
||||||
"Работы не выполнены.";
|
"Работы не выполнены.";
|
||||||
|
|
||||||
return agentHistory.Any() ? msgAgent : msgAgentEmpty;
|
return baseMsg + (agentHistory.Any() ? msgAgent : msgAgentEmpty);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -122,15 +151,41 @@ namespace PARR.EsppOrderManager
|
|||||||
.OrderBy(t => t.DateCreated);
|
.OrderBy(t => t.DateCreated);
|
||||||
|
|
||||||
if (!agentHistory.Any())
|
if (!agentHistory.Any())
|
||||||
return TimeSpan.Zero;
|
return GetTnkDurationByScriptDuration(TimeSpan.Zero);
|
||||||
|
|
||||||
var dateStart = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.Start)?.DateCreated;
|
var dateStart = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.Start)?.DateCreated;
|
||||||
var dateEnd = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.End)?.DateCreated;
|
var dateEnd = agentHistory.LastOrDefault(t => t.HistoryLevelId == (int)AgentHistoryLevelEnum.End)?.DateCreated;
|
||||||
|
|
||||||
if (dateStart.HasValue && dateEnd.HasValue)
|
if (dateStart.HasValue && dateEnd.HasValue)
|
||||||
return dateEnd.Value - dateStart.Value;
|
{
|
||||||
|
var duration = dateEnd.Value - dateStart.Value;
|
||||||
|
logger.LogDebug($"Продолжительность работы скрипта: {duration}");
|
||||||
|
|
||||||
return TimeSpan.Zero;
|
return GetTnkDurationByScriptDuration(duration);
|
||||||
|
}
|
||||||
|
|
||||||
|
return GetTnkDurationByScriptDuration(TimeSpan.Zero);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Получить время для списания ТНК по времени работы скрипта
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="scriptDuration"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
private TimeSpan GetTnkDurationByScriptDuration(TimeSpan scriptDuration)
|
||||||
|
{
|
||||||
|
// минимальное значение 1 минута
|
||||||
|
var minDuration = new TimeSpan(0, 1, 0);
|
||||||
|
|
||||||
|
if (scriptDuration < minDuration)
|
||||||
|
{
|
||||||
|
logger.LogDebug($"Продолжительность меньше минимального, беру минимальное: {minDuration}. {scriptDuration}<{minDuration}");
|
||||||
|
|
||||||
|
return minDuration;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return scriptDuration;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,8 +12,4 @@
|
|||||||
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
|
<ProjectReference Include="..\PARR.EsppApi\PARR.EsppApi.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="Services\" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using PARR.BLL;
|
using PARR.BLL;
|
||||||
using PARR.DAL;
|
using PARR.DAL;
|
||||||
using PARR.EsppApi;
|
using PARR.EsppApi;
|
||||||
|
using PARR.EsppOrderManager.Services;
|
||||||
using PARR.EsppOrderManager.Settings;
|
using PARR.EsppOrderManager.Settings;
|
||||||
|
|
||||||
namespace PARR.EsppOrderManager
|
namespace PARR.EsppOrderManager
|
||||||
@@ -20,6 +21,7 @@ namespace PARR.EsppOrderManager
|
|||||||
services.AddSingleton(mqSettings);
|
services.AddSingleton(mqSettings);
|
||||||
|
|
||||||
services.AddTransient<IEsppOrderManager, EsppOrderManager>();
|
services.AddTransient<IEsppOrderManager, EsppOrderManager>();
|
||||||
|
services.AddTransient<IEsppOrderService, EsppOrderService>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static IConfigurationBuilder AddEsppOrderManagerConfigurations(this IConfigurationBuilder builder, IServiceCollection services)
|
public static IConfigurationBuilder AddEsppOrderManagerConfigurations(this IConfigurationBuilder builder, IServiceCollection services)
|
||||||
|
|||||||
88
PARR.EsppOrderManager/Services/EsppOrderService.cs
Normal file
88
PARR.EsppOrderManager/Services/EsppOrderService.cs
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
using Microsoft.Extensions.Logging;
|
||||||
|
using PARR.DAL.Models;
|
||||||
|
using PARR.EsppApi.Models.Query;
|
||||||
|
using PARR.EsppApi;
|
||||||
|
using PARR.Constants;
|
||||||
|
|
||||||
|
namespace PARR.EsppOrderManager.Services
|
||||||
|
{
|
||||||
|
internal class EsppOrderService : IEsppOrderService
|
||||||
|
{
|
||||||
|
private readonly ILogger<EsppOrderService> logger;
|
||||||
|
private readonly IEsppApiService esppApiService;
|
||||||
|
|
||||||
|
public EsppOrderService(
|
||||||
|
ILogger<EsppOrderService> logger,
|
||||||
|
IEsppApiService esppApiService
|
||||||
|
)
|
||||||
|
{
|
||||||
|
this.logger = logger;
|
||||||
|
this.esppApiService = esppApiService;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
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 со статусом в ЕСПП
|
||||||
|
// Если совпадают, значит в еспп поменяли, и не изменили в БД раньше (может ошибка была, может руками кто сделал)
|
||||||
|
// так что говорим, как будто бы все ок
|
||||||
|
if (IsEquelEsppStatusAndNextStatus(order.NextStatusCode!.Value, esppOrderResult.Data.StatusEnum))
|
||||||
|
{
|
||||||
|
logger.LogInformation($"Для наряда {order.Number}, статус в ЕСПП совпадает с {nameof(order.NextStatusCode)} = {order.NextStatus!.Description}. " +
|
||||||
|
$"Статус в ЕСПП менять не нужно.");
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
//todo:
|
||||||
|
|
||||||
|
//var resultInWork = await esppApiService.SetStatusInWorkAsync(order.Number, resultMsg);
|
||||||
|
|
||||||
|
//if (!resultInWork.IsSuccess)
|
||||||
|
//{
|
||||||
|
// return false;
|
||||||
|
//}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//var tnk = new AddMtnkQuery
|
||||||
|
//{
|
||||||
|
// JobOperation = order!.Template!.ApplicationsInWork!.Work!.Tnk!.Name,
|
||||||
|
// RecordId = order.Number,
|
||||||
|
// Time = duration.ToString()
|
||||||
|
//};
|
||||||
|
|
||||||
|
//var resultTnk = await esppApiService.AddMTnkAsync(tnk);
|
||||||
|
|
||||||
|
//var resultIsDone = await esppApiService.SetStatusIsDoneAsync(order.Number, resultMsg);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Совпадает ли NextStatus и Еспп статусом
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
private bool IsEquelEsppStatusAndNextStatus(int nextStatusCode, OrderStatusEnum esppStatus)
|
||||||
|
{
|
||||||
|
return nextStatusCode == (int)esppStatus;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
13
PARR.EsppOrderManager/Services/IEsppOrderService.cs
Normal file
13
PARR.EsppOrderManager/Services/IEsppOrderService.cs
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
using PARR.DAL.Models;
|
||||||
|
|
||||||
|
namespace PARR.EsppOrderManager.Services
|
||||||
|
{
|
||||||
|
internal interface IEsppOrderService
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Изменение статуса в ЕСПП
|
||||||
|
/// </summary>
|
||||||
|
/// <returns></returns>
|
||||||
|
Task<bool> ChangeOrderToEsppAsync(Order order, string resultMsg, TimeSpan duration);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,7 +32,7 @@ namespace PARR.Test
|
|||||||
{
|
{
|
||||||
//var orders = result.Data;
|
//var orders = result.Data;
|
||||||
|
|
||||||
var inWorkResult = await esppApiService.SetStatusInWorkAsync(recordId);
|
var inWorkResult = await esppApiService.SetStatusInWorkAsync(recordId, "Решение...");
|
||||||
if (!inWorkResult.IsSuccess)
|
if (!inWorkResult.IsSuccess)
|
||||||
{
|
{
|
||||||
_logger.LogError(inWorkResult.Exception, $"Не удалось взять в работу наряда{recordId}");
|
_logger.LogError(inWorkResult.Exception, $"Не удалось взять в работу наряда{recordId}");
|
||||||
@@ -41,7 +41,7 @@ namespace PARR.Test
|
|||||||
|
|
||||||
var tnk = new AddMtnkQuery { RecordId = recordId, JobOperation = "Не учтена в перечне ТНК", Time = "00:05" };
|
var tnk = new AddMtnkQuery { RecordId = recordId, JobOperation = "Не учтена в перечне ТНК", Time = "00:05" };
|
||||||
|
|
||||||
var addMtnkResult = await esppApiService.AddMTnk(tnk);
|
var addMtnkResult = await esppApiService.AddMTnkAsync(tnk);
|
||||||
|
|
||||||
if (!addMtnkResult.IsSuccess)
|
if (!addMtnkResult.IsSuccess)
|
||||||
{
|
{
|
||||||
@@ -50,7 +50,7 @@ namespace PARR.Test
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var resFinish = await esppApiService.SetStatusIsDone(recordId);
|
var resFinish = await esppApiService.SetStatusIsDoneAsync(recordId, "Решение...");
|
||||||
if (!resFinish.IsSuccess)
|
if (!resFinish.IsSuccess)
|
||||||
{
|
{
|
||||||
_logger.LogError(resFinish.Exception, $"Не удалось обновить статус наряда {recordId}");
|
_logger.LogError(resFinish.Exception, $"Не удалось обновить статус наряда {recordId}");
|
||||||
|
|||||||
Reference in New Issue
Block a user