using SunlightAggregationTerminal.Class; using SunlightAggregationTerminal.Models; using System.Collections.ObjectModel; using System.Text.Json; using TouchSocket.Core; namespace SunlightAggregationTerminal; public partial class QueryDetail : ContentPage { public static ObservableCollection QueryDetailDyelotDetailsItems { get; set; } = new(); public QueryDetail(DyelotItem item) { InitializeComponent(); _Dyelot.Text = item.Dyelot; _ReDye.Text = item.ReDye?.ToString()??""; _Machine.Text = item.Machine; _CreationTime.Text = item.CreationTime; _FabricName.Text = item.FabricName; _CustomerName.Text = item.CustomerName; _ColorName.Text = item.ColorName; // 如果 item.Color 为 null,则默认为透明色 _Color.Color = item.Color.HasValue ? Color.FromInt(item.Color.Value) : Colors.Gray; Dictionary QueryDictionary = new Dictionary(); QueryDictionary.Add("Command", "QueryDetail"); /* QueryDictionary.Add("Field", "[Dyelot],[ReDye],[StepNumber],[ProductCode],[ProductName]," + "[ProductType],[Grams],[Created],[DispenseStartTime],[DispenseEndTime],[DispenseTime]," + "[DispenseGrams],[DispenseResult],[Process]");*/ QueryDictionary.Add("Field", "*"); QueryDictionary.Add("Dyelot", item.Dyelot?.ToString() ?? ""); QueryDictionary.Add("ReDye", item.ReDye?.ToString()??""); Query_Command(QueryDictionary.ToJsonString()); } private void Data_() { var processedList = QueryDetailDyelotDetailsItems .GroupBy(item => new { // ?.Trim() 防止空格和 null 导致的分组偏差 Dyelot = item.Dyelot?.Trim(), Step = item.StepNumber }) .Select(g => { var list = g.ToList(); var firstItem = list.First(); // 直接使用 Select 的重载,获取当前元素的索引 i,然后通过 list[i] 访问对应的其他字段 var combinedInfo = string.Join("\n", list.Select((x, i) => $"原料: {list[i].ProductName} ({list[i].ProductCode})\n" + $"目标/实际: {list[i].GramsDisplay}g / {list[i].DispenseGramsDisplay}g") ); // 赋值给最终展示的 ProductName firstItem.ProductName = combinedInfo; return firstItem; }) .ToList(); // 强制立刻执行查询 // 更新 UI 绑定的 ObservableCollection QueryDetailDyelotDetailsItems.Clear(); foreach (var item in processedList) { QueryDetailDyelotDetailsItems.Add(item); } CardCollectionView_data.ItemsSource = QueryDetailDyelotDetailsItems; } public async void Query_Command(string dat) { LoadingIndicator.IsVisible = true; QueryDetailDyelotDetailsItems.Clear(); DataReceived.Transmit(dat); // 创建一个 秒的延时任务 Task delayTask = Task.Delay(10000); // 创建一个监测任务,不断检查变量 Task monitorTask = Task.Run(async () => { while (QueryDetailDyelotDetailsItems.Count == 0) { // 每隔 100 毫秒检查一次,避免 CPU 占用过高 await Task.Delay(1000); } }); // 使用 Task.WhenAny 等待任意一个任务完成 await Task.WhenAny(delayTask, monitorTask); Data_(); LoadingIndicator.IsVisible = false; } public static void Query_data(string dat) { try { var data = JsonSerializer.Deserialize>(dat); if (data != null) { //添加入显示信息 foreach (var item in data) { //时间处理 if (DateTime.TryParse(item.DispenseEndTime, out DateTime dte)) { item.DispenseEndTime = dte.ToString("yyyy-MM-dd HH:mm:ss"); if (DateTime.TryParse(item.DispenseStartTime, out DateTime dtr)) { //计算用时 item.UsageTime = $"{(int)(dte - dtr).TotalMinutes}:{(dte - dtr).Seconds:D2}"; } } if (item.ProductType == 1 && item.Process == null) item.Process = "未知"; if (item.Tank != null) item.Tank ="@" + item.Tank; //行信息 QueryDetailDyelotDetailsItems.Add(item); } if (data.Count == 0) {//如果无信息添加空白行 QueryDetailDyelotDetailsItems.Add(new DyelotDetailsItem { }); } } } catch (Exception) { } } }