C00225155-02/C00225155/MegaRobo.C00225155/MegaRobo.C00225155App/MenuViewModels/AdditivePipetteConfigViewMo...

341 lines
16 KiB
C#
Raw Normal View History

2026-04-13 09:12:49 +00:00
using Common.DevicesModels;
using Common.Models;
using CommunityToolkit.Mvvm.Input;
using MegaRobo.C00225155.DataAccess;
using MegaRobo.C00225155.Entities.Entity_DB;
using MegaRobo.C00225155App.MenuViews;
using MegaRobo.Contract;
using MegaRobo.WpfInfrastructure.Abstractions;
using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Forms;
using System.Windows.Input;
using Telerik.Windows.Controls;
using Xceed.Wpf.Toolkit.Core;
namespace MegaRobo.C00225155App.MenuViewModels
{
public class AdditivePipetteConfigViewModel : ViewModelBaseEx
{
protected IDataAccessService dataAccessService;
private ObservableCollection<Liquid_lml_Dose_Show> _proudcts_1ml = new ObservableCollection<Liquid_lml_Dose_Show>();
public ObservableCollection<Liquid_lml_Dose_Show> Products_1ml_Dose
{
get => _proudcts_1ml;
set => SetProperty(ref _proudcts_1ml, value);
}
private ObservableCollection<Liquid_lml_React_Show> _proudcts = new ObservableCollection<Liquid_lml_React_Show>();
public ObservableCollection<Liquid_lml_React_Show> Products_1ml_React
{
get => _proudcts;
set => SetProperty(ref _proudcts, value);
}
private Liquid_lml_Dose_Show _selectedProduct_1ml;
/// <summary>
/// 选中的投料站1ml的移液枪液体
/// </summary>
public Liquid_lml_Dose_Show SelectedProduct_1ml_Dose
{
get => _selectedProduct_1ml;
set => SetProperty(ref _selectedProduct_1ml, value);
}
private Liquid_lml_React_Show _selectedProduct;
/// <summary>
/// 选中的反应站1ml的移液枪液体
/// </summary>
public Liquid_lml_React_Show SelectedProduct_1ml_React
{
get => _selectedProduct;
set => SetProperty(ref _selectedProduct, value);
}
// 投料站1ml移液枪液体命令
public ICommand LoadDataCommand_1ml { get; set; }
public ICommand AddEntityCommand_1ml { get; set; }
public ICommand DeleteEntityCommand_1ml { get; set; }
// 反应站1ml移液枪液体命令
public ICommand LoadDataCommand_1ml_React { get; set; }
public ICommand AddEntityCommand_1ml_React { get; set; }
public ICommand DeleteEntityCommand_1ml_React { get; set; }
public override void Initialize(ICoreService coreService, string title, params object[] args)
{
base.Initialize(coreService, title, args);
}
protected override void LoadServices()
{
base.LoadServices();
dataAccessService = this.CoreService.GetServiceInstance<IDataAccessService>();
}
protected override void LoadDatas()
{
base.LoadDatas();
LoadDataFromDb_1ml();
LoadDataFromDb_1ml_React();
}
protected override void Register()
{
base.Register();
//投料站1ml
LoadDataCommand_1ml = new RelayCommand(LoadDataFromDb_1ml);
AddEntityCommand_1ml = new RelayCommand(AddData_1ml);
DeleteEntityCommand_1ml = new RelayCommand(DeleteData_1ml);
//反应站1ml
LoadDataCommand_1ml_React = new RelayCommand(LoadDataFromDb_1ml_React);
AddEntityCommand_1ml_React = new RelayCommand(AddData_1ml_React);
DeleteEntityCommand_1ml_React = new RelayCommand(DeleteData_1ml_React);
}
#region 1ml移液枪液体方法
private async void LoadDataFromDb_1ml()
{
// 先取消原有集合的事件订阅(避免内存泄漏)
if (Products_1ml_Dose != null)
{
foreach (var item in Products_1ml_Dose)
{
item.PropertyChanged -= Liquid1mlProduct_Show_PropertyChanged;
}
Products_1ml_Dose.CollectionChanged -= Products_1ml_CollectionChanged;
}
var liquid1mlProductList = await this.dataAccessService.LoadEntitiesAsync<Liquid_lml_Dose>();
if (liquid1mlProductList.Count == 0) return;
List<Liquid_lml_Dose_Show> liquid1MlProduct_Shows = new List<Liquid_lml_Dose_Show>();
for (int i = 0; i < liquid1mlProductList.Count; i++)
{
var showItem = new Liquid_lml_Dose_Show()
{
Id = liquid1mlProductList[i].Id,
TipType = liquid1mlProductList[i].TipType,
LiquidName = liquid1mlProductList[i].LiquidName,
Ratio = liquid1mlProductList[i].Ratio,
LiquidParamId = liquid1mlProductList[i].LiquidParamId,
ContainerPlateIndex = liquid1mlProductList[i].ContainerPlateIndex,
PlatformCode = liquid1mlProductList[i].PlatformCode,
AspireHeight = liquid1mlProductList[i].AspireHeight,
DispenHeight = liquid1mlProductList[i].DispenHeight,
LiqLedetec = liquid1mlProductList[i].LiqLedetec,
};
showItem.PropertyChanged += Liquid1mlProduct_Show_PropertyChanged;
liquid1MlProduct_Shows.Add(showItem);
}
Products_1ml_Dose = new ObservableCollection<Liquid_lml_Dose_Show>(liquid1MlProduct_Shows);
Products_1ml_Dose.CollectionChanged += Products_1ml_CollectionChanged;
}
private void Products_1ml_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// 新元素添加时订阅其PropertyChanged事件
if (e.NewItems != null)
{
foreach (Liquid_lml_Dose_Show item in e.NewItems)
{
item.PropertyChanged += Liquid1mlProduct_Show_PropertyChanged;
}
}
// 元素移除时,取消订阅(避免内存泄漏)
if (e.OldItems != null)
{
foreach (Liquid_lml_Dose_Show item in e.OldItems)
{
item.PropertyChanged -= Liquid1mlProduct_Show_PropertyChanged;
}
}
}
// 模型属性变化时触发的处理方法(核心逻辑)
private async void Liquid1mlProduct_Show_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (sender is not Liquid_lml_Dose_Show changedItem) return;
// 仅处理Ratio属性的变化
if (e.PropertyName == nameof(Liquid_lml_Dose_Show.Ratio))
{
if (changedItem.Ratio <= 0)
{
changedItem.Ratio = 1.0000; // 自动修正为0
}
// 强制保留4位小数与XAML的StringFormat=F4保持一致
//changedItem.Ratio = Math.Round(changedItem.Ratio, 4);
var resu = await dataAccessService.LoadEntityAsync<Liquid_lml_Dose>(f => f.Id == changedItem.Id);
if (resu != null)
{
resu.Id = SelectedProduct_1ml_Dose.Id;
resu.TipType = SelectedProduct_1ml_Dose.TipType;
resu.LiquidName = SelectedProduct_1ml_Dose.LiquidName;
resu.Ratio = SelectedProduct_1ml_Dose.Ratio;
resu.LiquidParamId = SelectedProduct_1ml_Dose.LiquidParamId;
resu.ContainerPlateIndex = SelectedProduct_1ml_Dose.ContainerPlateIndex;
resu.PlatformCode = SelectedProduct_1ml_Dose.PlatformCode;
resu.AspireHeight = SelectedProduct_1ml_Dose.AspireHeight;
resu.DispenHeight = SelectedProduct_1ml_Dose.DispenHeight;
resu.LiqLedetec = SelectedProduct_1ml_Dose.LiqLedetec;
await dataAccessService.UpdateEntityAsync<Liquid_lml_Dose>(resu);
}
}
}
private async void AddData_1ml()
{
var liquid1mlProductList = await this.dataAccessService.LoadEntitiesAsync<Liquid_lml_Dose>();
if (liquid1mlProductList.Count == 0) return;
int id = liquid1mlProductList.OrderBy(x => x.Id).ToList().LastOrDefault().Id;
Liquid_lml_Dose_Show liquid = new Liquid_lml_Dose_Show() { Id = id + 1, TipType =3, LiquidName = "water", Ratio = 1.0000, LiquidParamId = 0, ContainerPlateIndex = 0, PlatformCode = 0, AspireHeight = 1600, DispenHeight = 1600, LiqLedetec = 0, };
Liquid_lml_Dose liquid1Ml = new Liquid_lml_Dose() { Id = id + 1, TipType = 3, LiquidName = "water", Ratio = 1.0000, LiquidParamId = 0, ContainerPlateIndex = 0, PlatformCode = 0, AspireHeight = 1600, DispenHeight = 1600, LiqLedetec = 0, };
await dataAccessService.CreateLiquid1mlPipetteProductModel(liquid1Ml);
Products_1ml_Dose.Add(liquid);
}
private async void DeleteData_1ml()
{
if (SelectedProduct_1ml_Dose == null) return;
var resu = await dataAccessService.LoadEntityAsync<Liquid_lml_Dose>(f => f.Id == SelectedProduct_1ml_Dose.Id);
await dataAccessService.DeleteEntityAsync<Liquid_lml_Dose>(resu);
Products_1ml_Dose.Remove(SelectedProduct_1ml_Dose);
}
#endregion
#region 1ml移液枪液体方法
private async void LoadDataFromDb_1ml_React()
{
// 先取消原有集合的事件订阅(避免内存泄漏)
if (Products_1ml_React != null)
{
foreach (var item in Products_1ml_React)
{
item.PropertyChanged -= Liquid1mlProduct_Show_PropertyChanged_React;
}
Products_1ml_React.CollectionChanged -= Products_1ml_CollectionChanged_React;
}
var liquid1mlProductList_React = await this.dataAccessService.LoadEntitiesAsync<Liquid_lml_React>();
if (liquid1mlProductList_React.Count == 0) return;
List<Liquid_lml_React_Show> liquid1MlProduct_Shows_React = new List<Liquid_lml_React_Show>();
for (int i = 0; i < liquid1mlProductList_React.Count; i++)
{
var showItem = new Liquid_lml_React_Show()
{
Id = liquid1mlProductList_React[i].Id,
TipType = liquid1mlProductList_React[i].TipType,
LiquidName = liquid1mlProductList_React[i].LiquidName,
FuncType= liquid1mlProductList_React[i].FuncType,
Ratio = liquid1mlProductList_React[i].Ratio,
LiquidParamId = liquid1mlProductList_React[i].LiquidParamId,
ContainerPlateIndex = liquid1mlProductList_React[i].ContainerPlateIndex,
PlatformCode = liquid1mlProductList_React[i].PlatformCode,
AspireHeight = liquid1mlProductList_React[i].AspireHeight,
DispenHeight = liquid1mlProductList_React[i].DispenHeight,
LiqLedetec = liquid1mlProductList_React[i].LiqLedetec,
};
showItem.PropertyChanged += Liquid1mlProduct_Show_PropertyChanged_React;
liquid1MlProduct_Shows_React.Add(showItem);
}
Products_1ml_React = new ObservableCollection<Liquid_lml_React_Show>(liquid1MlProduct_Shows_React);
Products_1ml_React.CollectionChanged += Products_1ml_CollectionChanged_React;
}
private void Products_1ml_CollectionChanged_React(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
// 新元素添加时订阅其PropertyChanged事件
if (e.NewItems != null)
{
foreach (Liquid_lml_React_Show item in e.NewItems)
{
item.PropertyChanged += Liquid1mlProduct_Show_PropertyChanged_React;
}
}
// 元素移除时,取消订阅(避免内存泄漏)
if (e.OldItems != null)
{
foreach (Liquid_lml_React_Show item in e.OldItems)
{
item.PropertyChanged -= Liquid1mlProduct_Show_PropertyChanged_React;
}
}
}
// 模型属性变化时触发的处理方法(核心逻辑)
private async void Liquid1mlProduct_Show_PropertyChanged_React(object sender, PropertyChangedEventArgs e)
{
if (sender is not Liquid_lml_React_Show changedItem) return;
// 仅处理Ratio属性的变化
if (e.PropertyName == nameof(Liquid_lml_React_Show.Ratio))
{
if (changedItem.Ratio <= 0)
{
changedItem.Ratio = 1.0000; // 自动修正为0
}
// 强制保留4位小数与XAML的StringFormat=F4保持一致
//changedItem.Ratio = Math.Round(changedItem.Ratio, 4);
var resu = await dataAccessService.LoadEntityAsync<Liquid_lml_React>(f => f.Id == changedItem.Id);
if (resu != null)
{
resu.Id = SelectedProduct_1ml_React.Id;
resu.TipType = SelectedProduct_1ml_React.TipType;
resu.LiquidName = SelectedProduct_1ml_React.LiquidName;
resu.FuncType = SelectedProduct_1ml_React.FuncType;
resu.Ratio = SelectedProduct_1ml_React.Ratio;
resu.LiquidParamId = SelectedProduct_1ml_React.LiquidParamId;
resu.ContainerPlateIndex = SelectedProduct_1ml_React.ContainerPlateIndex;
resu.PlatformCode = SelectedProduct_1ml_React.PlatformCode;
resu.AspireHeight = SelectedProduct_1ml_React.AspireHeight;
resu.DispenHeight = SelectedProduct_1ml_React.DispenHeight;
resu.LiqLedetec = SelectedProduct_1ml_React.LiqLedetec;
await dataAccessService.UpdateEntityAsync<Liquid_lml_React>(resu);
}
}
}
private async void AddData_1ml_React()
{
var liquid1mlProductList = await this.dataAccessService.LoadEntitiesAsync<Liquid_lml_React>();
if (liquid1mlProductList.Count == 0) return;
int id = liquid1mlProductList.OrderBy(x => x.Id).ToList().LastOrDefault().Id;
Liquid_lml_React_Show liquid = new Liquid_lml_React_Show() { Id = id + 1, TipType =2, LiquidName = "water", FuncType="开盖取样",Ratio = 1.0000, LiquidParamId = 0, ContainerPlateIndex = 0, PlatformCode = 0, AspireHeight = 1600, DispenHeight = 1600, LiqLedetec = 0, };
Liquid_lml_React liquid1Ml = new Liquid_lml_React() { Id = id + 1, TipType = 2, LiquidName = "water", FuncType = "开盖取样", Ratio = 1.0000, LiquidParamId = 0, ContainerPlateIndex = 0, PlatformCode = 0, AspireHeight = 1600, DispenHeight = 1600, LiqLedetec = 0, };
await dataAccessService.CreateLiquid1mlPipetteProductModel_React(liquid1Ml);
Products_1ml_React.Add(liquid);
}
private async void DeleteData_1ml_React()
{
if (SelectedProduct_1ml_React == null) return;
var resu = await dataAccessService.LoadEntityAsync<Liquid_lml_React>(f => f.Id == SelectedProduct_1ml_React.Id);
await dataAccessService.DeleteEntityAsync<Liquid_lml_React>(resu);
Products_1ml_React.Remove(SelectedProduct_1ml_React);
}
#endregion
}
}