341 lines
16 KiB
C#
341 lines
16 KiB
C#
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
|
||
}
|
||
}
|