520 lines
16 KiB
C#
520 lines
16 KiB
C#
using Common.Models;
|
||
using CommunityToolkit.Mvvm.ComponentModel;
|
||
using System;
|
||
using System.Collections.Generic;
|
||
using System.Collections.ObjectModel;
|
||
using System.Collections.Specialized;
|
||
using System.Linq;
|
||
using System.Text;
|
||
using System.Threading.Tasks;
|
||
using System.Windows.Media;
|
||
using System.Windows.Shapes;
|
||
using System.Xml.Serialization;
|
||
|
||
namespace Common.Models
|
||
{
|
||
/// <summary>
|
||
/// 样品瓶状态
|
||
/// </summary>
|
||
public enum SampleBottleStateEnum
|
||
{
|
||
/// <summary>
|
||
/// 0:还未投料
|
||
/// </summary>
|
||
Empty = 0,
|
||
/// <summary>
|
||
/// 正在投料中
|
||
/// </summary>
|
||
IsDosing = 1,
|
||
|
||
DoseFinish = 2,
|
||
|
||
/// <summary>
|
||
/// 1:高温反应中
|
||
/// </summary>
|
||
HighTemperaturReact = 3,
|
||
/// <summary>
|
||
/// 2:低温反应中
|
||
/// </summary>
|
||
LowTemperaturReact = 4,
|
||
/// <summary>
|
||
///穿刺取样中
|
||
/// </summary>
|
||
PunctureSampling = 5,
|
||
/// <summary>
|
||
/// 开盖取样中
|
||
/// </summary>
|
||
OpenLidSampling = 6,
|
||
/// <summary>
|
||
/// 穿刺补液
|
||
/// </summary>
|
||
PunctureAddLiquid = 7,
|
||
/// <summary>
|
||
/// 开盖补液
|
||
/// </summary>
|
||
OpenLidAddLiquid = 8,
|
||
/// <summary>
|
||
/// 稀释中
|
||
/// </summary>
|
||
Dilute = 9,
|
||
/// <summary>
|
||
/// 过滤中
|
||
/// </summary>
|
||
Filter = 10,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 反应温度选择
|
||
/// </summary>
|
||
public enum SampleBottleReactTemperatureEnum
|
||
{
|
||
高温反应,
|
||
低温反应,
|
||
无,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 反应模块的操作类型
|
||
/// </summary>
|
||
public enum ReactOperationEnum
|
||
{
|
||
取样,
|
||
补液,
|
||
无,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 取样方式
|
||
/// </summary>
|
||
public enum SampleMethod
|
||
{
|
||
穿刺取样,
|
||
开盖取样,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 补液方式
|
||
/// </summary>
|
||
public enum AddLiquidMethod
|
||
{
|
||
穿刺补液,
|
||
开盖补液,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 稀释方式
|
||
/// </summary>
|
||
public enum DiluteMethod
|
||
{
|
||
移液枪稀释,
|
||
穿刺针稀释,
|
||
加样针稀释,
|
||
}
|
||
|
||
|
||
/// <summary>
|
||
/// 样品瓶盖子的状态
|
||
/// </summary>
|
||
public enum SampleBottleLidStateEnum
|
||
{
|
||
Close,
|
||
Open,
|
||
}
|
||
|
||
/// <summary>
|
||
/// 样品瓶类型
|
||
/// </summary>
|
||
public enum SampleBottleTypeEnum
|
||
{
|
||
_5mL = 1,
|
||
_12mL = 2,
|
||
}
|
||
|
||
|
||
[Serializable]
|
||
/// <summary>
|
||
/// 样品瓶属性
|
||
/// </summary>
|
||
public class SampleBottleModel : ObservableObject
|
||
{
|
||
private long sampleSeqId;
|
||
public long SampleSeqId
|
||
{
|
||
get { return sampleSeqId; }
|
||
set { SetProperty(ref sampleSeqId, value); }
|
||
}
|
||
|
||
private SampleBottleTypeEnum sampleBottleType = SampleBottleTypeEnum._5mL;
|
||
/// <summary>
|
||
/// 样品瓶类型 5ML/12ML
|
||
/// </summary>
|
||
public SampleBottleTypeEnum SampleBottleType
|
||
{
|
||
get { return sampleBottleType; }
|
||
set { SetProperty(ref sampleBottleType, value); }
|
||
}
|
||
|
||
private string _boxsn = string.Empty;
|
||
/// <summary>
|
||
/// 样品瓶所在的工装的二维码信息
|
||
/// </summary>
|
||
public string BoxSNCode
|
||
{
|
||
get => _boxsn;
|
||
set { SetProperty(ref _boxsn, value); }
|
||
}
|
||
|
||
private string _sn = string.Empty;
|
||
/// <summary>
|
||
/// 样品瓶的二维码信息
|
||
/// </summary>
|
||
public string SNCode
|
||
{
|
||
get => _sn;
|
||
set { SetProperty(ref _sn, value); }
|
||
}
|
||
|
||
private bool _haveBottle = false;
|
||
/// <summary>
|
||
/// 是否有样品瓶子
|
||
/// </summary>
|
||
public bool HaveBottle
|
||
{
|
||
get => _haveBottle;
|
||
set { SetProperty(ref _haveBottle, value); }
|
||
}
|
||
|
||
private bool bdosefinish = false;
|
||
/// <summary>
|
||
/// 是否配置完成
|
||
/// </summary>
|
||
public bool bDoseFinish
|
||
{
|
||
get { return bdosefinish; }
|
||
set { bdosefinish = value; }
|
||
}
|
||
|
||
private int _posId_inbox = 1;
|
||
/// <summary>
|
||
/// 样品瓶在工装中的第几个位置(1-12)
|
||
/// </summary>
|
||
public int PosId_InBox
|
||
{
|
||
get => _posId_inbox;
|
||
set { SetProperty(ref _posId_inbox, value); }
|
||
}
|
||
|
||
#region 投料站
|
||
private string _sampleContentName = string.Empty;
|
||
/// <summary>
|
||
/// 样品瓶投料结果内容名称
|
||
/// </summary>
|
||
public string SampleContentName
|
||
{
|
||
get { return _sampleContentName; }
|
||
set { SetProperty(ref _sampleContentName, value); }
|
||
}
|
||
|
||
private SampleBottleStateEnum _sampleBottleState = SampleBottleStateEnum.Empty;
|
||
/// <summary>
|
||
/// 样品瓶状态 正在哪一步操作中
|
||
/// </summary>
|
||
public SampleBottleStateEnum SampleBoxState
|
||
{
|
||
get => _sampleBottleState;
|
||
set
|
||
{
|
||
if (_sampleBottleState != value)
|
||
{
|
||
_sampleBottleState = value;
|
||
OnPropertyChanged(nameof(SampleBoxState));
|
||
OnPropertyChanged(nameof(DisplayColor_Dose));
|
||
OnPropertyChanged(nameof(DisplayColor_React));
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 样品瓶状态,在投料站中展示颜色
|
||
/// </summary>
|
||
public Brush DisplayColor_Dose
|
||
{
|
||
get
|
||
{
|
||
switch (SampleBoxState)
|
||
{
|
||
case SampleBottleStateEnum.Empty:
|
||
if (HaveBottle) return (Brush)new BrushConverter().ConvertFrom("#aff0b3");
|
||
else return (Brush)new BrushConverter().ConvertFrom("#dcd8d8"); //return "#d1caca".FromHex(); // 未配置:白色
|
||
case SampleBottleStateEnum.IsDosing:
|
||
return (Brush)new BrushConverter().ConvertFrom("#f6ee73"); // 状态:黄色
|
||
case SampleBottleStateEnum.HighTemperaturReact:
|
||
case SampleBottleStateEnum.LowTemperaturReact:
|
||
return (Brush)new BrushConverter().ConvertFrom("#e3612e"); // 状态:橘色
|
||
case SampleBottleStateEnum.OpenLidSampling:
|
||
case SampleBottleStateEnum.PunctureSampling:
|
||
return (Brush)new BrushConverter().ConvertFrom("#5f84ee"); // 紫色
|
||
case SampleBottleStateEnum.Dilute:
|
||
case SampleBottleStateEnum.Filter:
|
||
return (Brush)new BrushConverter().ConvertFrom("#61b2f5"); // 蓝色
|
||
default:
|
||
if (HaveBottle) return (Brush)new BrushConverter().ConvertFrom("#aff0b3");
|
||
else return (Brush)new BrushConverter().ConvertFrom("#dcd8d8");
|
||
}
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 样品瓶状态,在反应站展示颜色
|
||
/// </summary>
|
||
public Brush DisplayColor_React
|
||
{
|
||
get
|
||
{
|
||
switch (SampleBoxState)
|
||
{
|
||
case SampleBottleStateEnum.Empty:
|
||
if (HaveBottle) return (Brush)new BrushConverter().ConvertFrom("#aff0b3");
|
||
else return (Brush)new BrushConverter().ConvertFrom("#dcd8d8"); //return "#d1caca".FromHex(); // 未配置:白色
|
||
//case SampleBottleStateEnum.IsDosing:
|
||
// return (Brush)new BrushConverter().ConvertFrom("#f6ee73"); // 状态:黄色
|
||
case SampleBottleStateEnum.HighTemperaturReact:
|
||
case SampleBottleStateEnum.LowTemperaturReact:
|
||
return (Brush)new BrushConverter().ConvertFrom("#e3612e"); // 状态:橘色
|
||
case SampleBottleStateEnum.OpenLidSampling:
|
||
case SampleBottleStateEnum.PunctureSampling:
|
||
return (Brush)new BrushConverter().ConvertFrom("#5f84ee"); // 紫色
|
||
case SampleBottleStateEnum.Dilute:
|
||
case SampleBottleStateEnum.Filter:
|
||
return (Brush)new BrushConverter().ConvertFrom("#61b2f5"); // 蓝色
|
||
default:
|
||
if (HaveBottle) return (Brush)new BrushConverter().ConvertFrom("#aff0b3");
|
||
else return (Brush)new BrushConverter().ConvertFrom("#dcd8d8");
|
||
}
|
||
}
|
||
}
|
||
|
||
private SampleBottleLidStateEnum _sampleBottleLidState = SampleBottleLidStateEnum.Close;
|
||
/// <summary>
|
||
/// 样品瓶盖子的状态
|
||
/// </summary>
|
||
public SampleBottleLidStateEnum SampleBottleLidState
|
||
{
|
||
get => _sampleBottleLidState;
|
||
set => _sampleBottleLidState = value;
|
||
}
|
||
|
||
private ObservableCollection<MaterialDoseFunctionFlow> _materialDoseFlowList = new ObservableCollection<MaterialDoseFunctionFlow>();
|
||
/// <summary>
|
||
/// 样品瓶中投料站流程集合,用于显示datagridView控件中
|
||
/// </summary>
|
||
public ObservableCollection<MaterialDoseFunctionFlow> MaterialDoseFlowList
|
||
{
|
||
get
|
||
{
|
||
return _materialDoseFlowList;
|
||
}
|
||
set
|
||
{
|
||
// 设置新值
|
||
if (value != null && SetProperty(ref _materialDoseFlowList, value))
|
||
{
|
||
// 先取消旧集合的事件订阅
|
||
_materialDoseFlowList.CollectionChanged -= LiquidFlowList_CollectionChanged;
|
||
// 订阅新集合的事件
|
||
_materialDoseFlowList.CollectionChanged += LiquidFlowList_CollectionChanged;
|
||
// 手动触发一次计算
|
||
LiquidFlowList_CollectionChanged(this, null);
|
||
}
|
||
}
|
||
}
|
||
|
||
#region 预估时间相关
|
||
|
||
private double _estimatedDuration = 0;
|
||
/// <summary>
|
||
/// 预估投料耗时时间,单位min
|
||
/// </summary>
|
||
public double EstimatedDuration
|
||
{
|
||
get => _estimatedDuration;
|
||
set
|
||
{
|
||
SetProperty(ref _estimatedDuration, value, nameof(EstimatedDuration));
|
||
{
|
||
if (remainDuration == 0) // 假设初始值为0,代表未初始化
|
||
{
|
||
remainDuration = value;
|
||
OnPropertyChanged(nameof(RemainDuration));
|
||
}
|
||
OnPropertyChanged(nameof(ProgressPercentage));
|
||
}
|
||
}
|
||
}
|
||
|
||
// 液体流程集合项变化时更新时间
|
||
private void LiquidFlowList_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
|
||
{
|
||
EstimatedDuration = 1 * _materialDoseFlowList.Count;
|
||
}
|
||
|
||
private double remainDuration = 0;
|
||
/// <summary>
|
||
/// 预估原样瓶配置剩余时间,单位min
|
||
/// </summary>
|
||
public double RemainDuration
|
||
{
|
||
get { return remainDuration; }
|
||
set
|
||
{
|
||
SetProperty(ref remainDuration, value);
|
||
OnPropertyChanged(nameof(ProgressPercentage));
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 用于进度绑定的属性
|
||
/// </summary>
|
||
public double ProgressPercentage
|
||
{
|
||
get
|
||
{
|
||
if (EstimatedDuration <= 0) return 1.0;
|
||
double usedRatio = 1.0 - (RemainDuration / (EstimatedDuration)); // 注意单位转换
|
||
return Math.Max(0, Math.Min(1, usedRatio));
|
||
}
|
||
}
|
||
#endregion
|
||
|
||
public SampleBottleModel()
|
||
{
|
||
// ObservableCollection 会在项添加 / 删除时触发 CollectionChanged 事件,需在 ReactBottleModel 中订阅该事件,确保集合项变化时重新计算时间。
|
||
// 初始化集合时订阅 CollectionChanged 事件
|
||
_materialDoseFlowList.CollectionChanged += LiquidFlowList_CollectionChanged;
|
||
|
||
}
|
||
|
||
#endregion
|
||
|
||
#region 反应站
|
||
private int _highTempModuleNo = 0;
|
||
/// <summary>
|
||
/// 样品瓶在高温模块的编号(1-4)
|
||
/// </summary>
|
||
public int HighTempModuleNo
|
||
{
|
||
get => _highTempModuleNo;
|
||
set => _highTempModuleNo = value;
|
||
}
|
||
|
||
private int _pos_inhightemperatur = 0;
|
||
/// <summary>
|
||
/// 样品瓶在高温模块中的位置(1-24)
|
||
/// </summary>
|
||
public int Pos_InHighTemperatur
|
||
{
|
||
get => _pos_inhightemperatur;
|
||
set => _pos_inhightemperatur = value;
|
||
}
|
||
|
||
private int _lowTempModuleNo = 0;
|
||
/// <summary>
|
||
/// 样品瓶在低温模块的编号(1-2)
|
||
/// </summary>
|
||
public int LowTempModuleNo
|
||
{
|
||
get => _lowTempModuleNo;
|
||
set => _lowTempModuleNo = value;
|
||
}
|
||
|
||
private int _pos_inlowtemperatur = 0;
|
||
/// <summary>
|
||
/// 样品瓶在低温模块中的位置(1-24)
|
||
/// </summary>
|
||
public int Pos_InLowTemperatur
|
||
{
|
||
get => _pos_inlowtemperatur;
|
||
set => _pos_inlowtemperatur = value;
|
||
}
|
||
|
||
private SampleBottleReactTemperatureEnum reactTemperatureType = SampleBottleReactTemperatureEnum.高温反应;
|
||
/// <summary>
|
||
/// 反应温度方式
|
||
/// </summary>
|
||
public SampleBottleReactTemperatureEnum ReactTemperatureType
|
||
{
|
||
get { return reactTemperatureType; }
|
||
set
|
||
{
|
||
SetProperty(ref reactTemperatureType, value);
|
||
OnPropertyChanged(nameof(CurrentTemperatureModel));
|
||
}
|
||
}
|
||
|
||
private SampleBottleTemperatureModel tempmodel = new SampleBottleTemperatureModel();
|
||
public SampleBottleTemperatureModel CurrentTemperatureModel
|
||
{
|
||
get => tempmodel;
|
||
set => SetProperty(ref tempmodel, value);
|
||
}
|
||
|
||
private SampleMethod samplemethod = SampleMethod.穿刺取样;
|
||
/// <summary>
|
||
/// 取样方式
|
||
/// </summary>
|
||
public SampleMethod SampleMethod
|
||
{
|
||
get { return samplemethod; }
|
||
set
|
||
{
|
||
SetProperty(ref samplemethod, value);
|
||
}
|
||
}
|
||
|
||
private AddLiquidMethod addliquidmethod = AddLiquidMethod.穿刺补液;
|
||
/// <summary>
|
||
/// 补液方式
|
||
/// </summary>
|
||
public AddLiquidMethod AddLiquidType
|
||
{
|
||
get { return addliquidmethod; }
|
||
set
|
||
{
|
||
SetProperty(ref addliquidmethod, value);
|
||
}
|
||
}
|
||
|
||
private double height = 0;
|
||
/// <summary>
|
||
/// 穿刺取样高度
|
||
/// </summary>
|
||
public double PunchHeight
|
||
{
|
||
get { return height; }
|
||
set { SetProperty(ref height, value); }
|
||
}
|
||
|
||
|
||
private ObservableCollection<ReactSampleFunctionFlow> sampleFunctionFlowList = new ObservableCollection<ReactSampleFunctionFlow>();
|
||
/// <summary>
|
||
/// 取样流程
|
||
/// </summary>
|
||
public ObservableCollection<ReactSampleFunctionFlow> SampleFunctionFlowList
|
||
{
|
||
get { return sampleFunctionFlowList; }
|
||
set { SetProperty(ref sampleFunctionFlowList, value); }
|
||
}
|
||
|
||
private ObservableCollection<AddLiquidFunctionFlow> _addLiquidFlowList = new ObservableCollection<AddLiquidFunctionFlow>();
|
||
/// <summary>
|
||
/// 加液流程集合,用于显示datagridView控件中
|
||
/// </summary>
|
||
public ObservableCollection<AddLiquidFunctionFlow> AddLiquidFunctionFlowList
|
||
{
|
||
get { return _addLiquidFlowList; }
|
||
set { SetProperty(ref _addLiquidFlowList, value); }
|
||
}
|
||
#endregion
|
||
}
|
||
}
|