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

341 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}
}