Files
SamplePreSystem-CS/SamplePreSystem.UI/ViewModel/Monitor/MonitorViewModel.cs
2026-04-30 11:34:41 +08:00

550 lines
15 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 CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using MaterialDesignThemes.Wpf;
using Models.Const;
using Models.Models;
using SamplePre.Common;
using SamplePre.Communication.Communication;
using SamplePre.Models;
using SamplePre.Models.Ext;
using SamplePre.ProcessBll.BLL;
using SamplePre.ProcessBll.SampleSequence;
using SamplePre.UIWpf.MonitorManager.chirld;
using SamplePre.UIWpf.SampleManager.chirld;
using SamplePreSystem.UI.Views.MonitorManager;
//using SamplePre.UIWpf.Properties;
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.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Threading;
using static MaterialDesignThemes.Wpf.Theme.ToolBar;
namespace SamplePreSystem.UI.ViewModel.Monitor
{
public partial class MonitorViewModel: ObservableObject
{
SampleSequenceBll sampleSequenceBll = new SampleSequenceBll();
ActionMangerBll actionMangerBll = new ActionMangerBll();
MonitorBll monitorBll = new MonitorBll();
CommunicationBll communicationBll = new CommunicationBll();
SOPManagerBll sopManagerBll = new SOPManagerBll();
/// <summary>
/// 所有动作
/// </summary>
List<sys_action_ext> sys_Actions = new List<sys_action_ext>();
public MonitorViewModel()
{
//所有动作
sys_Actions = actionMangerBll.QuerySysAction();
GetSampleData();
//初始化功能单元
InitWorkUnits();
///启动数据监控线程
UpdateMonitorData();
Test();
//获取当前SOP所有动作列表
GetCurrentSopByID(this.CurrentSopID);
}
/// <summary>
/// 获取当前SOP所有动作列表
/// </summary>
/// <param name="sopID"></param>
public void GetCurrentSopByID(string sopID)
{
CurrentstandardActionList = sopManagerBll.QueryStandardActionByStandardId(sopID)?.OrderBy(p => p.process_no).ToList(); ;
}
/// <summary>
/// 计算进度百分比
/// </summary>
/// <param name="actionID"></param>
public void CalculationProgress(string actionID)
{
if (CurrentstandardActionList.Count <= 0) return;
var item = CurrentstandardActionList.Where(p => p.process_id == actionID && p.ExecFinishFlag == false).FirstOrDefault();
if (item != null)
{
item.ExecFinishFlag = true;
int finishcount = CurrentstandardActionList.Count(p => p.ExecFinishFlag == true);
int totalcount = CurrentstandardActionList.Count;
double percent = (float)finishcount / totalcount;
CurrentPercent = Math.Round(percent * 100,0);
}
}
/// <summary>
/// 当前SOP_ID
/// </summary>
[ObservableProperty]
public string currentSopID = "";
/// <summary>
/// 当前百分比
/// </summary>
[ObservableProperty]
public double currentPercent = 10;
/// <summary>
/// 当前SOP动作
/// </summary>
public List<sys_standard_action_ext> CurrentstandardActionList = new List<sys_standard_action_ext>();
public void Test()
{
SopExecInfo.Add(new SopExecInfo()
{
sapmleName = "DCM固相萃取",
actionName = "加液",
starDate = DateTime.Now,
endDate = DateTime.Now,
state = "完成",
doIngShow = false
});
SopExecInfo.Add(new SopExecInfo()
{
sapmleName = "DCM固相萃取",
actionName = "加液",
starDate = DateTime.Now,
endDate = DateTime.Now,
state = "完成",
doIngShow = false
});
SopExecInfo.Add(new SopExecInfo()
{
sapmleName = "DCM固相萃取",
actionName = "加液",
starDate = DateTime.Now,
endDate = DateTime.Now,
state = "完成",
doIngShow = false
});
SopExecInfo.Add(new SopExecInfo()
{
sapmleName = "DCM固相萃取",
actionName = "离心",
starDate = DateTime.Now,
endDate = DateTime.Now,
state = "执行",
doIngShow = true
});
}
private List<sample_exec_detail_ext> _sampleExecList = new List<sample_exec_detail_ext>();
public List<sample_exec_detail_ext> SampleExecList
{
get { return _sampleExecList; }
set {
SetProperty(ref _sampleExecList, value);
}
}
private string _sopExecData;
public string SopExecData
{
get { return _sopExecData; }
set {
SetProperty(ref _sopExecData, value);
}
}
/// <summary>
/// 获取样本信息
/// </summary>
/// <param name="standID"></param>
private void GetSampleData()
{
List<sample_exec_detail_ext> samples = sampleSequenceBll.GetSampleExecDetails();
SampleExecList = samples;
//设置当前SOP——ID
string standrad_id = samples.FirstOrDefault()?.standrad_id;
if (!string.IsNullOrEmpty(standrad_id))
{
if(standrad_id.Contains(","))
{
CurrentSopID = standrad_id.Split(",")[0];
}
else
{
CurrentSopID = standrad_id;
}
}
}
private List<WorkUnit> _workUnits = new List<WorkUnit>();
public List<WorkUnit> WorkUnits
{
get { return _workUnits; }
set {
SetProperty(ref _workUnits, value);
}
}
/// <summary>
/// 初始化功能岛
/// </summary>
public void InitWorkUnits()
{
var list = SystemConst.dictDatas.Where(p => p.class_id == 2).ToList();
foreach (var item in list)
{
string imgPath = GetIcon(item.id);
var icon = GetIconKind(item.id);
WorkUnits.Add(new WorkUnit() { actionName= "无", state = 0, StateName = "未连通", unitCode = item.id, unitName = item.data_type ,imgPath = imgPath,packIconKind = icon });
}
}
/// <summary>
/// 故障信息
/// </summary>
private ObservableCollection<FaultInfo> faultInfos = new ObservableCollection<FaultInfo>();
public ObservableCollection<FaultInfo> FaultInfos
{
get { return faultInfos; }
set {
SetProperty(ref faultInfos, value);
}
}
/// <summary>
/// 更新监控数据
/// </summary>
public void UpdateMonitorData()
{
//if (tileGroup2.Items.Count <= 0) return;
Task.Factory.StartNew(async () => {
try
{
while (true)
{
//ushort[] data1 = SystemConst.MasterPLC.ReadArraysShort(100, 1000, 1000);
ushort[] data1 = communicationBll.ReadSateData(100, 1000, 1000);
//跨线程
Application.Current?.Dispatcher.Invoke(() =>
{
FaultInfos.Clear();
});
//刷新功能岛
UpdateWorkUnit(data1);
//刷新样品列表
GetSampleData();
await Task.Delay(3000);
}
}
catch (Exception ex)
{
LoggerHelper.Logger.Error("更新监控数据异常退出:" + ex.Message + ex.StackTrace);
}
});
}
/// <summary>
/// 更新功能岛信息
/// </summary>
/// <param name="data1"></param>
public void UpdateWorkUnit(ushort[] data1)
{
//WorkUnits
if (data1 != null && data1.Length > 0)
{
foreach(var workUnit in WorkUnits)
{
var unit_actions = sys_Actions.Where(p => p.action_unit == workUnit.unitCode).ToList();
foreach (var action in unit_actions)
{
int plcCode = int.Parse(action.plc_type);
ushort state = data1[plcCode];//动作的状态码
//UCFunUnit uCFunUnit = this.dictUnits[unitCode];
if(state >= 2)
{
//处理sop执行状态计算执行百分比
CalculationProgress(action.id);
}
if (state >= workUnit.state || state == 2)
{ //发生改变再修改
if (workUnit.state != state || workUnit.actionName != action.action_name)
{
workUnit.state = state;
workUnit.StateName = SetStateData(state);
workUnit.RunColor = WorkUnit.GetStateColor(state);
workUnit.actionName = state < 2 ? "无" : action.action_name;
}
}
//如果动作一样,状态发生变化,就要修改
if (workUnit.state != state && workUnit.actionName == action.action_name)
{
workUnit.state = state;
workUnit.StateName = SetStateData(state);
workUnit.RunColor = WorkUnit.GetStateColor(state);
workUnit.actionName = state < 2 ? "无" : action.action_name;
}
}
//添加故障信息
if (workUnit.state == 0)
{
Application.Current?.Dispatcher.BeginInvoke(new Action(() => {
FaultInfos.Add(new FaultInfo { FaultName = workUnit.unitName + " - 未连通", FaultType = FaultType.Warning });
}), DispatcherPriority.Normal);
}
}
}
}
public string GetIcon(string code)
{
switch (code)
{
case "300":
return "/Assets/机器人1.png";//Resources.机器人1;
case "301":
return "/Assets/分液1.png";//Resources.分液1;
case "302":
return "/Assets/离心机1.png";//Resources.离心机1;
case "303":
return "/Assets/氮吹1.png";
case "304":
return "/Assets/固相萃取1.png";//Resources.固相萃取1;
default:
return "/Assets/机器人1.png";//Resources.机器人1;
}
}
public PackIconKind GetIconKind(string code)
{
switch (code)
{
case "300":
return PackIconKind.RobotIndustrialOutline;//Resources.机器人1;
case "301":
return PackIconKind.TestTube;//Resources.分液1;
case "302":
return PackIconKind.GoogleCirclesCommunities;//Resources.离心机1;
case "303":
return PackIconKind.GoogleCirclesGroup;
case "304":
return PackIconKind.InboxMultiple;//Resources.固相萃取1;
default:
return PackIconKind.ThermometerWater; //Resources.机器人1;
}
}
public string SetStateData(int state)
{
try
{
if (state == 0)
{
return "未连接";
}
if (state == 1)
{
return "待机";
}
else if (state == 2)
{
return "运行";
}
else if (state == 3)
{
return "完成";
}
return "未连接";
}
catch (Exception ex)
{
LoggerHelper.Logger.Error(ex.Message + ex.StackTrace);
return "未连接";
}
}
SocketClient client;
/// <summary>
/// 启动socket
/// </summary>
/// <returns></returns>
public async Task StarClientAsync()
{
client = new SocketClient();
//回调函数
client.ReceiveMsgAction = UpdateSopExecInfo;
await client.StartClientAsync();
}
public void SendSocketTest(string msg)
{
client.SendMsgAsync(msg);
}
/// <summary>
/// 更新sop执行信息
/// </summary>
/// <param name="receiveData"></param>
public void UpdateSopExecInfo(string receiveData)
{
SopExecData += receiveData + "\r\n";
}
/// <summary>
/// sop执行信息
/// </summary>
private List<SopExecInfo> sopExecInfo = new List<SopExecInfo>();
public List<SopExecInfo> SopExecInfo
{
get { return sopExecInfo; }
set { sopExecInfo = value; }
}
/// <summary>
/// 打开详情窗口
/// </summary>
[RelayCommand]
public void HLinkDetailClick(string unitName)
{
var param = unitName;
var item = SystemConst.dictDatas.Where(p => p.data_type == param.ToString() && p.class_id == 2).FirstOrDefault();
if (item != null)
{
UnitDetailWindow frm = new UnitDetailWindow(item.id);
frm.ShowDialog();
}
}
/// <summary>
/// 打开明细进度窗口
/// </summary>
[RelayCommand]
public void MouseDoubleDetailWindow()
{
SampleDetailWindow frm = new SampleDetailWindow();
frm.ShowDialog();
}
}
}