using CommunityToolkit.Mvvm.ComponentModel; using SunlightAggregationTerminal.Class; using SunlightAggregationTerminal.Models; using System.Collections.ObjectModel; using System.Reflection.PortableExecutable; using System.Text.Json; using TouchSocket.Core; namespace SunlightAggregationTerminal; public class InfoMachineItem { public string? inf { get; set; } }public partial class InfoDetail : ContentPage { public static ObservableCollection InfoProbuctItems { get; set; } = new(); public static ObservableCollection InfoDyelotDetailsItems { get; set; } = new(); public static ObservableCollection InfoMachineItems { get; set; } = new(); public static InfoItem infoItem=new(); private DateTime _lastRefreshTime = DateTime.MinValue; public InfoDetail(InfoItem item) { InitializeComponent(); this.BindingContext = item; infoItem = item; myCardCollectionView_.Refreshing += (sender, e) => { // 防抖判断:如果距离上次刷新不足5秒,直接取消本次操作 if ((DateTime.Now - _lastRefreshTime).TotalSeconds < 1) { myCardCollectionView_.IsRefreshing = false; return; } try { // 更新刷新时间 _lastRefreshTime = DateTime.Now; InfoMachine(); myCardCollectionView_.IsRefreshing = false; } catch (Exception) { } }; } private void ContentPage_Loaded(object sender, EventArgs e) { InfoMachine(); InfoMachineItems.Clear(); InfoProbuctItems.Clear(); InfoDyelotDetailsItems.Clear(); CardCollectionView_inf.ItemsSource = InfoMachineItems; CardCollectionView_machine.ItemsSource = InfoProbuctItems; CardCollectionView_history.ItemsSource = InfoDyelotDetailsItems; } private void InfoMachine() { Dictionary data_ = new Dictionary(); data_.Add("Command", "InfoMachine"); if (infoItem.Model == "252") { data_.Add("Type", "10"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "252-2T") { data_.Add("Type", "10"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "252RB") { data_.Add("Type", "10"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "252RDRM") { data_.Add("Type", "12"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "242W") { data_.Add("Type", "10"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "302") { data_.Add("Type", "20"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "303") { data_.Add("Type", "20"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } else if (infoItem.Model == "303PDW") { data_.Add("Type", "20"); data_.Add("Field", "*"); data_.Add("MachinName", infoItem.Machine!); Query_Command(data_.ToJsonString()); } } //设备信息 private void Button_real(object sender, EventArgs e) { _real.IsVisible = true; _machine.IsVisible = false; _history.IsVisible = false; _control.IsVisible = false; } //设备内容 private async void Button_machine(object sender, EventArgs e) { _real.IsVisible = false; _machine.IsVisible = true; _history.IsVisible = false; _control.IsVisible = false; if (infoItem.Model == "252" || infoItem.Model == "252-2T" || infoItem.Model == "252RB" || infoItem.Model == "242W" || infoItem.Model == "252RDRM") { await DisplayAlertAsync("限制", "当前功能暂不可用", "是"); return; } if (InfoProbuctItems.Count == 0) { Dictionary data_ = new Dictionary(); data_.Add("Command", "InfoMachinePipes"); data_.Add("MachinName", infoItem.Machine!); Query_Probuct(data_.ToJsonString()); } } //历史 private void Button_history(object sender, EventArgs e) { _real.IsVisible = false; _machine.IsVisible = false; _history.IsVisible = true; _control.IsVisible = false; } //远程 private async void Button_control(object sender, EventArgs e) { _real.IsVisible = false; _machine.IsVisible = false; _history.IsVisible = false; _control.IsVisible = true; await DisplayAlertAsync("限制", "当前功能暂不可用", "是"); } //发送请求 public async void Query_Command(string dat) { LoadingIndicator.IsVisible = true; InfoMachineItems.Clear(); DataReceived.Transmit(dat); // 创建一个 秒的延时任务 Task delayTask = Task.Delay(10000); // 创建一个监测任务,不断检查变量 Task monitorTask = Task.Run(async () => { while (InfoMachineItems.Count == 0) { // 每隔 100 毫秒检查一次,避免 CPU 占用过高 await Task.Delay(1000); } }); // 使用 Task.WhenAny 等待任意一个任务完成 await Task.WhenAny(delayTask, monitorTask); LoadingIndicator.IsVisible = false; } public async void Query_Probuct(string dat) { LoadingIndicator.IsVisible = true; InfoProbuctItems.Clear(); DataReceived.Transmit(dat); // 创建一个 秒的延时任务 Task delayTask = Task.Delay(10000); // 创建一个监测任务,不断检查变量 Task monitorTask = Task.Run(async () => { while (InfoProbuctItems.Count == 0) { // 每隔 100 毫秒检查一次,避免 CPU 占用过高 await Task.Delay(1000); } }); // 使用 Task.WhenAny 等待任意一个任务完成 await Task.WhenAny(delayTask, monitorTask); LoadingIndicator.IsVisible = false; } public static void Info_data(string dat, string id) { var data = JsonSerializer.Deserialize>>(dat)!; //助剂原料查询 if (id == "00") { foreach (var item in data!) { ProbuctItem probuctItem = new ProbuctItem(); probuctItem.ProductCode = item.GetValue("ProductCode").ToString()!; probuctItem.ProductName = item.GetValue("ProductName").ToString()!; if (item.GetValue("Enabled").ToString()! == "1") { probuctItem.ProductState = "启用"; } else { probuctItem.ProductState = "停用"; } if (item!.TryGetValue("No", out var _No) && _No != null) { probuctItem.ProductInf = "管路:" + _No + "\n"; } if (item!.TryGetValue("MinLimit", out var _MinLimit) && _MinLimit != null) { probuctItem.ProductInf = probuctItem.ProductInf+"最少量:" + _MinLimit + "g\n"; } if (item!.TryGetValue("MaxLimit", out var _MaxLimit) && _MaxLimit != null) { probuctItem.ProductInf = probuctItem.ProductInf + "最大量:" + _MinLimit + "g\n"; } if (item!.TryGetValue("Conc", out var _Conc) && _Conc != null) { probuctItem.ProductInf = probuctItem.ProductInf + "浓度:" + _Conc + "\n"; } if (item!.TryGetValue("Enabled", out var _Gravity) && _Gravity != null) { probuctItem.ProductInf = probuctItem.ProductInf + "比重:" + _Gravity; } InfoProbuctItems.Add(probuctItem); } if (InfoProbuctItems.Count == 0) InfoProbuctItems.Add(new ProbuctItem()); } //染料查询 else if (id == "10") { foreach (var item in data!) { string inf_ = "染机:" + item.GetValue("Machine").ToString()! + "\n"; inf_ = inf_ + "料单:" + item.GetValue("Dyelot").ToString()!; inf_ = inf_ + "@" + item.GetValue("ReDye").ToString()! + "\n"; inf_ = inf_ + "步骤:" + item.GetValue("StepNumber").ToString()! + "\n"; inf_ = inf_ + "流程:" + item.GetValue("Process").ToString()! + "\n"; inf_ = inf_ + "化料桶:" + item.GetValue("TankNO").ToString()! + "\n"; inf_ = inf_ + "染料桶数:" + item.GetValue("TotalNumber").ToString()!; if (item!.TryGetValue("BarrelState", out var _Type) && _Type != null) { string temp = _Type?.ToString() ?? ""; // 转换 _Type = temp switch { "301" => "就绪", "309" => "未准备", _ => "无信息" }; inf_ = inf_ + _Type; } inf_ = inf_ + "状态:" + item.GetValue("State").ToString()! + "\n"; InfoMachineItem infoMachineItem = new InfoMachineItem(); infoMachineItem.inf = inf_; InfoMachineItems.Add(infoMachineItem); } if (InfoMachineItems.Count == 0) InfoMachineItems.Add(new InfoMachineItem()); } //染料查询查询化料货架 else if (id == "12") { foreach (var item in data!) { string inf_ = "位置:" + item.GetValue("position").ToString()! + "\n"; inf_ = inf_ + "料单:" + item.GetValue("Dyelot").ToString()!; inf_ = inf_ + "@" + item.GetValue("ReDye").ToString()! + "\n"; inf_ = inf_ + "步骤:" + item.GetValue("StepNumber").ToString()! + "\n"; if (item!.TryGetValue("BarrelType", out var _Type) && _Type != null) { string temp = _Type?.ToString() ?? ""; // 转换 _Type = temp switch { "1" => "空桶", "2" => "染料桶", _ => "无桶" }; inf_ = inf_ + "类型:" + _Type; } if (item!.TryGetValue("BarrelState", out var _BarrelState) && _BarrelState != null) { string temp = _BarrelState?.ToString() ?? ""; _BarrelState = temp switch { "201" => "[分桶]", _ => "" }; inf_ = inf_ + _BarrelState; } inf_ = inf_ + "[" + item.GetValue("Barrelserialnumber").ToString()! + "]\n"; inf_ = inf_ + "上架时间:" + DateTime.Parse(item.GetValue("createtime").ToString() ?? "") .ToString("yyyy-MM-dd HH:mm:ss") + "\n"; inf_ = inf_ + "状态[" + item.GetValue("State").ToString()! + "]"; InfoMachineItem infoMachineItem = new InfoMachineItem(); infoMachineItem.inf = inf_; InfoMachineItems.Add(infoMachineItem); } if (InfoMachineItems.Count == 0) InfoMachineItems.Add(new InfoMachineItem()); } //助剂查询 else if (id == "20") { foreach (var item in data!) { string inf_ = "染机:" + item.GetValue("Machine").ToString()! + "\n"; inf_ = inf_ + "料单:" + item.GetValue("Dyelot").ToString()!; inf_ = inf_ + "@" + item.GetValue("ReDye").ToString()! + "\n"; inf_ = inf_ + "步骤:" + item.GetValue("StepNumber").ToString()! + "\n"; inf_ = inf_ + "总浴量:" + item.GetValue("Volume").ToString()! + "\n"; inf_ = inf_ + "计量模组:" + item.GetValue("DispenseModule").ToString()! + "\n"; if (item!.TryGetValue("TankNo", out var _TankNo) && _TankNo != null) { inf_ = inf_ + "目标位置:" + item.GetValue("TankNo").ToString()! + "\n"; } else { inf_ = inf_ + "目标位置:未指定\n" ; } inf_ = inf_ + "开始时间:" + DateTime.Parse(item.GetValue("DispenseStartTime").ToString() ?? "") .ToString("yyyy-MM-dd HH:mm:ss") + "\n"; if (item!.TryGetValue("State", out var _Type) && _Type != null) { string temp = _Type?.ToString() ?? ""; // 转换 _Type = temp switch { "102" => "计量中", "301" => "完成", "309" => "异常", _ => "无信息" }; inf_ = inf_ + "状态:" + _Type; } InfoMachineItem infoMachineItem = new InfoMachineItem(); infoMachineItem.inf = inf_; if (!InfoMachineItems.Any(x => x.inf == inf_)) { InfoMachineItems.Add(infoMachineItem); } } if (InfoMachineItems.Count==0) InfoMachineItems.Add(new InfoMachineItem()); } } }