#5998816 Дело скважины + тесты

This commit is contained in:
ai.astrakhantsev 2022-09-05 09:13:45 +05:00
parent 41affa3f49
commit 896ba03589
28 changed files with 21508 additions and 3 deletions

View File

@ -0,0 +1,33 @@
namespace AsbCloudApp.Data
{
/// <summary>
/// DTO Дело скважины
/// </summary>
public class WellFinalDocumentsDBDto : IId
{
/// <summary>
/// Идентификатор
/// </summary>
public int Id { get; set; }
/// <summary>
/// Идентификатор вышка
/// </summary>
public int IdWell { get; set; }
/// <summary>
/// Идентификатор ответственного
/// </summary>
public int IdUser { get; set; }
/// <summary>
/// Идентификатор категории файла
/// </summary>
public int IdCategory { get; set; }
/// <summary>
/// Идентификатор файла
/// </summary>
public int? IdFile { get; set; }
}
}

View File

@ -0,0 +1,38 @@
using System.Collections.Generic;
using System.Linq;
namespace AsbCloudApp.Data
{
#nullable disable
/// <summary>
/// DTO Дело скважины
/// </summary>
public class WellFinalDocumentsDto
{
/// <summary>
/// Вышка
/// </summary>
public int IdWell { get; set; }
/// <summary>
/// Наменование категории файла
/// </summary>
public string NameCategory { get; set; }
/// <summary>
/// Список ответственных
/// </summary>
public IEnumerable<UserExtendedDto> ListResponsible { get; set; } = Enumerable.Empty<UserExtendedDto>();
/// <summary>
/// Количество файлов этой категории загруженных ранее
/// </summary>
public int CountFiles { get; set; }
/// <summary>
/// Актуальный файл
/// </summary>
public FileInfoDto File { get; set; }
}
#nullable disable
}

View File

@ -0,0 +1,25 @@
using System.Collections.Generic;
namespace AsbCloudApp.Data
{
/// <summary>
/// DTO Дело скважины, история файлов
/// </summary>
public class WellFinalDocumentsHistoryDto
{
/// <summary>
/// Вышка
/// </summary>
public int IdWell { get; set; }
/// <summary>
/// Наменование категории файла
/// </summary>
public int IdCategory { get; set; }
/// <summary>
/// Файлы
/// </summary>
public List<FileInfoDto> File { get; set; }
}
}

View File

@ -0,0 +1,19 @@
using AsbCloudApp.Data;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudApp.Services
{
/// <summary>
/// Сервис "Категории документов (файлов)"
/// </summary>
public interface IFileCategoryService
{
/// <summary>
/// Получение справочника категорий файлов
/// </summary>
/// <returns></returns>
Task<IEnumerable<FileCategoryDto>> GetWellCategoryAsync(CancellationToken token);
}
}

View File

@ -159,5 +159,13 @@ namespace AsbCloudApp.Services
/// <param name="token"></param>
/// <returns></returns>
Task<int> MarkFileMarkAsDeletedAsync(IEnumerable<int> idsMarks, CancellationToken token);
/// <summary>
/// Инфо о файле
/// </summary>
/// <param name="idsFile"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<List<FileInfoDto>> GetInfoByIdsAsync(List<int> idsFile, CancellationToken token);
}
}

View File

@ -0,0 +1,68 @@
using AsbCloudApp.Data;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudApp.Services
{
/// <summary>
/// Сервис "Дело скважины"
/// </summary>
public interface IWellFinalDocumentsService : ICrudService<WellFinalDocumentsDBDto>
{
/// <summary>
/// Получение всех записей
/// </summary>
/// <param name = "idWell" ></param >
/// <param name="token"></param>
/// <returns></returns>
Task<List<WellFinalDocumentsDto>> GetByWellId(int idWell, CancellationToken token);
/// <summary>
/// Получение списка ответственных
/// </summary>
/// <param name="idWell"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<List<UserExtendedDto>> GetListResponsiblesAsync(int idWell, CancellationToken token);
/// <summary>
/// Добавление записи
/// </summary>
/// <param name="dtos"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> InsertRangeAsync(List<WellFinalDocumentsDBDto> dtos, CancellationToken token);
/// <summary>
/// Удалить запись
/// </summary>
/// <param name="dtoId"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> DeleteAsync(int dtoId, CancellationToken token);
/// <summary>
/// Получение истории файлов
/// </summary>
/// <param name="idWell"></param>
/// <param name="idCategory"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<WellFinalDocumentsHistoryDto> GetHistoryFileByIdCategory(int idWell, int idCategory, CancellationToken token);
/// <summary>
/// Сохранение файла
/// </summary>
/// <param name="idDto"></param>
/// <param name="fileStream"></param>
/// <param name="fileName"></param>
/// <param name="token"></param>
/// <returns></returns>
Task<int> SaveCategoryFile(int idDto, Stream fileStream, string fileName, CancellationToken token);
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,286 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class update_file_category : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: "t_file_category",
columns: new[] { "id", "name", "short_name" },
values: new object[,]
{
{ 10000, "Проект на бурение транспортного и горизонтального участков скважины", null },
{ 10001, "Программа на бурение транспортного и горизонтального участков скважины", null },
{ 10002, "Акт о начале бурения", null },
{ 10003, "План работ спуска и цементирования направления", null },
{ 10004, "Программа цементирования направления", null },
{ 10005, "Мера обсадных труб (направление)", null },
{ 10006, "Акт на выполненные работы по цементированию направления", null },
{ 10007, "Отчет по цементированию направления (график)", null },
{ 10008, "План работ спуска и цементирования кондуктора", null },
{ 10009, "Программа цементирования (кондуктор)", null },
{ 10010, "Мера обсадных труб (кондуктор)", null },
{ 10011, "Карта крепления кондуктора", null },
{ 10012, "Акт на выполненные работы по цементированию кондуктора", null },
{ 10013, "Отчет по цементированию кондуктора (график)", null },
{ 10014, "Акт о замере расстояния от стола ротора до муфты кондуктора", null },
{ 10015, "Акт опресовки цементного кольца за кондуктором", null },
{ 10016, "Акт опресовки ППГ с глухими плашками совместно с кондуктором", null },
{ 10017, "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором", null },
{ 10018, "План работ на крепление обсадной колонны (эк. колонна)", null },
{ 10019, "Программа цементирования (эк. колонна)", null },
{ 10020, "Мера труб эксплуатационной колонны", null },
{ 10021, "Карта по креплению скважины (эк. колонна)", null },
{ 10022, "Акт на установку пружинных центраторов", null },
{ 10023, "Отчет по цементированию эксплуатационной колонны (график)", null },
{ 10024, "Акт на выполненные работы по цементированию эксплуатационной колонны", null },
{ 10025, "Акт об испытании эк. колонны на герметичность (СТОП)", null },
{ 10026, "Акт опресовки ППГ с глухими плашками совместно с э/колонной", null },
{ 10027, "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной", null },
{ 10028, "Акт на вскрытие продуктивного пласта", null },
{ 10029, "Акт замера параметров раствора при бурении горизонтального участка", null },
{ 10030, "Разрешение на спуск «хвостовика» (телефонограмма)", null },
{ 10031, "План работ на спуск «хвостовика»", null },
{ 10032, "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»", null },
{ 10033, "Акт шаблонировки ствола скважины перед спуском «хвостовика»", null },
{ 10034, "Мера обсадных труб (хвостовик)", null },
{ 10035, "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора", null },
{ 10036, "Акт о переводе скважины на тех. воду", null },
{ 10037, "Акт об окончании бурения", null },
{ 10038, "Акт на передачу скважины в освоение (КРС)", null },
{ 10039, "Акт на опресовку межколонного пространства с КРС", null },
{ 10040, "Акт на сдачу скважины в ЦДНГ", null },
{ 10041, "Паспорт ОУС (заполняется геологами)", null },
{ 10042, "Паспорт скважины (заполняется геологами)", null },
{ 10043, "Фактические данные бурения (вставляются в паспорт скважины)", null }
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10000);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10001);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10002);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10003);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10004);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10005);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10006);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10007);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10008);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10009);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10010);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10011);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10012);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10013);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10014);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10015);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10016);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10017);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10018);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10019);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10020);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10021);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10022);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10023);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10024);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10025);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10026);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10027);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10028);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10029);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10030);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10031);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10032);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10033);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10034);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10035);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10036);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10037);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10038);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10039);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10040);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10041);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10042);
migrationBuilder.DeleteData(
table: "t_file_category",
keyColumn: "id",
keyValue: 10043);
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,79 @@
using Microsoft.EntityFrameworkCore.Migrations;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class AddTable_t_well_final_documents : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.CreateTable(
name: "t_well_final_documents",
columns: table => new
{
id = table.Column<int>(type: "integer", nullable: false)
.Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn),
id_well = table.Column<int>(type: "integer", nullable: false),
id_user = table.Column<int>(type: "integer", nullable: false),
id_category = table.Column<int>(type: "integer", nullable: false),
id_file = table.Column<int>(type: "integer", nullable: true)
},
constraints: table =>
{
table.PrimaryKey("t_well_final_documents_pk", x => x.id);
table.ForeignKey(
name: "FK_t_well_final_documents_t_file_category_id_category",
column: x => x.id_category,
principalTable: "t_file_category",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_t_well_final_documents_t_file_info_id_file",
column: x => x.id_file,
principalTable: "t_file_info",
principalColumn: "id");
table.ForeignKey(
name: "FK_t_well_final_documents_t_user_id_user",
column: x => x.id_user,
principalTable: "t_user",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
table.ForeignKey(
name: "FK_t_well_final_documents_t_well_id_well",
column: x => x.id_well,
principalTable: "t_well",
principalColumn: "id",
onDelete: ReferentialAction.Cascade);
},
comment: "Дело скважины");
migrationBuilder.CreateIndex(
name: "IX_t_well_final_documents_id_category",
table: "t_well_final_documents",
column: "id_category");
migrationBuilder.CreateIndex(
name: "IX_t_well_final_documents_id_file",
table: "t_well_final_documents",
column: "id_file");
migrationBuilder.CreateIndex(
name: "IX_t_well_final_documents_id_user",
table: "t_well_final_documents",
column: "id_user");
migrationBuilder.CreateIndex(
name: "IX_t_well_final_documents_id_well",
table: "t_well_final_documents",
column: "id_well");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropTable(
name: "t_well_final_documents");
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,101 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace AsbCloudDb.Migrations
{
public partial class AddPermission : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.InsertData(
table: "t_permission",
columns: new[] { "id", "description", "name" },
values: new object[,]
{
{ 500, "Разрешение удалять Категорий документов файлов", "FileCategory.delete" },
{ 501, "Разрешение редактировать Категорий документов файлов", "FileCategory.edit" },
{ 502, "Разрешение просматривать Категорий документов файлов", "FileCategory.get" },
{ 503, "Разрешение удалять Дело скважины", "WellFinalDocuments.delete" },
{ 504, "Разрешение редактировать Дело скважины", "WellFinalDocuments.edit" },
{ 505, "Разрешение просматривать Дело скважины", "WellFinalDocuments.get" }
});
migrationBuilder.InsertData(
table: "t_relation_user_role_permission",
columns: new[] { "id_permission", "id_user_role" },
values: new object[,]
{
{ 500, 1 },
{ 501, 1 },
{ 502, 1 },
{ 503, 1 },
{ 504, 1 },
{ 505, 1 }
});
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DeleteData(
table: "t_relation_user_role_permission",
keyColumns: new[] { "id_permission", "id_user_role" },
keyValues: new object[] { 500, 1 });
migrationBuilder.DeleteData(
table: "t_relation_user_role_permission",
keyColumns: new[] { "id_permission", "id_user_role" },
keyValues: new object[] { 501, 1 });
migrationBuilder.DeleteData(
table: "t_relation_user_role_permission",
keyColumns: new[] { "id_permission", "id_user_role" },
keyValues: new object[] { 502, 1 });
migrationBuilder.DeleteData(
table: "t_relation_user_role_permission",
keyColumns: new[] { "id_permission", "id_user_role" },
keyValues: new object[] { 503, 1 });
migrationBuilder.DeleteData(
table: "t_relation_user_role_permission",
keyColumns: new[] { "id_permission", "id_user_role" },
keyValues: new object[] { 504, 1 });
migrationBuilder.DeleteData(
table: "t_relation_user_role_permission",
keyColumns: new[] { "id_permission", "id_user_role" },
keyValues: new object[] { 505, 1 });
migrationBuilder.DeleteData(
table: "t_permission",
keyColumn: "id",
keyValue: 500);
migrationBuilder.DeleteData(
table: "t_permission",
keyColumn: "id",
keyValue: 501);
migrationBuilder.DeleteData(
table: "t_permission",
keyColumn: "id",
keyValue: 502);
migrationBuilder.DeleteData(
table: "t_permission",
keyColumn: "id",
keyValue: 503);
migrationBuilder.DeleteData(
table: "t_permission",
keyColumn: "id",
keyValue: 504);
migrationBuilder.DeleteData(
table: "t_permission",
keyColumn: "id",
keyValue: 505);
}
}
}

View File

@ -672,6 +672,226 @@ namespace AsbCloudDb.Migrations
{
Id = 1008,
Name = "Программы цементирования обсадных колонн"
},
new
{
Id = 10000,
Name = "Проект на бурение транспортного и горизонтального участков скважины"
},
new
{
Id = 10001,
Name = "Программа на бурение транспортного и горизонтального участков скважины"
},
new
{
Id = 10002,
Name = "Акт о начале бурения"
},
new
{
Id = 10003,
Name = "План работ спуска и цементирования направления"
},
new
{
Id = 10004,
Name = "Программа цементирования направления"
},
new
{
Id = 10005,
Name = "Мера обсадных труб (направление)"
},
new
{
Id = 10006,
Name = "Акт на выполненные работы по цементированию направления"
},
new
{
Id = 10007,
Name = "Отчет по цементированию направления (график)"
},
new
{
Id = 10008,
Name = "План работ спуска и цементирования кондуктора"
},
new
{
Id = 10009,
Name = "Программа цементирования (кондуктор)"
},
new
{
Id = 10010,
Name = "Мера обсадных труб (кондуктор)"
},
new
{
Id = 10011,
Name = "Карта крепления кондуктора"
},
new
{
Id = 10012,
Name = "Акт на выполненные работы по цементированию кондуктора"
},
new
{
Id = 10013,
Name = "Отчет по цементированию кондуктора (график)"
},
new
{
Id = 10014,
Name = "Акт о замере расстояния от стола ротора до муфты кондуктора"
},
new
{
Id = 10015,
Name = "Акт опресовки цементного кольца за кондуктором"
},
new
{
Id = 10016,
Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором"
},
new
{
Id = 10017,
Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором"
},
new
{
Id = 10018,
Name = "План работ на крепление обсадной колонны (эк. колонна)"
},
new
{
Id = 10019,
Name = "Программа цементирования (эк. колонна)"
},
new
{
Id = 10020,
Name = "Мера труб эксплуатационной колонны"
},
new
{
Id = 10021,
Name = "Карта по креплению скважины (эк. колонна)"
},
new
{
Id = 10022,
Name = "Акт на установку пружинных центраторов"
},
new
{
Id = 10023,
Name = "Отчет по цементированию эксплуатационной колонны (график)"
},
new
{
Id = 10024,
Name = "Акт на выполненные работы по цементированию эксплуатационной колонны"
},
new
{
Id = 10025,
Name = "Акт об испытании эк. колонны на герметичность (СТОП)"
},
new
{
Id = 10026,
Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной"
},
new
{
Id = 10027,
Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной"
},
new
{
Id = 10028,
Name = "Акт на вскрытие продуктивного пласта"
},
new
{
Id = 10029,
Name = "Акт замера параметров раствора при бурении горизонтального участка"
},
new
{
Id = 10030,
Name = "Разрешение на спуск «хвостовика» (телефонограмма)"
},
new
{
Id = 10031,
Name = "План работ на спуск «хвостовика»"
},
new
{
Id = 10032,
Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»"
},
new
{
Id = 10033,
Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»"
},
new
{
Id = 10034,
Name = "Мера обсадных труб (хвостовик)"
},
new
{
Id = 10035,
Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора"
},
new
{
Id = 10036,
Name = "Акт о переводе скважины на тех. воду"
},
new
{
Id = 10037,
Name = "Акт об окончании бурения"
},
new
{
Id = 10038,
Name = "Акт на передачу скважины в освоение (КРС)"
},
new
{
Id = 10039,
Name = "Акт на опресовку межколонного пространства с КРС"
},
new
{
Id = 10040,
Name = "Акт на сдачу скважины в ЦДНГ"
},
new
{
Id = 10041,
Name = "Паспорт ОУС (заполняется геологами)"
},
new
{
Id = 10042,
Name = "Паспорт скважины (заполняется геологами)"
},
new
{
Id = 10043,
Name = "Фактические данные бурения (вставляются в паспорт скважины)"
});
});
@ -1647,6 +1867,42 @@ namespace AsbCloudDb.Migrations
Id = 461,
Description = "Разрешение просматривать WITS record 61",
Name = "WitsRecord61.get"
},
new
{
Id = 500,
Description = "Разрешение удалять Категорий документов файлов",
Name = "FileCategory.delete"
},
new
{
Id = 501,
Description = "Разрешение редактировать Категорий документов файлов",
Name = "FileCategory.edit"
},
new
{
Id = 502,
Description = "Разрешение просматривать Категорий документов файлов",
Name = "FileCategory.get"
},
new
{
Id = 503,
Description = "Разрешение удалять Дело скважины",
Name = "WellFinalDocuments.delete"
},
new
{
Id = 504,
Description = "Разрешение редактировать Дело скважины",
Name = "WellFinalDocuments.edit"
},
new
{
Id = 505,
Description = "Разрешение просматривать Дело скважины",
Name = "WellFinalDocuments.get"
});
});
@ -2272,6 +2528,36 @@ namespace AsbCloudDb.Migrations
{
IdUserRole = 2007,
IdPermission = 204
},
new
{
IdUserRole = 1,
IdPermission = 500
},
new
{
IdUserRole = 1,
IdPermission = 501
},
new
{
IdUserRole = 1,
IdPermission = 502
},
new
{
IdUserRole = 1,
IdPermission = 503
},
new
{
IdUserRole = 1,
IdPermission = 504
},
new
{
IdUserRole = 1,
IdPermission = 505
});
});
@ -3983,6 +4269,47 @@ namespace AsbCloudDb.Migrations
b.HasComment("Композитная скважина");
});
modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocuments", b =>
{
b.Property<int>("Id")
.ValueGeneratedOnAdd()
.HasColumnType("integer")
.HasColumnName("id");
NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id"));
b.Property<int>("IdCategory")
.HasColumnType("integer")
.HasColumnName("id_category");
b.Property<int?>("IdFile")
.HasColumnType("integer")
.HasColumnName("id_file");
b.Property<int>("IdUser")
.HasColumnType("integer")
.HasColumnName("id_user");
b.Property<int>("IdWell")
.HasColumnType("integer")
.HasColumnName("id_well");
b.HasKey("Id")
.HasName("t_well_final_documents_pk");
b.HasIndex("IdCategory");
b.HasIndex("IdFile");
b.HasIndex("IdUser");
b.HasIndex("IdWell");
b.ToTable("t_well_final_documents");
b.HasComment("Дело скважины");
});
modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b =>
{
b.Property<int>("Id")
@ -6072,6 +6399,39 @@ namespace AsbCloudDb.Migrations
b.Navigation("WellSrc");
});
modelBuilder.Entity("AsbCloudDb.Model.WellFinalDocuments", b =>
{
b.HasOne("AsbCloudDb.Model.FileCategory", "Category")
.WithMany()
.HasForeignKey("IdCategory")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AsbCloudDb.Model.FileInfo", "File")
.WithMany()
.HasForeignKey("IdFile");
b.HasOne("AsbCloudDb.Model.User", "User")
.WithMany()
.HasForeignKey("IdUser")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.HasOne("AsbCloudDb.Model.Well", "Well")
.WithMany()
.HasForeignKey("IdWell")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.Navigation("Category");
b.Navigation("File");
b.Navigation("User");
b.Navigation("Well");
});
modelBuilder.Entity("AsbCloudDb.Model.WellOperation", b =>
{
b.HasOne("AsbCloudDb.Model.WellOperationCategory", "OperationCategory")

View File

@ -47,6 +47,7 @@ namespace AsbCloudDb.Model
public virtual DbSet<Driller> Drillers => Set<Driller>();
public virtual DbSet<Schedule> Schedule => Set<Schedule>();
public virtual DbSet<OperationValue> OperationValues => Set<OperationValue>();
public virtual DbSet<WellFinalDocuments> WellFinalDocuments => Set<WellFinalDocuments>();
// WITS
public DbSet<WITS.Record1> Record1 => Set<WITS.Record1>();
@ -343,6 +344,12 @@ namespace AsbCloudDb.Model
});
DefaultData.DefaultContextData.Fill(modelBuilder);
modelBuilder.Entity<WellFinalDocuments>(entity =>
{
entity.HasKey(d => new { d.Id })
.HasName("t_well_final_documents_pk");
});
}
public Task<int> RefreshMaterializedViewAsync<TEntity>(CancellationToken token)

View File

@ -27,6 +27,51 @@
new () {Id = 1006, Name = "Программа геофизических исследований"},
new () {Id = 1007, Name = "Планы спусков обсадных колонн"},
new () {Id = 1008, Name = "Программы цементирования обсадных колонн"},
new () {Id = 10000, Name = "Проект на бурение транспортного и горизонтального участков скважины"},
new () {Id = 10001, Name = "Программа на бурение транспортного и горизонтального участков скважины"},
new () {Id = 10002, Name = "Акт о начале бурения"},
new () {Id = 10003, Name = "План работ спуска и цементирования направления"},
new () {Id = 10004, Name = "Программа цементирования направления"},
new () {Id = 10005, Name = "Мера обсадных труб (направление)"},
new () {Id = 10006, Name = "Акт на выполненные работы по цементированию направления"},
new () {Id = 10007, Name = "Отчет по цементированию направления (график)"},
new () {Id = 10008, Name = "План работ спуска и цементирования кондуктора"},
new () {Id = 10009, Name = "Программа цементирования (кондуктор)"},
new () {Id = 10010, Name = "Мера обсадных труб (кондуктор)"},
new () {Id = 10011, Name = "Карта крепления кондуктора"},
new () {Id = 10012, Name = "Акт на выполненные работы по цементированию кондуктора"},
new () {Id = 10013, Name = "Отчет по цементированию кондуктора (график)"},
new () {Id = 10014, Name = "Акт о замере расстояния от стола ротора до муфты кондуктора"},
new () {Id = 10015, Name = "Акт опресовки цементного кольца за кондуктором"},
new () {Id = 10016, Name = "Акт опресовки ППГ с глухими плашками совместно с кондуктором"},
new () {Id = 10017, Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с кондуктором"},
new () {Id = 10018, Name = "План работ на крепление обсадной колонны (эк. колонна)"},
new () {Id = 10019, Name = "Программа цементирования (эк. колонна)"},
new () {Id = 10020, Name = "Мера труб эксплуатационной колонны"},
new () {Id = 10021, Name = "Карта по креплению скважины (эк. колонна)"},
new () {Id = 10022, Name = "Акт на установку пружинных центраторов"},
new () {Id = 10023, Name = "Отчет по цементированию эксплуатационной колонны (график)"},
new () {Id = 10024, Name = "Акт на выполненные работы по цементированию эксплуатационной колонны"},
new () {Id = 10025, Name = "Акт об испытании эк. колонны на герметичность (СТОП)"},
new () {Id = 10026, Name = "Акт опресовки ППГ с глухими плашками совместно с э/колонной"},
new () {Id = 10027, Name = "Акт опресовки ПУГ, ППГ с трубными плашками совместно с э/колонной"},
new () {Id = 10028, Name = "Акт на вскрытие продуктивного пласта"},
new () {Id = 10029, Name = "Акт замера параметров раствора при бурении горизонтального участка"},
new () {Id = 10030, Name = "Разрешение на спуск «хвостовика» (телефонограмма)"},
new () {Id = 10031, Name = "План работ на спуск «хвостовика»"},
new () {Id = 10032, Name = "Акт готовности бурового и энергетического оборудования к спуску «хвостовика»"},
new () {Id = 10033, Name = "Акт шаблонировки ствола скважины перед спуском «хвостовика»"},
new () {Id = 10034, Name = "Мера обсадных труб (хвостовик)"},
new () {Id = 10035, Name = "Акт выполненных работ по спуску хвостовика с закачкой (нефти, солевого раствора"},
new () {Id = 10036, Name = "Акт о переводе скважины на тех. воду"},
new () {Id = 10037, Name = "Акт об окончании бурения"},
new () {Id = 10038, Name = "Акт на передачу скважины в освоение (КРС)"},
new () {Id = 10039, Name = "Акт на опресовку межколонного пространства с КРС"},
new () {Id = 10040, Name = "Акт на сдачу скважины в ЦДНГ"},
new () {Id = 10041, Name = "Паспорт ОУС (заполняется геологами)"},
new () {Id = 10042, Name = "Паспорт скважины (заполняется геологами)"},
new () {Id = 10043, Name = "Фактические данные бурения (вставляются в паспорт скважины)"},
};
}
}

View File

@ -122,6 +122,13 @@
new (){ Id = 450, Name="WitsRecord50.get", Description="Разрешение просматривать WITS record 50"},
new (){ Id = 460, Name="WitsRecord60.get", Description="Разрешение просматривать WITS record 60"},
new (){ Id = 461, Name="WitsRecord61.get", Description="Разрешение просматривать WITS record 61"},
new (){ Id = 500, Name="FileCategory.delete", Description="Разрешение удалять Категорий документов файлов"},
new (){ Id = 501, Name="FileCategory.edit", Description="Разрешение редактировать Категорий документов файлов"},
new (){ Id = 502, Name="FileCategory.get", Description="Разрешение просматривать Категорий документов файлов"},
new (){ Id = 503, Name="WellFinalDocuments.delete", Description="Разрешение удалять Дело скважины"},
new (){ Id = 504, Name="WellFinalDocuments.edit", Description="Разрешение редактировать Дело скважины"},
new (){ Id = 505, Name="WellFinalDocuments.get", Description="Разрешение просматривать Дело скважины"},
};
}
}

View File

@ -53,6 +53,7 @@
new (){ IdUserRole = 2005, IdPermission = 247}, new (){ IdUserRole = 2005, IdPermission = 205}, new (){ IdUserRole = 2005, IdPermission = 204},
new (){ IdUserRole = 2006, IdPermission = 243}, new (){ IdUserRole = 2006, IdPermission = 205}, new (){ IdUserRole = 2006, IdPermission = 204},
new (){ IdUserRole = 2007, IdPermission = 241}, new (){ IdUserRole = 2007, IdPermission = 205}, new (){ IdUserRole = 2007, IdPermission = 204},
new (){ IdUserRole = 1, IdPermission = 500}, new (){ IdUserRole = 1, IdPermission = 501}, new (){ IdUserRole = 1, IdPermission = 502}, new (){ IdUserRole = 1, IdPermission = 503}, new (){ IdUserRole = 1, IdPermission = 504}, new (){ IdUserRole = 1, IdPermission = 505},
};
}
}

View File

@ -46,6 +46,7 @@ namespace AsbCloudDb.Model
DbSet<Driller> Drillers { get; }
DbSet<Schedule> Schedule { get; }
DbSet<OperationValue> OperationValues { get; }
DbSet<WellFinalDocuments> WellFinalDocuments { get; }
DbSet<Record1> Record1 { get; }
DbSet<Record7> Record7 { get; }

View File

@ -0,0 +1,39 @@
using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace AsbCloudDb.Model
{
#nullable disable
[Table("t_well_final_documents"), Comment("Дело скважины")]
public class WellFinalDocuments : IId, IWellRelated
{
[Key]
[Column("id")]
public int Id { get; set; }
[Column("id_well")]
public int IdWell { get; set; }
[Column("id_user")]
public int IdUser { get; set; }
[Column("id_category")]
public int IdCategory { get; set; }
[Column("id_file")]
public int? IdFile { get; set; }
[ForeignKey(nameof(IdWell))]
public virtual Well Well { get; set; }
[ForeignKey(nameof(IdUser))]
public virtual User User { get; set; }
[ForeignKey(nameof(IdCategory))]
public virtual FileCategory Category { get; set; }
[ForeignKey(nameof(IdFile))]
public virtual FileInfo File { get; set; }
}
}

View File

@ -67,6 +67,12 @@ namespace AsbCloudInfrastructure
.ForType<ClusterDto, Cluster>()
.Ignore(dst => dst.Deposit,
dst => dst.Wells);
TypeAdapterConfig.GlobalSettings.Default.Config
.ForType<FileCategoryDto, FileCategory>();
TypeAdapterConfig.GlobalSettings.Default.Config
.ForType<WellFinalDocumentsDto, WellFinalDocuments>();
}
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
@ -117,6 +123,8 @@ namespace AsbCloudInfrastructure
services.AddTransient<IScheduleRepository, ScheduleRepository>();
services.AddTransient<IRepositoryWellRelated<OperationValueDto>, CrudWellRelatedServiceBase<OperationValueDto, OperationValue>>();
services.AddTransient<IUserSettingsRepository, UserSettingsRepository>();
services.AddTransient<IWellFinalDocumentsService, WellFinalDocumentsService>();
services.AddTransient<IFileCategoryService, FileCategoryService>();
// admin crud services:
services.AddTransient<ICrudService<TelemetryDto>, CrudServiceBase<TelemetryDto, Telemetry>>(s =>
@ -139,6 +147,7 @@ namespace AsbCloudInfrastructure
dbSet => dbSet
.Include(c => c.Wells)
.Include(c => c.Deposit))); // может быть включен в сервис ClusterService
services.AddTransient<ICrudService<FileCategoryDto>, CrudCacheServiceBase<FileCategoryDto, FileCategory>>();
services.AddTransient<ICrudService<PermissionDto>, CrudCacheServiceBase<PermissionDto, Permission>>();

View File

@ -0,0 +1,39 @@
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Repository;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudInfrastructure.Services
{
public class FileCategoryService : CrudCacheServiceBase<FileCategoryDto, FileCategory>, IFileCategoryService
{
private readonly IAsbCloudDbContext db;
public FileCategoryService(IAsbCloudDbContext context)
: base(context)
{
this.db = context;
}
public async Task<IEnumerable<FileCategoryDto>> GetWellCategoryAsync(CancellationToken token)
{
var data = await (from category in db.FileCategories
where category.Id >= 10000 && category.Id <= 20000
select new FileCategoryDto
{
Id = category.Id,
Name = category.Name,
ShortName = category.ShortName
})
.ToListAsync(token)
.ConfigureAwait(false);
return data.ToList();
}
}
}

View File

@ -330,6 +330,38 @@ namespace AsbCloudInfrastructure.Services
fileMark.IsDeleted = true;
return await db.SaveChangesAsync(token);
}
}
public async Task<List<FileInfoDto>> GetInfoByIdsAsync(List<int> idsFile, CancellationToken token)
{
var result = new List<FileInfoDto>();
var entities = await dbSetConfigured
.AsNoTracking()
.Where(f => idsFile.Contains(f.Id))
.ToListAsync(token)
.ConfigureAwait(false);
foreach (var entity in entities)
{
if (entity is null)
{
throw new FileNotFoundException($"fileId:{entity.Id} not found");
}
var ext = Path.GetExtension(entity.Name);
var relativePath = GetUrl(entity.IdWell, entity.IdCategory, entity.Id, ext);
var fullPath = Path.GetFullPath(relativePath);
if (!File.Exists(fullPath))
{
throw new FileNotFoundException("not found", relativePath);
}
result.Add(Convert(entity));
}
return result;
}
}
}

View File

@ -0,0 +1,253 @@
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Repository;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
namespace AsbCloudInfrastructure.Services
{
/// <summary>
/// Сервис "Дело скважины"
/// </summary>
public class WellFinalDocumentsService : CrudServiceBase<WellFinalDocumentsDBDto, WellFinalDocuments>, IWellFinalDocumentsService
{
private readonly IAsbCloudDbContext context;
private readonly IFileService fileService;
private readonly IUserService userService;
private readonly IWellService wellService;
private readonly IConfiguration configuration;
private readonly IEmailService emailService;
public WellFinalDocumentsService(IAsbCloudDbContext context,
IFileService fileService,
IUserService userService,
IWellService wellService,
IConfiguration configuration,
IEmailService emailService)
: base(context)
{
this.context = context;
this.fileService = fileService;
this.userService = userService;
this.wellService = wellService;
this.configuration = configuration;
this.emailService = emailService;
}
public async Task<int> InsertRangeAsync(List<WellFinalDocumentsDBDto> dtos, CancellationToken token)
{
var data = await base.InsertRangeAsync(dtos, token);
if (data > 0)
{
// Текст сообщения
var message = "От Вас ожидается загрузка на портал документа «{0}»";
await GenerateMessage(dtos, message, token);
}
return data;
}
public async Task<int> DeleteAsync(int dtoId, CancellationToken token)
{
// Получение данные удаляемой записи
var dtos = await context.WellFinalDocuments.Where(x => x.Id == dtoId)
.Select(x => new WellFinalDocumentsDBDto
{
IdCategory = x.IdCategory,
IdWell = x.IdWell,
IdUser = x.IdUser,
IdFile = x.IdFile
})
.ToListAsync(token)
.ConfigureAwait(false);
var data = await base.DeleteAsync(dtoId, token);
if (data > 0)
{
// Текст сообщения
var message = "Вас удалили из ответственных за загрузку документа «{0}»";
await GenerateMessage(dtos, message, token);
}
return data;
}
public async Task<List<WellFinalDocumentsDto>> GetByWellId(int idWell, CancellationToken token)
{
var result = new List<WellFinalDocumentsDto>();
// Выбиираем все дела, по id скважины
var wells = await context.WellFinalDocuments.Where(x => x.IdWell == idWell)
.ToListAsync(token)
.ConfigureAwait(false);
if (wells.Any())
{
// Выбираем категории файлов, по данным выбранных дел
var category = await context.FileCategories
.Where(x => wells.Select(w => w.IdCategory).Contains(x.Id))
.ToListAsync(token)
.ConfigureAwait(false);
// Группируем дела по категориям
var wellFinalDocs = category
.GroupJoin(wells,
fc => fc.Id,
w => w.IdCategory,
(o, i) => new {
NameCategory = o.Name,
Wells = i
})
.ToList();
wellFinalDocs.ForEach(async item => {
// Получение списка ответственных
var userIds = item.Wells
.Select(x => x.IdUser)
.ToList();
var allUsers = await userService.GetAllAsync(token)
.ConfigureAwait(false);
// Получение общее количество файлов и актуальный
var fileIds = item.Wells
.Where(x => x.IdFile != null)
.Select(x => x.IdFile)
.OrderByDescending(x => x)
.ToList();
FileInfoDto actualFile = null;
if (fileIds.Any())
{
var actualFileId = fileIds.FirstOrDefault();
actualFile = fileService.GetInfoAsync(actualFileId ?? default(int), token).Result;
}
// Формирование модели дела
result.Add(new WellFinalDocumentsDto {
IdWell = idWell,
NameCategory = item.NameCategory,
ListResponsible = allUsers.Where(x => userIds.Contains(x.Id)),
CountFiles = fileIds.Count(x => x.HasValue),
File = actualFile
});
});
}
return result;
}
public async Task<List<UserExtendedDto>> GetListResponsiblesAsync(int idWell, CancellationToken token)
{
// Получаем отношение скважин и компаний по идентификатору скважины
var companyIds = await context.RelationCompaniesWells
.Where(x => x.IdWell == idWell).Select(x => x.IdCompany)
.ToListAsync(token)
.ConfigureAwait(false);
// Получаем пользователей
var allUsers = await userService.GetAllAsync(token)
.ConfigureAwait(false);
// Выбираем пользователей у которых, компания совпадает со строителем вышки
return allUsers.Where(x => {
var idCompany = x.IdCompany ?? default(int);
return companyIds.Contains(idCompany);
})
.OrderBy(x => x.Surname)
.ToList();
}
public async Task<int> SaveCategoryFile(int idDto, Stream fileStream, string fileName, CancellationToken token)
{
// Получаем запись
var dtos = await context.WellFinalDocuments.Where(x => x.Id == idDto)
.Select(x => new WellFinalDocumentsDBDto
{
Id = x.Id,
IdCategory = x.IdCategory,
IdWell = x.IdWell,
IdUser = x.IdUser,
IdFile = x.IdFile
})
.ToListAsync(token)
.ConfigureAwait(false);
var dto = dtos.FirstOrDefault();
// Сохраняем файл и добавляем id файла в запись
var file = await fileService.SaveAsync(dto.IdWell, dto.IdUser, dto.IdCategory, fileName,
fileStream, token).ConfigureAwait(false);
if (file != null)
dto.IdFile = file.Id;
var data = await base.UpdateAsync(dto, token);
return data;
}
public async Task<WellFinalDocumentsHistoryDto> GetHistoryFileByIdCategory(int idWell, int idCategory, CancellationToken token)
{
// Выбиираем все id файлов, по id скважины и id категории
var wellsIds = await context.WellFinalDocuments
.Where(x => idWell == x.IdWell && x.IdCategory == idCategory && x.IdFile != null)
.Select(x => (int)x.IdFile)
.ToListAsync(token)
.ConfigureAwait(false);
// Находим фалы
var files = await fileService.GetInfoByIdsAsync(wellsIds, token).ConfigureAwait(false);
return new WellFinalDocumentsHistoryDto {
IdWell = idWell,
IdCategory = idCategory,
File = files
};
}
private async Task GenerateMessage(List<WellFinalDocumentsDBDto> dtos, string message, CancellationToken token)
{
// Получам пользователей
var userIds = dtos.Select(x => x.IdUser);
var allUsers = await userService.GetAllAsync(token)
.ConfigureAwait(false);
var users = allUsers.Where(x => userIds.Contains(x.Id));
// Получаем категории файлов
var categoryIds = dtos.Select(x => x.IdCategory);
var category = await context.FileCategories
.Where(x => categoryIds.Contains(x.Id))
.ToListAsync(token)
.ConfigureAwait(false);
foreach (var item in dtos)
{
var currentUser = users.FirstOrDefault(x => x.Id == item.IdUser);
var categoryName = category.FirstOrDefault(x => x.Id == item.IdCategory)?.Name;
await SendMessage(item.IdWell, currentUser, categoryName, message, token);
}
}
private async Task SendMessage(int idWell, UserDto user, string documentCategory, string message, CancellationToken token)
{
var well = await wellService.GetOrDefaultAsync(idWell, token);
var factory = new MailBodyFactory(configuration);
var subject = MailBodyFactory.MakeSubject(well, string.Format(message, documentCategory));
var body = factory.MakeMailBodyForNewPublisher(well, user.Name, documentCategory);
emailService.EnqueueSend(user.Email, subject, body);
}
private static WellFinalDocumentsDBDto Convert(WellFinalDocuments dto)
=> new WellFinalDocumentsDBDto
{
Id = dto.Id,
IdCategory = dto.IdCategory,
IdWell = dto.IdWell,
IdUser = dto.IdUser,
IdFile = dto.IdFile
};
}
}

View File

@ -2,6 +2,7 @@
using AsbCloudApp.Requests;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Repository;
using AsbCloudInfrastructure.Services;
using AsbCloudInfrastructure.Services.Cache;
using AsbCloudInfrastructure.Services.DetectOperations;
@ -124,10 +125,10 @@ namespace AsbCloudWebApi.Tests.ServicesTests
var wellServiceMock = new Mock<IWellService>();
wellServiceMock.Setup(s => s.GetTimezone(It.IsAny<int>())).Returns(timezone);
wellServiceMock.Setup(s => s.GetOrDefaultAsync(It.IsAny<int>(),CancellationToken.None)).Returns(Task.Run(() => wellDto));
var operationValueService = new OperationValueService(context);
//var operationValueService = new OperationValueService(context);
var scheduleService = new ScheduleRepository(context, wellServiceMock.Object);
service = new DetectedOperationService(context, wellServiceMock.Object, operationValueService, scheduleService);
service = new DetectedOperationService(context, wellServiceMock.Object, /*operationValueService*/ null, scheduleService);
request = new DetectedOperationRequest
{
IdWell = 1,

View File

@ -0,0 +1,36 @@
using AsbCloudApp.Data;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services;
using AsbCloudInfrastructure.Services.Cache;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
namespace AsbCloudWebApi.Tests.ServicesTests
{
public class FileCategoryServiceTest
{
private readonly AsbCloudDbContext context;
private FileCategoryService service;
public FileCategoryServiceTest()
{
context = TestHelpter.MakeTestContext();
context.SaveChanges();
service = new FileCategoryService(context);
}
~FileCategoryServiceTest()
{
}
[Fact]
public async Task GetWellCategoryAsync_return_cnt_file_category()
{
var cnt = (await service.GetWellCategoryAsync(CancellationToken.None)).Count();
Assert.NotEqual(0, cnt);
}
}
}

View File

@ -0,0 +1,77 @@
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using AsbCloudDb.Model;
using AsbCloudInfrastructure.Services;
using Microsoft.Extensions.Configuration;
using Moq;
using System.Threading;
using System.Threading.Tasks;
using Xunit;
using System.IO;
namespace AsbCloudWebApi.Tests.ServicesTests
{
public class WellFinalDocumentsServiceTest
{
private readonly AsbCloudDbContext context;
private WellFinalDocumentsService service;
private readonly Mock<IFileService> fileServiceMock;
private readonly Mock<IUserService> userServiceMock;
private readonly Mock<IWellService> wellServiceMock;
private readonly Mock<IConfiguration> configurationMock;
private readonly Mock<IEmailService> emailServiceMock;
public WellFinalDocumentsServiceTest()
{
context = TestHelpter.MakeTestContext();
context.SaveChanges();
fileServiceMock = new Mock<IFileService>();
userServiceMock = new Mock<IUserService>();
wellServiceMock = new Mock<IWellService>();
configurationMock = new Mock<IConfiguration>();
emailServiceMock = new Mock<IEmailService>();
service = new WellFinalDocumentsService(
context: context,
fileService: fileServiceMock.Object,
userService: userServiceMock.Object,
wellService: wellServiceMock.Object,
configuration: configurationMock.Object,
emailService: emailServiceMock.Object);
}
~WellFinalDocumentsServiceTest()
{
}
[Fact]
public async Task GetWellFinalDocument_return_collection_rows()
{
var data = await service.GetByWellId(90, CancellationToken.None);
Assert.NotEmpty(data);
}
[Fact]
public async Task GetListResponsibles_return_cnt_users()
{
var data = await service.GetListResponsiblesAsync(90, CancellationToken.None);
Assert.Empty(data);
}
[Fact]
public async Task GetHistoryFileByIdCategory_return_data_hitory()
{
var data = await service.GetHistoryFileByIdCategory(90, 10018, CancellationToken.None);
Assert.NotNull(data);
}
[Fact]
public async Task SaveCategoryFile_return_id_edit_record()
{
var stream = new FileStream("D:\\test\\test.txt", FileMode.Open);
var data = await service.SaveCategoryFile(21, stream, "test.txt", CancellationToken.None);
Assert.Equal(21, data);
}
}
}

View File

@ -0,0 +1,39 @@
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
namespace AsbCloudWebApi.Controllers
{
/// <summary>
/// Категорий документов файлов
/// </summary>
[Route("api/fileCategory")]
[ApiController]
[Authorize]
public class FileCategoryController : CrudController<FileCategoryDto, ICrudService<FileCategoryDto>>
{
private readonly IFileCategoryService fileCategoryService;
public FileCategoryController(ICrudService<FileCategoryDto> service, IFileCategoryService fileCategoryService)
: base(service)
{
this.fileCategoryService = fileCategoryService;
}
/// <summary>
/// Получение справочника категорий файлов
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("/getWellFileCategory")]
//[Permission]
public async Task<IActionResult> GetWellFileCategory(CancellationToken token = default)
{
var data = await fileCategoryService.GetWellCategoryAsync(token);
return Ok(data);
}
}
}

View File

@ -0,0 +1,119 @@
using AsbCloudApp.Data;
using AsbCloudApp.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Generic;
using Microsoft.AspNetCore.Http;
namespace AsbCloudWebApi.Controllers
{
/// <summary>
/// Дело скважины
/// </summary>
[Route("api/wellFinalDocuments")]
[ApiController]
[Authorize]
public class WellFinalDocumentsController : ControllerBase
{
private readonly IWellFinalDocumentsService wellFinalDocumentsService;
public WellFinalDocumentsController(IWellFinalDocumentsService wellFinalDocumentsService)
{
this.wellFinalDocumentsService = wellFinalDocumentsService;
}
/// <summary>
/// Получение всех записей
/// </summary>
/// <param name="idWell"></param>
/// <param name="token"></param>
/// <returns></returns>
[HttpGet]
[Permission]
public async Task<IActionResult> GetAsync(int idWell, CancellationToken token = default)
{
var data = await this.wellFinalDocumentsService.GetByWellId(idWell, token);
return Ok(data);
}
/// <summary>
/// Получение списка ответственных
/// </summary>
/// <param name="idWell"></param>
/// <param name="token"></param>
/// <returns></returns>
[HttpGet]
[Permission]
[Route("getResponsibles")]
public async Task<IActionResult> GetResponsiblesAsync(int idWell, CancellationToken token = default)
{
var data = await this.wellFinalDocumentsService.GetListResponsiblesAsync(idWell, token);
return Ok(data);
}
/// <summary>
/// Добавление записи
/// </summary>
/// <param name="dtos"></param>
/// <param name="token"></param>
/// <returns></returns>
[HttpPut]
[Permission]
public async Task<IActionResult> InsertRangeAsync(List<WellFinalDocumentsDBDto> dtos, CancellationToken token = default)
{
var data = await this.wellFinalDocumentsService.InsertRangeAsync(dtos, token);
return Ok(data);
}
/// <summary>
/// Удалить запись
/// </summary>
/// <param name="iDdto"></param>
/// <param name="token"></param>
/// <returns></returns>
[HttpDelete]
[Permission]
public async Task<IActionResult> DeleteAsync(int iDdto, CancellationToken token = default)
{
var data = await this.wellFinalDocumentsService.DeleteAsync(iDdto, token);
return Ok(data);
}
/// <summary>
/// Получение истории файлов
/// </summary>
/// <param name="idWell"></param>
/// <param name="idCategory"></param>
/// <param name="token"></param>
/// <returns></returns>
[HttpGet]
[Permission]
[Route("getHistoryFileByIdCategory")]
public async Task<IActionResult> GetHistoryFileByIdCategory(int idWell,
int idCategory,
CancellationToken token = default)
{
var data = await this.wellFinalDocumentsService.GetHistoryFileByIdCategory(idWell, idCategory, token);
return Ok(data);
}
/// <summary>
/// Сохранение файла
/// </summary>
/// <param name="idDto"></param>
/// <param name="file"></param>
/// <param name="token"></param>
/// <returns></returns>
[HttpPost]
[Permission]
[ProducesResponseType(typeof(int), (int)System.Net.HttpStatusCode.OK)]
public async Task<IActionResult> SaveFilesAsync(int idDto,
IFormFile file, CancellationToken token = default)
{
var fileStream = file.OpenReadStream();
var data = await this.wellFinalDocumentsService.SaveCategoryFile(idDto, fileStream, file.FileName, token);
return Ok(data);
}
}
}