fix: logic errors in view models

This commit is contained in:
2026-08-10 08:59:17 +03:00
parent 5b6abc045b
commit 089df7d524
4 changed files with 121 additions and 133 deletions
@@ -89,7 +89,7 @@ public partial class AnalysisViewModel : ViewModelBase
public const double UNPROCESSED_THRESHOLD = 0.6; public const double UNPROCESSED_THRESHOLD = 0.6;
public const double HOTSPOT_THRESHOLD = 1.1; public const double HOTSPOT_THRESHOLD = 1.1;
public const double EPSILON = 1e-10; public const double EPSILON = 1e-10;
public const double UNPROCESSED_FRACTION_THRESHOLD = 10; public const double UNPROCESSED_FRACTION_THRESHOLD = 50;
/// <summary> /// <summary>
/// Модель гистограммы /// Модель гистограммы
@@ -685,8 +685,8 @@ public partial class AnalysisViewModel : ViewModelBase
var maxY = Ys[ParticleIndex].Max(); var maxY = Ys[ParticleIndex].Max();
ParticleImagesZoom = MathF.Max((float)ParticleImagesBounds.Width, (float)ParticleImagesBounds.Height) * MathF.Max(maxX - minX, maxY - minY) / AnalyzerService.ANALYSIS_IMAGE_SIZE; ParticleImagesZoom = MathF.Max((float)ParticleImagesBounds.Width, (float)ParticleImagesBounds.Height) * MathF.Max(maxX - minX, maxY - minY) / AnalyzerService.ANALYSIS_IMAGE_SIZE;
ParticleImagesPanX = -((maxX + minX) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Width * ParticleImagesZoom; ParticleImagesPanX = -((maxX + minX) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Width * ParticleImagesZoom;
ParticleImagesPanY = -((maxY + minY) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Height * ParticleImagesZoom; ParticleImagesPanY = -((maxY + minY) / 2 / AnalyzerService.ANALYSIS_IMAGE_SIZE - 0.5f) * (float)ParticleImagesBounds.Height * ParticleImagesZoom;
} }
} }
@@ -996,7 +996,7 @@ public partial class AnalysisViewModel : ViewModelBase
ea.PropertyName == nameof(InfoSectionIsScrolling)) ea.PropertyName == nameof(InfoSectionIsScrolling))
UpdateCanInteract(); UpdateCanInteract();
if (ea.PropertyName == nameof(MenuSelectedIndex) || if (ea.PropertyName == nameof(MenuSelectedIndex) ||
ea.PropertyName == nameof(InfoSectionCurrentIndex) ) ea.PropertyName == nameof(InfoSectionCurrentIndex))
UpdateCharts?.Invoke(this, EventArgs.Empty); UpdateCharts?.Invoke(this, EventArgs.Empty);
}; };
@@ -1012,25 +1012,24 @@ public partial class AnalysisViewModel : ViewModelBase
if (value >= MenuItems.Count()) if (value >= MenuItems.Count())
_logger.LogError("Значение {}({}) больше количества элементов {}({})", nameof(MenuSelectedIndex), MenuSelectedIndex, nameof(MenuItems), MenuItems.Count()); _logger.LogError("Значение {}({}) больше количества элементов {}({})", nameof(MenuSelectedIndex), MenuSelectedIndex, nameof(MenuItems), MenuItems.Count());
// Если значение меньше 0, то значит элемент меню не выбран // Если значение меньше 0, то значит элемент меню не выбран
if (value < 0 || value > MenuItems.Count()) if (value >= 0 && value < MenuItems.Count())
{
// Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords));
// Сохраняем несуществующий индекс
var nonExistingIndex = MenuSelectedIndex;
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
MenuSelectedIndex = -1;
// Удаляем несуществующий элемент из списка
MenuItems.RemoveAt(nonExistingIndex);
return;
}
_logger.LogTrace("Выбран элемент из списка: {}", value);
// Находим запись в базе данных
var selectedRecord = _context.ResultRecords.Find(MenuItems[value].Id);
// Если запись найдена, то заполняем поля из базы данных
if (selectedRecord is not null)
{ {
_logger.LogTrace("Выбран элемент из списка: {}", value);
// Находим запись в базе данных
var selectedRecord = _context.ResultRecords.Find(MenuItems[value].Id);
// Если запись не найдена
if (selectedRecord is null)
{
// Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.ResultRecords));
var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
MenuSelectedIndex = -1;
// Удаляем несуществующий элемент из списка
MenuItems.RemoveAt(nonExistingIndex);
return;
}
// Если запись найдена, то заполняем поля из базы данных
// Заполняем простые поля // Заполняем простые поля
Record.Id = selectedRecord.Id; Record.Id = selectedRecord.Id;
Record.Uuid = selectedRecord.Uuid; Record.Uuid = selectedRecord.Uuid;
@@ -173,21 +173,8 @@ public partial class BrandCalibrationViewModel : ViewModelBase
_logger.LogTrace("Выбран элемент из списка: {}", value); _logger.LogTrace("Выбран элемент из списка: {}", value);
// Находим запись в базе данных // Находим запись в базе данных
var selectedRecord = _context.BrandRecords.Find(MenuItems[value].Id); var selectedRecord = _context.BrandRecords.Find(MenuItems[value].Id);
// Если запись найдена, то заполняем поля из базы данных // Если запись не найдена
if (selectedRecord is not null) if (selectedRecord is null)
{
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;
}
// Если значение не найдено в базе данных
else
{ {
// Логгируем как ошибку // Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords));
@@ -198,6 +185,16 @@ public partial class BrandCalibrationViewModel : ViewModelBase
MenuItems.RemoveAt(nonExistingIndex); MenuItems.RemoveAt(nonExistingIndex);
return; return;
} }
// Если запись найдена, то заполняем поля из базы данных
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;
} }
// Если элемент не выбран, заполняем поля пустыми значениями // Если элемент не выбран, заполняем поля пустыми значениями
@@ -321,63 +321,11 @@ public partial class SampleCalibrationViewModel : ViewModelBase
_logger.LogTrace("Выбран элемент из списка: {}", value); _logger.LogTrace("Выбран элемент из списка: {}", value);
// Находим запись в базе данных // Находим запись в базе данных
var selectedRecord = _context.SampleRecords.Find(MenuItems[value].Id); var selectedRecord = _context.SampleRecords.Find(MenuItems[value].Id);
// Если запись найдена, то заполняем поля из базы данных
if (selectedRecord is not null)
{
// Заполняем простые поля
Record.Id = selectedRecord.Id;
Record.Uuid = selectedRecord.Uuid;
Record.CreateDateTime = selectedRecord.CreateDateTime;
Record.EditDateTime = selectedRecord.EditDateTime;
Record.SampleName = selectedRecord.SampleName;
Record.SampleComment = selectedRecord.SampleComment;
Record.SamplingDateTime = selectedRecord.SamplingDateTime;
Record.SamplingPlace = selectedRecord.SamplingPlace;
Record.MixtureActualRate = selectedRecord.MixtureActualRate;
Record.MeasuredContent = selectedRecord.MeasuredContent;
if (selectedRecord.Features.Count() > 0)
Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList();
else
Record.Features = new List<float[]>();
// Ищем изображение в базе данных
var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId);
// Если изображение не найдено в базе данных, то логгируем как ошибку
if (imageRecord is null)
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords));
// В любом случае заполняем изображение
Record.Image.Data = imageRecord?.Base64 ?? "";
// Ищем марку в базе данных
var brandRecord = _context.BrandRecords.Find(selectedRecord.BrandId);
// Если марка не найдена в базе данных
if (brandRecord is null)
{
// Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.BrandId, nameof(_context.BrandRecords));
// Устанавливаем, что элемент не выбран
BrandComboBoxSelectedIndex = -1;
}
// Если марка найдена в базе данных
else
{
// Ищем марку в выпадающем списке марок
var brandComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id);
// Если марка не найдена в выпадающем списке марок, то логгируем как ошибку
if (brandComboBoxItem is null)
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
// Если марка найдена в выпадающем списке марок, выбираем её
else
BrandComboBoxSelectedIndex = BrandComboBoxItems.IndexOf(brandComboBoxItem);
}
return;
}
// Если значение не найдено в базе данных // Если значение не найдено в базе данных
else if (selectedRecord is null)
{ {
// Логгируем как ошибку // Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.SampleRecords));
var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями // Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
MenuSelectedIndex = -1; MenuSelectedIndex = -1;
@@ -385,6 +333,55 @@ public partial class SampleCalibrationViewModel : ViewModelBase
MenuItems.RemoveAt(nonExistingIndex); MenuItems.RemoveAt(nonExistingIndex);
return; return;
} }
// Если запись найдена, то заполняем поля из базы данных
// Заполняем простые поля
Record.Id = selectedRecord.Id;
Record.Uuid = selectedRecord.Uuid;
Record.CreateDateTime = selectedRecord.CreateDateTime;
Record.EditDateTime = selectedRecord.EditDateTime;
Record.SampleName = selectedRecord.SampleName;
Record.SampleComment = selectedRecord.SampleComment;
Record.SamplingDateTime = selectedRecord.SamplingDateTime;
Record.SamplingPlace = selectedRecord.SamplingPlace;
Record.MixtureActualRate = selectedRecord.MixtureActualRate;
Record.MeasuredContent = selectedRecord.MeasuredContent;
if (selectedRecord.Features.Count() > 0)
Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList();
else
Record.Features = new List<float[]>();
// Ищем изображение в базе данных
var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId);
// Если изображение не найдено в базе данных, то логгируем как ошибку
if (imageRecord is null)
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords));
// В любом случае заполняем изображение
Record.Image.Data = imageRecord?.Base64 ?? "";
// Ищем марку в базе данных
var brandRecord = _context.BrandRecords.Find(selectedRecord.BrandId);
// Если марка не найдена в базе данных
if (brandRecord is null)
{
// Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.BrandId, nameof(_context.BrandRecords));
// Устанавливаем, что элемент не выбран
BrandComboBoxSelectedIndex = -1;
}
// Если марка найдена в базе данных
else
{
// Ищем марку в выпадающем списке марок
var brandComboBoxItem = BrandComboBoxItems.FirstOrDefault(r => r.Id == brandRecord.Id);
// Если марка не найдена в выпадающем списке марок, то логгируем как ошибку
if (brandComboBoxItem is null)
_logger.LogError("Не удалось найти элемент с Id({}) в списке {}", brandRecord.Id, nameof(BrandComboBoxItems));
// Если марка найдена в выпадающем списке марок, выбираем её
else
BrandComboBoxSelectedIndex = BrandComboBoxItems.IndexOf(brandComboBoxItem);
}
return;
} }
// Если элемент не выбран, заполняем поля пустыми значениями // Если элемент не выбран, заполняем поля пустыми значениями
@@ -219,38 +219,11 @@ public partial class SeparatorCalibrationViewModel : ViewModelBase
_logger.LogTrace("Выбран элемент из списка: {}", value); _logger.LogTrace("Выбран элемент из списка: {}", value);
// Находим запись в базе данных // Находим запись в базе данных
var selectedRecord = _context.SeparatorRecords.Find(MenuItems[value].Id); var selectedRecord = _context.SeparatorRecords.Find(MenuItems[value].Id);
// Если запись найдена, то заполняем поля из базы данных // Если запись не найдена
if (selectedRecord is not null) if (selectedRecord is null)
{
// Заполняем простые поля
Record.Id = selectedRecord.Id;
Record.Uuid = selectedRecord.Uuid;
Record.CreateDateTime = selectedRecord.CreateDateTime;
Record.EditDateTime = selectedRecord.EditDateTime;
Record.Type = selectedRecord.Type;
Record.Comment = selectedRecord.Comment;
if (selectedRecord.Features.Count() > 0)
Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList();
else
Record.Features = new List<float[]>();
// Ищем изображение в базе данных
var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId);
// Если изображение не найдено в базе данных, то логгируем как ошибку
if (imageRecord is null)
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords));
// В любом случае заполняем изображение
Record.Image.Data = imageRecord?.Base64 ?? "";
// Ищем все признаки в базе данных
return;
}
// Если значение не найдено в базе данных
else
{ {
// Логгируем как ошибку // Логгируем как ошибку
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.BrandRecords)); _logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", MenuItems[value].Id, nameof(_context.SeparatorRecords));
var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс var nonExistingIndex = MenuSelectedIndex; // Сохраняем несуществующий индекс
// Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями // Устанавливаем, что запись не выбрана, этот метод вызовется повторно и заполнит поля пустыми значениями
MenuSelectedIndex = -1; MenuSelectedIndex = -1;
@@ -258,6 +231,28 @@ public partial class SeparatorCalibrationViewModel : ViewModelBase
MenuItems.RemoveAt(nonExistingIndex); MenuItems.RemoveAt(nonExistingIndex);
return; return;
} }
// Если запись найдена, то заполняем поля из базы данных
// Заполняем простые поля
Record.Id = selectedRecord.Id;
Record.Uuid = selectedRecord.Uuid;
Record.CreateDateTime = selectedRecord.CreateDateTime;
Record.EditDateTime = selectedRecord.EditDateTime;
Record.Type = selectedRecord.Type;
Record.Comment = selectedRecord.Comment;
if (selectedRecord.Features.Count() > 0)
Record.Features = selectedRecord.Features.Chunk(AnalyzerService.FEATURES_LENGTH).Select(v => v.ToArray()).ToList();
else
Record.Features = new List<float[]>();
// Ищем изображение в базе данных
var imageRecord = _context.ImageRecords.Find(selectedRecord.ImageId);
// Если изображение не найдено в базе данных, то логгируем как ошибку
if (imageRecord is null)
_logger.LogError("Не удалось найти элемент с Id({}) в таблице {}", selectedRecord.ImageId, nameof(_context.ImageRecords));
// В любом случае заполняем изображение
Record.Image.Data = imageRecord?.Base64 ?? "";
return;
} }
// Если элемент не выбран, заполняем поля пустыми значениями // Если элемент не выбран, заполняем поля пустыми значениями