2023-10-19 15:59:57 +10:00
using Microsoft.Extensions.Logging ;
2023-11-21 12:26:08 +10:00
using PARR.EsppApi.Constants ;
2023-10-19 15:59:57 +10:00
using PARR.EsppApi.Models ;
2023-10-20 09:24:27 +10:00
using PARR.EsppApi.Models.Query ;
2023-11-21 12:26:08 +10:00
using PARR.EsppApi.Requests ;
2023-10-19 16:55:42 +10:00
using PARR.EsppApi.Settings ;
2023-11-21 14:37:41 +10:00
using System.Text.Encodings.Web ;
2023-11-21 12:26:08 +10:00
using System.Text.Json ;
2023-11-21 14:37:41 +10:00
using System.Text.Unicode ;
2023-10-19 15:59:57 +10:00
namespace PARR.EsppApi
{
internal class EsppApiService : IEsppApiService
{
private readonly ILogger < EsppApiService > logger ;
2023-10-19 16:55:42 +10:00
private readonly EsppOrderSettings esppOrderSettings ;
2023-10-24 12:10:19 +10:00
private readonly EsppHttpService esppHttpService ;
2023-10-19 15:59:57 +10:00
2023-10-24 12:10:19 +10:00
public EsppApiService ( ILogger < EsppApiService > logger , EsppOrderSettings esppOrderSettings , EsppHttpService esppHttpService )
2023-10-19 15:59:57 +10:00
{
this . logger = logger ;
2023-10-19 16:55:42 +10:00
this . esppOrderSettings = esppOrderSettings ;
2023-10-24 12:10:19 +10:00
this . esppHttpService = esppHttpService ;
2023-10-19 15:59:57 +10:00
}
2023-11-21 12:26:08 +10:00
2023-11-20 12:26:33 +10:00
public Task < EsppResultBase < EsppResponse > > SetStatusInWorkAsync ( string recordId , string resultMsg ) //TODO упростить можно без RecordIdQuery
2023-10-27 16:39:59 +10:00
{
2023-11-20 12:26:33 +10:00
return SetStatusAsync ( recordId , "2-В работе" , resultMsg ) ;
2023-10-27 16:39:59 +10:00
}
2023-11-21 12:26:08 +10:00
2023-11-28 15:33:59 +10:00
public Task < EsppResultBase < EsppResponse > > SetStatusIsDoneAsync ( string recordId , string resultMsg , EsppOrderClosingCodeEnum closingCode ) //TODO упростить можно без RecordIdQuery
2023-10-27 16:39:59 +10:00
{
2023-11-28 15:33:59 +10:00
return SetStatusAsync ( recordId , "4-Выполнен" , resultMsg , closingCode ) ;
2023-10-27 16:39:59 +10:00
}
2023-11-21 12:26:08 +10:00
2023-12-07 11:19:08 +10:00
private async Task < EsppResultBase < EsppResponse > > SetStatusAsync (
string recordId ,
string newStatusStr ,
string resultMsg ,
EsppOrderClosingCodeEnum ? closingCode = null
)
2023-10-27 16:39:59 +10:00
{
2023-11-28 15:33:59 +10:00
var request = new SetStatusRequest ( closingCode ? ? EsppOrderClosingCodeEnum . Complete )
2023-11-21 12:26:08 +10:00
{
recordid = recordId ,
status = newStatusStr ,
assignee = esppOrderSettings . AccountName ,
2023-12-07 11:19:08 +10:00
resolution = resultMsg ,
rzdEventCode = esppOrderSettings . CodeRRO ,
rzdKeRobot = esppOrderSettings . RobotEk
2023-11-21 12:26:08 +10:00
} ;
var result = await esppHttpService . SendAsync < EsppResponse > ( GenerateRequest ( EsppOperationsEnum . SaveTask , request ) ) ;
2023-10-27 16:39:59 +10:00
if ( result . Data ! = null & & result . Data . ErrorCode ! = "0" )
return new EsppResultBase < EsppResponse > ( null , false , new Exception ( result . Data . Message ) ) ;
return result ;
}
2023-11-21 12:26:08 +10:00
2023-10-27 16:39:59 +10:00
public async Task < EsppResultBase < EsppOrder > > FindOrderByRecordIdAsync ( string recordId )
{
2023-11-21 12:26:08 +10:00
//TODO упростить можно без RecordIdQuery
//var query = $"<ROOT operation=\"GetTask\" returnFormat=\"json\">\r\n{{\"recordid\":\"{recordId}\"}}\r\n</ROOT>";
//var result = await esppHttpService.SendAsync<EsppOrder>(QuerySanitize(query));
var request = new GetTaskRequest { recordid = recordId } ;
var result = await esppHttpService . SendAsync < EsppOrder > ( GenerateRequest ( EsppOperationsEnum . GetTask , request ) ) ;
2023-10-27 16:39:59 +10:00
return result ;
}
2023-11-21 12:26:08 +10:00
2023-10-23 13:50:43 +10:00
public async Task < EsppResultBase < IEnumerable < EsppOrder > > > FindOrdersAsync ( FindOrdersQuery query )
2023-10-19 15:59:57 +10:00
{
2023-10-24 15:40:52 +10:00
DateTime ? generateDateStartWOTimeZone = query . GenerateDateStart . HasValue ? query . GenerateDateStart . Value . AddHours ( esppOrderSettings . EsppUserTimeZone ) : null ;
DateTime ? generateDateEndWOTimeZone = query . GenerateDateEnd . HasValue ? query . GenerateDateEnd . Value . AddHours ( esppOrderSettings . EsppUserTimeZone ) : null ;
2023-10-24 12:10:19 +10:00
var conditions = new List < string > ( ) ;
2023-10-19 16:55:42 +10:00
2024-02-28 15:40:24 +10:00
if ( ! string . IsNullOrEmpty ( query . StatusIs ) )
conditions . Add ( $"status=\" { query . StatusIs } \ "" ) ;
2023-10-24 13:41:57 +10:00
if ( ! string . IsNullOrEmpty ( query . DescriptionContains ) )
conditions . Add ( $"description like \" * { query . DescriptionContains } * \ "" ) ;
//if (!string.IsNullOrEmpty(query.TemplateNameContains))
// conditions.Add($"templateName like \"*{query.TemplateNameContains}*\"");
2023-10-27 16:39:59 +10:00
2023-10-24 15:40:52 +10:00
if ( generateDateStartWOTimeZone . HasValue )
2024-02-15 16:41:00 +10:00
//conditions.Add($"open.time>='{generateDateStartWOTimeZone.Value.Day}/{generateDateStartWOTimeZone.Value.Month}/{generateDateStartWOTimeZone.Value.Year}" +
// $" {generateDateStartWOTimeZone.Value.Hour}:{generateDateStartWOTimeZone.Value.Minute}:{generateDateStartWOTimeZone.Value.Second}'");
conditions . Add ( $"open.time>='{generateDateStartWOTimeZone.Value.ToString(@" dd \ / MM \ / yyyy HH : mm : ss ")}'" ) ;
2023-10-27 16:39:59 +10:00
2023-10-24 15:40:52 +10:00
if ( generateDateEndWOTimeZone . HasValue )
2024-02-15 16:41:00 +10:00
//conditions.Add($"open.time<='{generateDateEndWOTimeZone.Value.Day}/{generateDateEndWOTimeZone.Value.Month}/{generateDateEndWOTimeZone.Value.Year}" +
// $" {generateDateEndWOTimeZone.Value.Hour}:{generateDateEndWOTimeZone.Value.Minute}:{generateDateEndWOTimeZone.Value.Second}'");
conditions . Add ( $"open.time<='{generateDateEndWOTimeZone.Value.ToString(@" dd \ / MM \ / yyyy HH : mm : ss ")}'" ) ;
2023-10-19 16:55:42 +10:00
2023-10-27 16:39:59 +10:00
if ( ! conditions . Any ( ) )
2023-10-24 12:10:19 +10:00
{
logger . LogDebug ( "Пришёл пустой запрос в EsppHttpService.FindOrdersAsync" ) ;
return new EsppResultBase < IEnumerable < EsppOrder > > ( null , false ) ;
}
2023-10-20 09:24:27 +10:00
2023-11-21 12:26:08 +10:00
//var request = $"<ROOT operation=\"GetTaskList\" returnFormat=\"json\">{{\"VIEW_QUERY\":\"{string.Join(" and ", conditions)}\"}}</ROOT>";
//var result = await esppHttpService.SendAsync<IEnumerable<EsppOrder>>(QuerySanitize(request));
var request = new GetTaskListRequest { VIEW_QUERY = string . Join ( " and " , conditions ) } ;
2024-02-15 16:24:36 +10:00
// костыль. так как в ЕСПП не json а какой-то свой модерновый формат. формируем запрос вручную
var viewQueryStr = $"{{\" VIEW_QUERY \ ":\"{request.VIEW_QUERY}\"}}" ;
var result = await esppHttpService . SendAsync < IEnumerable < EsppOrder > > ( GenerateRequest ( EsppOperationsEnum . GetTaskList , viewQueryStr ) ) ;
//var result = await esppHttpService.SendAsync<IEnumerable<EsppOrder>>(GenerateRequest(EsppOperationsEnum.GetTaskList, request));
2023-10-24 12:10:19 +10:00
return result ;
2023-10-19 16:55:42 +10:00
2023-10-19 15:59:57 +10:00
}
2023-10-27 16:39:59 +10:00
2023-11-21 12:26:08 +10:00
2023-11-20 12:26:33 +10:00
public async Task < EsppResultBase < EsppResponse > > AddMTnkAsync ( AddMtnkQuery mtnk )
2023-10-27 16:39:59 +10:00
{
2023-11-21 12:26:08 +10:00
//var query = $"<ROOT operation=\"AddMTNK\" returnFormat=\"json\">{{\"recordid\":\"{mtnk.RecordId}\"," +
// $"\"joboperation\":\"{mtnk.JobOperation}\",\"time\":\"{mtnk.Time}\",\"workscope\":\"{mtnk.Workspace}\"" +
// $"}}</ROOT>";
//var result = await esppHttpService.SendAsync<EsppResponse>(QuerySanitize(query));
var request = new AddMTNKRequest
{
recordid = mtnk . RecordId ,
joboperation = mtnk . JobOperation ,
time = mtnk . Time ,
workscope = mtnk . Workspace . ToString ( )
} ;
var result = await esppHttpService . SendAsync < EsppResponse > ( GenerateRequest ( EsppOperationsEnum . AddMTNK , request ) ) ;
2023-10-27 16:39:59 +10:00
if ( result . Data ! = null & & result . Data . ErrorCode ! = "0" )
return new EsppResultBase < EsppResponse > ( null , false , new Exception ( result . Data . Message ) ) ;
return result ;
}
2023-11-21 12:26:08 +10:00
/// <summary>
/// Формирует запрос в ЕСПП из строки
/// </summary>
/// <param name="operation"></param>
/// <param name="query"></param>
/// <returns></returns>
private string GenerateRequest ( EsppOperationsEnum operation , string query )
{
var baseRequest = $"<ROOT operation=\" operationValue \ " returnFormat=\"json\">requestValue</ROOT>" ;
return baseRequest . Replace ( "operationValue" , operation . ToString ( ) ) . Replace ( "requestValue" , query ) ;
}
/// <summary>
/// Формирует запрос в ЕСПП из jsonQuery
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="operation"></param>
/// <param name="jsonQuery"></param>
/// <returns></returns>
private string GenerateRequest < T > ( EsppOperationsEnum operation , T jsonQuery )
{
2023-11-21 14:37:41 +10:00
var jsonOptions = new JsonSerializerOptions { Encoder = JavaScriptEncoder . Create ( UnicodeRanges . All , UnicodeRanges . Cyrillic ) } ;
var strQuery = JsonSerializer . Serialize ( jsonQuery , jsonOptions ) ;
2023-11-21 12:26:08 +10:00
return GenerateRequest ( operation , strQuery ) ;
}
2023-10-19 15:59:57 +10:00
}
}