Add DrillingProgramCreateError

This commit is contained in:
Фролов 2022-02-28 14:44:15 +05:00
parent cee68bf4ee
commit f286410eff
4 changed files with 57 additions and 7 deletions

View File

@ -11,8 +11,15 @@ namespace AsbCloudApp.Data
/// 3 - готова /// 3 - готова
/// </summary> /// </summary>
public int IdState { get; set; } public int IdState { get; set; }
public DrillingProgramCreateError Error { get; set; }
public FileInfoDto Program { get; set; } public FileInfoDto Program { get; set; }
public bool PermissionToEdit { get; set; } public bool PermissionToEdit { get; set; }
public IEnumerable<DrillingProgramPartDto> Parts { get; set; } public IEnumerable<DrillingProgramPartDto> Parts { get; set; }
} }
public class DrillingProgramCreateError
{
public string Message { get; set; }
public string Exception { get; set; }
}
} }

View File

@ -19,5 +19,6 @@ namespace AsbCloudApp.Services
Task<int> RemoveUserAsync(int idWell, int idFileCategory, int idUser, int idUserRole, CancellationToken token = default); Task<int> RemoveUserAsync(int idWell, int idFileCategory, int idUser, int idUserRole, CancellationToken token = default);
Task<int> AddOrReplaceFileMarkAsync(FileMarkDto fileMarkDto, int idUser, CancellationToken token); Task<int> AddOrReplaceFileMarkAsync(FileMarkDto fileMarkDto, int idUser, CancellationToken token);
Task<int> MarkAsDeletedFileMarkAsync(int idFileMark, CancellationToken token); Task<int> MarkAsDeletedFileMarkAsync(int idFileMark, CancellationToken token);
void ClearError(int idWell);
} }
} }

View File

@ -16,10 +16,13 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
{ {
public class DrillingProgramService : IDrillingProgramService public class DrillingProgramService : IDrillingProgramService
{ {
private static Dictionary<string, DrillingProgramCreateError> drillingProgramCreateErrors = new Dictionary<string, DrillingProgramCreateError>();
private readonly IAsbCloudDbContext context; private readonly IAsbCloudDbContext context;
private readonly IFileService fileService; private readonly IFileService fileService;
private readonly IUserService userService; private readonly IUserService userService;
private readonly IWellService wellService; private readonly IWellService wellService;
private readonly IConfiguration configuration;
private readonly IBackgroundWorkerService backgroundWorker; private readonly IBackgroundWorkerService backgroundWorker;
private readonly string connectionString; private readonly string connectionString;
@ -41,6 +44,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
private const int idStateApproving = 1; private const int idStateApproving = 1;
private const int idStateCreating = 2; private const int idStateCreating = 2;
private const int idStateReady = 3; private const int idStateReady = 3;
private const int idStateError = 4;
public DrillingProgramService( public DrillingProgramService(
IAsbCloudDbContext context, IAsbCloudDbContext context,
@ -54,6 +58,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
this.fileService = fileService; this.fileService = fileService;
this.userService = userService; this.userService = userService;
this.wellService = wellService; this.wellService = wellService;
this.configuration = configuration;
this.backgroundWorker = backgroundWorker; this.backgroundWorker = backgroundWorker;
this.connectionString = configuration.GetConnectionString("DefaultConnection"); this.connectionString = configuration.GetConnectionString("DefaultConnection");
} }
@ -125,9 +130,20 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
if(parts.All(p=>p.IdState == idPartStateApproved)) if(parts.All(p=>p.IdState == idPartStateApproved))
{ {
if (state.Program is not null) if (state.Program is not null)
{
state.IdState = idStateReady; state.IdState = idStateReady;
else }
state.IdState = idStateCreating; else
{
var workId = MakeWorkId(idWell);
if (drillingProgramCreateErrors.ContainsKey(workId))
{
state.IdState = idStateError;
state.Error = drillingProgramCreateErrors[workId];
}
else
state.IdState = idStateCreating;
}
} }
else else
state.IdState = idStateApproving; state.IdState = idStateApproving;
@ -355,6 +371,7 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
var well = await wellService.GetAsync(idWell, token); var well = await wellService.GetAsync(idWell, token);
var resultFileName = $"Программа бурения {well.Cluster} {well.Caption}.xlsx"; var resultFileName = $"Программа бурения {well.Cluster} {well.Caption}.xlsx";
var tempResultFilePath = Path.Combine(Path.GetTempPath(), "drillingProgram", resultFileName); var tempResultFilePath = Path.Combine(Path.GetTempPath(), "drillingProgram", resultFileName);
var mailService = new EmailService(backgroundWorker, configuration);
async Task funcProgramMake(string id, CancellationToken token) async Task funcProgramMake(string id, CancellationToken token)
{ {
var contextOptions = new DbContextOptionsBuilder<AsbCloudDbContext>() var contextOptions = new DbContextOptionsBuilder<AsbCloudDbContext>()
@ -367,11 +384,26 @@ namespace AsbCloudInfrastructure.Services.DrillingProgram
await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token); await fileService.MoveAsync(idWell, null, idFileCategoryDrillingProgram, resultFileName, tempResultFilePath, token);
} }
backgroundWorker.Enqueue(funcProgramMake); Task funcOnErrorProgramMake(string workId, Exception exception, CancellationToken token) {
var message = $"Не удалось сформировать программу бурения по скважине {well?.Caption}";
drillingProgramCreateErrors[workId] = new() {
Message = message,
Exception = exception.Message,
};
return Task.CompletedTask;
}
backgroundWorker.Enqueue(workId, funcProgramMake, funcOnErrorProgramMake);
} }
} }
} }
public void ClearError(int idWell)
{
var workId = MakeWorkId(idWell);
drillingProgramCreateErrors.Remove(workId);
}
private async Task<int> RemoveDrillingProgramAsync(int idWell, CancellationToken token) private async Task<int> RemoveDrillingProgramAsync(int idWell, CancellationToken token)
{ {
var workId = MakeWorkId(idWell); var workId = MakeWorkId(idWell);

View File

@ -4,11 +4,8 @@ using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -70,7 +67,7 @@ namespace AsbCloudWebApi.Controllers
var idUser = User.GetUserId(); var idUser = User.GetUserId();
if (idCompany is null || idUser is null || if (idCompany is null || idUser is null ||
!await wellService.IsCompanyInvolvedInWellAsync((int)idCompany, !await wellService.IsCompanyInvolvedInWellAsync((int)idCompany,
idWell, token).ConfigureAwait(false)) idWell, token).ConfigureAwait(false))
return Forbid(); return Forbid();
@ -79,6 +76,19 @@ namespace AsbCloudWebApi.Controllers
return Ok(result); return Ok(result);
} }
/// <summary>
/// Сброс ошибки формирования ПБ
/// </summary>
/// <param name="idWell"></param>
/// <returns></returns>
[HttpPost("ClearError")]
[Permission]
public IActionResult ClearError(int idWell)
{
drillingProgramService.ClearError(idWell);
return Ok();
}
/// <summary> /// <summary>
/// Загрузка файла для части программы бурения /// Загрузка файла для части программы бурения
/// </summary> /// </summary>