forked from amkovkov/GranuSightSoftware2
comprehensive update
1) remove unused components: camera view (due it causes segmentation faults), compute resources and all related, illuminator controller (due in useless without camera view), image storage service, temperature and humidity service 2) database schema - reduce tables references, features storing in records themselves in compressed form, add records creation and editing date and time, add separator comment column 3) analysis - rework of pipeline and ui, now database storing only raw data and all display values calculated from it 4) lights service - add reconnection if disconnected 5) add width and height command line arguments 6) fix some typos and other issues
This commit is contained in:
@@ -31,6 +31,45 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Внутренняя модель записи
|
||||
/// </summary>
|
||||
public partial class RecordViewModel : ViewModelBase
|
||||
{
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.Id"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial int Id { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.Uuid"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string Uuid { get; set; } = Guid.NewGuid().ToString();
|
||||
/// <summary>
|
||||
/// <see cref="SampleRecord.CreateDateTime"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial DateTime CreateDateTime { get; set; } = DateTime.UtcNow;
|
||||
/// <summary>
|
||||
/// <see cref="SampleRecord.EditDateTime"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial DateTime EditDateTime { get; set; } = DateTime.UtcNow;
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.BrandName"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string BrandName { get; set; } = "";
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.MixtureName"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string MixtureName { get; set; } = "";
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.MixtureNormalRate"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial double MixtureNormalRate { get; set; } = -1;
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.Comment"/>
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string Comment { get; set; } = "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Логгер
|
||||
/// </summary>
|
||||
@@ -60,30 +99,33 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
/// Текущий выбранный элемент меню. Равен -1 если элемент не выбран
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial int MenuSelectedIndex { get; set; } = -1;
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.Id"/> выбранного элемента
|
||||
/// Запись
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial int SelectedId { get; set; } = 0;
|
||||
[ObservableProperty] public partial RecordViewModel Record { get; set; } = new();
|
||||
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.Uuid"/> выбранного элемента
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string SelectedUuid { get; set; } = Guid.NewGuid().ToString();
|
||||
/// Текущий экран информационной секции
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial int InfoSectionCurrentIndex { get; set; } = 0;
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.BrandName"/> выбранного элемента
|
||||
/// Можно ли переходить на следующий экран информационной секции
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string SelectedBrandName { get; set; } = "";
|
||||
[ObservableProperty] public partial bool InfoSectionCanScrollBackward { get; set; } = false;
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.MixtureName"/> выбранного элемента
|
||||
/// Можно ли переходить на предыдущий экран информационной секции
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial string SelectedMixtureName { get; set; } = "";
|
||||
[ObservableProperty] public partial bool InfoSectionCanScrollForward { get; set; } = false;
|
||||
/// <summary>
|
||||
/// <see cref="BrandRecord.MixtureNormalRate"/> выбранного элемента
|
||||
/// Происходит ли переход между экранами информационной секции
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial double SelectedMixtureNormalRate { get; set; } = -1;
|
||||
[ObservableProperty] public partial bool InfoSectionIsScrolling { get; set; } = false;
|
||||
|
||||
/// <summary>
|
||||
/// Можно ли производить перемещение между экранами
|
||||
/// Можно ли взаимодействовать с объектом
|
||||
/// </summary>
|
||||
[ObservableProperty] public partial bool CanScroll { get; set; } = true;
|
||||
[ObservableProperty] public partial bool CanInteract { get; set; } = true;
|
||||
|
||||
public BrandCalibrationViewModel(
|
||||
ILogger<BrandCalibrationViewModel> logger,
|
||||
@@ -109,8 +151,9 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
// Подписываемся на изменения свойств для обновления CanScroll
|
||||
PropertyChanged += (_, ea) =>
|
||||
{
|
||||
if (ea.PropertyName == nameof(MenuOpened))
|
||||
UpdateCanScroll();
|
||||
if (ea.PropertyName == nameof(MenuOpened) ||
|
||||
ea.PropertyName == nameof(InfoSectionIsScrolling))
|
||||
UpdateCanInteract();
|
||||
};
|
||||
|
||||
_logger.LogInformation("Инициализировано");
|
||||
@@ -133,11 +176,14 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
// Если запись найдена, то заполняем поля из базы данных
|
||||
if (selectedRecord is not null)
|
||||
{
|
||||
SelectedId = selectedRecord.Id;
|
||||
SelectedUuid = selectedRecord.Uuid;
|
||||
SelectedBrandName = selectedRecord.BrandName;
|
||||
SelectedMixtureName = selectedRecord.MixtureName;
|
||||
SelectedMixtureNormalRate = selectedRecord.MixtureNormalRate;
|
||||
Record.Id = selectedRecord.Id;
|
||||
Record.Uuid = selectedRecord.Uuid;
|
||||
Record.CreateDateTime = selectedRecord.CreateDateTime;
|
||||
Record.EditDateTime = selectedRecord.EditDateTime;
|
||||
Record.BrandName = selectedRecord.BrandName;
|
||||
Record.MixtureName = selectedRecord.MixtureName;
|
||||
Record.MixtureNormalRate = selectedRecord.MixtureNormalRate;
|
||||
Record.Comment = selectedRecord.Comment;
|
||||
return;
|
||||
}
|
||||
// Если значение не найдено в базе данных
|
||||
@@ -156,19 +202,24 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
|
||||
// Если элемент не выбран, заполняем поля пустыми значениями
|
||||
_logger.LogTrace("Выбран новый элемент");
|
||||
SelectedId = 0;
|
||||
SelectedUuid = Guid.NewGuid().ToString();
|
||||
SelectedBrandName = "";
|
||||
SelectedMixtureName = "";
|
||||
SelectedMixtureNormalRate = -1;
|
||||
var dateTime = DateTime.UtcNow;
|
||||
Record.Id = 0;
|
||||
Record.Uuid = Guid.NewGuid().ToString();
|
||||
Record.CreateDateTime = dateTime;
|
||||
Record.EditDateTime = dateTime;
|
||||
Record.BrandName = "";
|
||||
Record.MixtureName = "";
|
||||
Record.MixtureNormalRate = -1;
|
||||
Record.Comment = "";
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Обновить значение <see cref="CanScroll"/>
|
||||
/// Обновить значение <see cref="CanInteract"/>
|
||||
/// </summary>
|
||||
private void UpdateCanScroll()
|
||||
private void UpdateCanInteract()
|
||||
{
|
||||
CanScroll = !MenuOpened;
|
||||
CanInteract = !MenuOpened;
|
||||
CanInteract &= !InfoSectionIsScrolling;
|
||||
}
|
||||
|
||||
|
||||
@@ -185,6 +236,15 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
/// Переключить видимость меню
|
||||
/// </summary>
|
||||
[RelayCommand] private void ToggleMenu() => MenuOpened = !MenuOpened;
|
||||
|
||||
/// <summary>
|
||||
/// Переключить информационную секцию на следующую
|
||||
/// </summary>
|
||||
[RelayCommand] private void InfoSectionPrevious() => InfoSectionCurrentIndex--;
|
||||
/// <summary>
|
||||
/// Переключить информационную секцию на предыдущую
|
||||
/// </summary>
|
||||
[RelayCommand] private void InfoSectionNext() => InfoSectionCurrentIndex++;
|
||||
|
||||
/// <summary>
|
||||
/// Создать новую запись
|
||||
@@ -212,7 +272,7 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
// TODO: Добавить определение и отображение количества затрагиваемых, записей которые будут повреждены при удалении этой записи
|
||||
try
|
||||
{
|
||||
_logger.LogTrace("Удаление записи: {}={}, {}={}, {}={}", nameof(BrandRecord.Id), SelectedId, nameof(BrandRecord.BrandName), SelectedBrandName, nameof(BrandRecord.MixtureName), SelectedMixtureName);
|
||||
_logger.LogTrace("Удаление записи: {}={}, {}={}, {}={}", nameof(BrandRecord.Id), Record.Id, nameof(BrandRecord.BrandName), Record.BrandName, nameof(BrandRecord.MixtureName), Record.MixtureName);
|
||||
// Если запись не выбрана, то просто создаём новую запись
|
||||
if (MenuSelectedIndex < 0)
|
||||
{
|
||||
@@ -247,7 +307,7 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
|
||||
// Сохраняем индекс удалённый записи и находим её в базе данных
|
||||
var deletedMenuIndex = MenuSelectedIndex;
|
||||
var deletedRecordId = SelectedId;
|
||||
var deletedRecordId = Record.Id;
|
||||
var deletedRecord = _context.BrandRecords.Find(deletedRecordId);
|
||||
// Создаём новую запись
|
||||
CreateRecord();
|
||||
@@ -299,17 +359,21 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
{
|
||||
try
|
||||
{
|
||||
_logger.LogTrace("Сохранение записи: {}={}, {}={}, {}={}", nameof(BrandRecord.Id), SelectedId, nameof(BrandRecord.BrandName), SelectedBrandName, nameof(BrandRecord.MixtureName), SelectedMixtureName);
|
||||
_logger.LogTrace("Сохранение записи: {}={}, {}={}, {}={}", nameof(BrandRecord.Id), Record.Id, nameof(BrandRecord.BrandName), Record.BrandName, nameof(BrandRecord.MixtureName), Record.MixtureName);
|
||||
// Если запись не выбрана
|
||||
if (MenuSelectedIndex < 0)
|
||||
{
|
||||
_logger.LogTrace("Создаём новую запись");
|
||||
var dateTime = DateTime.UtcNow;
|
||||
// Создаём новую запись
|
||||
var newRecord = new BrandRecord(
|
||||
uuid: SelectedUuid,
|
||||
brandName: SelectedBrandName,
|
||||
mixtureName: SelectedMixtureName,
|
||||
mixtureNormalRate: SelectedMixtureNormalRate
|
||||
uuid: Record.Uuid,
|
||||
createDateTime: dateTime,
|
||||
editDateTime: dateTime,
|
||||
brandName: Record.BrandName,
|
||||
mixtureName: Record.MixtureName,
|
||||
mixtureNormalRate: Record.MixtureNormalRate,
|
||||
comment: Record.Comment
|
||||
);
|
||||
|
||||
// Добавляем запись в базу данных
|
||||
@@ -328,22 +392,22 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
else
|
||||
{
|
||||
// Находим запись в базе данных
|
||||
var attachedRecord = _context.BrandRecords.Find(SelectedId);
|
||||
var attachedRecord = _context.BrandRecords.Find(Record.Id);
|
||||
// Если запись не найдена, то логгируем как ошибку
|
||||
if (attachedRecord is null)
|
||||
{
|
||||
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", SelectedId, nameof(_context.BrandRecords));
|
||||
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", Record.Id, nameof(_context.BrandRecords));
|
||||
return;
|
||||
}
|
||||
|
||||
_logger.LogTrace("Записываем изменения в базу данных");
|
||||
// Если в данных есть изменения, то записываем их
|
||||
if (attachedRecord.BrandName != SelectedBrandName)
|
||||
attachedRecord.BrandName = SelectedBrandName;
|
||||
if (attachedRecord.MixtureName != SelectedMixtureName)
|
||||
attachedRecord.MixtureName = SelectedMixtureName;
|
||||
if (attachedRecord.MixtureNormalRate != SelectedMixtureNormalRate)
|
||||
attachedRecord.MixtureNormalRate = SelectedMixtureNormalRate;
|
||||
|
||||
// Записываем изменения
|
||||
attachedRecord.EditDateTime = DateTime.UtcNow;
|
||||
attachedRecord.BrandName = Record.BrandName;
|
||||
attachedRecord.MixtureName = Record.MixtureName;
|
||||
attachedRecord.MixtureNormalRate = Record.MixtureNormalRate;
|
||||
attachedRecord.Comment = Record.Comment;
|
||||
|
||||
// Сохраняем изменения в базе данных
|
||||
_context.SaveChanges();
|
||||
@@ -351,8 +415,8 @@ public partial class BrandCalibrationViewModel : ViewModelBase
|
||||
|
||||
// Записываем изменения в меню
|
||||
_logger.LogTrace("Записываем изменения в меню");
|
||||
MenuItems[MenuSelectedIndex].BrandName = SelectedBrandName;
|
||||
MenuItems[MenuSelectedIndex].MixtureName = SelectedMixtureName;
|
||||
MenuItems[MenuSelectedIndex].BrandName = Record.BrandName;
|
||||
MenuItems[MenuSelectedIndex].MixtureName = Record.MixtureName;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
|
||||
Reference in New Issue
Block a user