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
{
///
/// 样品瓶状态
///
public enum SampleBottleStateEnum
{
///
/// 0:还未投料
///
Empty = 0,
///
/// 正在投料中
///
IsDosing = 1,
DoseFinish = 2,
///
/// 1:高温反应中
///
HighTemperaturReact = 3,
///
/// 2:低温反应中
///
LowTemperaturReact = 4,
///
///穿刺取样中
///
PunctureSampling = 5,
///
/// 开盖取样中
///
OpenLidSampling = 6,
///
/// 穿刺补液
///
PunctureAddLiquid = 7,
///
/// 开盖补液
///
OpenLidAddLiquid = 8,
///
/// 稀释中
///
Dilute = 9,
///
/// 过滤中
///
Filter = 10,
}
///
/// 反应温度选择
///
public enum SampleBottleReactTemperatureEnum
{
高温反应,
低温反应,
无,
}
///
/// 反应模块的操作类型
///
public enum ReactOperationEnum
{
取样,
补液,
无,
}
///
/// 取样方式
///
public enum SampleMethod
{
穿刺取样,
开盖取样,
}
///
/// 补液方式
///
public enum AddLiquidMethod
{
穿刺补液,
开盖补液,
}
///
/// 稀释方式
///
public enum DiluteMethod
{
移液枪稀释,
穿刺针稀释,
加样针稀释,
}
///
/// 样品瓶盖子的状态
///
public enum SampleBottleLidStateEnum
{
Close,
Open,
}
///
/// 样品瓶类型
///
public enum SampleBottleTypeEnum
{
_5mL = 1,
_12mL = 2,
}
[Serializable]
///
/// 样品瓶属性
///
public class SampleBottleModel : ObservableObject
{
private long sampleSeqId;
public long SampleSeqId
{
get { return sampleSeqId; }
set { SetProperty(ref sampleSeqId, value); }
}
private SampleBottleTypeEnum sampleBottleType = SampleBottleTypeEnum._5mL;
///
/// 样品瓶类型 5ML/12ML
///
public SampleBottleTypeEnum SampleBottleType
{
get { return sampleBottleType; }
set { SetProperty(ref sampleBottleType, value); }
}
private string _boxsn = string.Empty;
///
/// 样品瓶所在的工装的二维码信息
///
public string BoxSNCode
{
get => _boxsn;
set { SetProperty(ref _boxsn, value); }
}
private string _sn = string.Empty;
///
/// 样品瓶的二维码信息
///
public string SNCode
{
get => _sn;
set { SetProperty(ref _sn, value); }
}
private bool _haveBottle = false;
///
/// 是否有样品瓶子
///
public bool HaveBottle
{
get => _haveBottle;
set { SetProperty(ref _haveBottle, value); }
}
private bool bdosefinish = false;
///
/// 是否配置完成
///
public bool bDoseFinish
{
get { return bdosefinish; }
set { bdosefinish = value; }
}
private int _posId_inbox = 1;
///
/// 样品瓶在工装中的第几个位置(1-12)
///
public int PosId_InBox
{
get => _posId_inbox;
set { SetProperty(ref _posId_inbox, value); }
}
#region 投料站
private string _sampleContentName = string.Empty;
///
/// 样品瓶投料结果内容名称
///
public string SampleContentName
{
get { return _sampleContentName; }
set { SetProperty(ref _sampleContentName, value); }
}
private SampleBottleStateEnum _sampleBottleState = SampleBottleStateEnum.Empty;
///
/// 样品瓶状态 正在哪一步操作中
///
public SampleBottleStateEnum SampleBoxState
{
get => _sampleBottleState;
set
{
if (_sampleBottleState != value)
{
_sampleBottleState = value;
OnPropertyChanged(nameof(SampleBoxState));
OnPropertyChanged(nameof(DisplayColor_Dose));
OnPropertyChanged(nameof(DisplayColor_React));
}
}
}
///
/// 样品瓶状态,在投料站中展示颜色
///
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");
}
}
}
///
/// 样品瓶状态,在反应站展示颜色
///
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;
///
/// 样品瓶盖子的状态
///
public SampleBottleLidStateEnum SampleBottleLidState
{
get => _sampleBottleLidState;
set => _sampleBottleLidState = value;
}
private ObservableCollection _materialDoseFlowList = new ObservableCollection();
///
/// 样品瓶中投料站流程集合,用于显示datagridView控件中
///
public ObservableCollection 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;
///
/// 预估投料耗时时间,单位min
///
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;
///
/// 预估原样瓶配置剩余时间,单位min
///
public double RemainDuration
{
get { return remainDuration; }
set
{
SetProperty(ref remainDuration, value);
OnPropertyChanged(nameof(ProgressPercentage));
}
}
///
/// 用于进度绑定的属性
///
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;
///
/// 样品瓶在高温模块的编号(1-4)
///
public int HighTempModuleNo
{
get => _highTempModuleNo;
set => _highTempModuleNo = value;
}
private int _pos_inhightemperatur = 0;
///
/// 样品瓶在高温模块中的位置(1-24)
///
public int Pos_InHighTemperatur
{
get => _pos_inhightemperatur;
set => _pos_inhightemperatur = value;
}
private int _lowTempModuleNo = 0;
///
/// 样品瓶在低温模块的编号(1-2)
///
public int LowTempModuleNo
{
get => _lowTempModuleNo;
set => _lowTempModuleNo = value;
}
private int _pos_inlowtemperatur = 0;
///
/// 样品瓶在低温模块中的位置(1-24)
///
public int Pos_InLowTemperatur
{
get => _pos_inlowtemperatur;
set => _pos_inlowtemperatur = value;
}
private SampleBottleReactTemperatureEnum reactTemperatureType = SampleBottleReactTemperatureEnum.高温反应;
///
/// 反应温度方式
///
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.穿刺取样;
///
/// 取样方式
///
public SampleMethod SampleMethod
{
get { return samplemethod; }
set
{
SetProperty(ref samplemethod, value);
}
}
private AddLiquidMethod addliquidmethod = AddLiquidMethod.穿刺补液;
///
/// 补液方式
///
public AddLiquidMethod AddLiquidType
{
get { return addliquidmethod; }
set
{
SetProperty(ref addliquidmethod, value);
}
}
private double height = 0;
///
/// 穿刺取样高度
///
public double PunchHeight
{
get { return height; }
set { SetProperty(ref height, value); }
}
private ObservableCollection sampleFunctionFlowList = new ObservableCollection();
///
/// 取样流程
///
public ObservableCollection SampleFunctionFlowList
{
get { return sampleFunctionFlowList; }
set { SetProperty(ref sampleFunctionFlowList, value); }
}
private ObservableCollection _addLiquidFlowList = new ObservableCollection();
///
/// 加液流程集合,用于显示datagridView控件中
///
public ObservableCollection AddLiquidFunctionFlowList
{
get { return _addLiquidFlowList; }
set { SetProperty(ref _addLiquidFlowList, value); }
}
#endregion
}
}