From f08871fe7d148d667f2f11f80f64de71a0d9504c Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期一, 15 六月 2026 18:19:37 +0800
Subject: [PATCH] 优化标准老化界面

---
 Plugin.TestResult/DataTable.xaml.cs |  722 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 666 insertions(+), 56 deletions(-)

diff --git a/Plugin.TestResult/DataTable.xaml.cs b/Plugin.TestResult/DataTable.xaml.cs
index d0bb6a6..bcff8ec 100644
--- a/Plugin.TestResult/DataTable.xaml.cs
+++ b/Plugin.TestResult/DataTable.xaml.cs
@@ -1,13 +1,24 @@
-锘縰sing Plugin.TestResult_WPF.Model;
+锘縰sing HMI.Base;
+using HMI.Core.Setting;
+using HMI.Core.Util;
+using HMI.LogUtil;
+using HMI.UI.Util;
+using HMI.Util;
+using Plugin.TestResult;
+using Plugin.TestResult.Util;
+using Plugin.TestResult_WPF.Model;
+using Plugin.TsSupport;
+using SuperSocket.SocketBase.Config;
 using SuperSocket.SocketBase.Protocol;
 using System;
+using System.Collections.Generic;
 using System.ComponentModel;
-using System.Net;
-using System.Net.Sockets;
+using System.IO;
 using System.Runtime.CompilerServices;
-using System.Threading;
+using System.Timers;
 using System.Windows;
 using System.Windows.Controls;
+using System.Windows.Markup;
 
 namespace Plugin.TestResult_WPF
 {
@@ -47,6 +58,24 @@
             set => RaiseAndSetIfchanged(ref _statusText, value);
         }
 
+        private bool _isTesting;
+
+        public bool IsTesting
+        {
+            get { return _isTesting; }
+            set => RaiseAndSetIfchanged(ref _isTesting, value);
+        }
+
+        private ushort coolerStatus;
+        public ushort CoolerStatus
+        {
+            get => coolerStatus;
+            set
+            {
+                RaiseAndSetIfchanged(ref coolerStatus, value);
+            }
+        }
+
         private string tcpServerStatus;
 
         public string TcpServerStatus
@@ -55,41 +84,54 @@
             set { RaiseAndSetIfchanged(ref tcpServerStatus, value); }
         }
 
-        private string tcpServerInfo = "鏈惎鍔�";
+        private string tcpServerInfo = LangUtil.Get("App.NotStarted");
 
         public string TcpServerInfo
         {
             get { return tcpServerInfo; }
             set { RaiseAndSetIfchanged(ref tcpServerInfo, value); }
         }
-
-
-        private readonly int index;
-        private readonly int cellCount;
+        public int index { get; private set; }
+        public readonly int cellCount;
         private readonly string chartTitle;
-        private readonly TestResultView parent;
+        public readonly TestResultView parent;
 
         private BaseConfig config;
-        private Chart chart;
-        private Chart multiChart;
-        private SingleCell[] cells;
+        private LiveChart chart;
+        private LiveChart multiChart;
+        public SingleCell[] cells { get; private set; }
 
         private TcpServer tcpServer;
+        private string CountIniPath;
 
-        public DataTable(TestResultView parent,int index, string title, BaseConfig config)
+        private DateTime? testStartTime;
+
+        private Timer testTimeTimer;
+
+        // 骞冲潎娓╁害
+        public List<double> tempratures = new List<double>();
+        public Dictionary<string, List<double>> detailTempratures
+            = new Dictionary<string, List<double>>();
+
+        public DataTable(TestResultView parent, int index, string title,
+            string countIniPath,
+            BaseConfig config)
         {
+            this.CountIniPath = countIniPath;
             this.config = config;
             this.index = index;
             this.parent = parent;
             this.title = title;
             this.cellCount = config.PositionCount;
             this.cells = new SingleCell[cellCount];
-            this.chartTitle = config.MainChartTitle;
+            this.chartTitle = this.lang("Tr.AvgTemp");
             DataContext = this;
             InitializeComponent();
-            this.chart = new Chart(this.chartTitle, false, config.MaxSize, config.RefreshInterval);
-            this.multiChart = new Chart(config.DetailChartTitle, true, config.MaxSize, config.RefreshInterval) { 
-            BorderThickness = new Thickness(0)
+            mainGrid.Columns = config.PositionColumn;
+            this.chart = new LiveChart("骞冲潎娓╁害,骞冲潎娓╁害(鈩�)", false, true);
+            this.multiChart = new LiveChart(",璇︾粏娓╁害(鈩�)", true)
+            {
+                BorderThickness = new Thickness(0)
             };
             this.grid.Children.Add(this.chart);
             Grid.SetRow(this.chart, 2);
@@ -97,10 +139,34 @@
 
             for (int i = 0; i < this.cellCount; i++)
             {
-                var cell = new SingleCell(title, i, config.CellListMaxSize);
+                var cellRow = (i / config.PositionColumn) + 1;
+                var cellCol = (i % config.PositionColumn) + 1;
+                var cellTitle = $"{title}-{cellRow}-{cellCol}";
+
+                var cell = new SingleCell(this, cellTitle, i, config.CellListMaxSize, countIniPath);
                 mainGrid.Children.Add(cell);
                 cells[i] = cell;
             }
+
+            ScannerParser.Init(config.CodeParserType);
+
+            ReadCount();
+            testTimeTimer = new Timer();
+            testTimeTimer.Interval = 10000;
+            testTimeTimer.AutoReset = true;
+            testTimeTimer.Elapsed += TestTimeTimer_Elapsed;
+            if (!ParamSetting.ShowCoolerSetting) coolerSetting.Visibility = Visibility.Collapsed;
+            if (!ParamSetting.ShowBurnInAbort) abortBtn.Visibility = Visibility.Collapsed;
+        }
+
+        private void TestTimeTimer_Elapsed(object sender, ElapsedEventArgs e)
+        {
+            if (testStartTime == null) return;
+            var now = DateTime.Now;
+            Dispatcher.BeginInvoke(new Action(() =>
+            {
+                //SetConsumeTime((now - testStartTime).Value.TotalSeconds);
+            }));
         }
 
         public int GetSize()
@@ -121,17 +187,66 @@
         public void SetTemperature(double t)
         {
             infoTable.temperature = t;
-            chart.AddData(t);
+            tempratures.Add(t);
+            chart.AddDynamicData("骞冲潎娓╁害", "骞冲潎娓╁害(鈩�)", DateTime.Now, t);
         }
 
         public void SetTemperature(string name, double t)
         {
-            multiChart.AddData(name, t);
+            //List<double> list;
+            //if (detailTempratures.ContainsKey(name))
+            //{
+            //    list = detailTempratures[name];
+            //}
+            //else
+            //{
+            //    list = new List<double>();
+            //    detailTempratures.Add(name, list);
+            //}
+            //list.Add(t);
+
+            multiChart.AddDynamicData(name, "璇︾粏娓╁害(鈩�)", DateTime.Now, t);
+            //multiChart.AddData(name, t);
         }
 
         public void SetStatus(string status)
         {
-            infoTable.status = status;
+            ViewControl.Logger.Debug($"In Status: {status}");
+            Dispatcher.BeginInvoke(new Action(() =>
+            {
+                var lastStatus = infoTable.status;
+                if (status == "preCheck")
+                {
+                    ViewControl.Logger.Debug($"In preCheck");
+                    IsTesting = true;
+                    return;
+                }
+                if (status == "stop")
+                {
+                    IsTesting = false;
+                    return;
+                }
+                if (status == "abort")
+                {
+                    IsTesting = false;
+                }
+                infoTable.status = status;
+
+                //if (lastStatus != "testing" && status == "testing")
+                //{
+                //    testStartTime = DateTime.Now;
+                //    SetStartTime(testStartTime?.ToString("yyyy-MM-dd HH:mm:ss"));
+                //    testTimeTimer.Start();
+                //}
+                //if (lastStatus == "testing" && status != "testing")
+                //{
+                //    testTimeTimer.Stop();
+                //    var now = DateTime.Now;
+                //    infoTable.UpdateConsumeTime((now - testStartTime).Value.TotalSeconds, null);
+                //    SetEndTime(now.ToString("yyyy-MM-dd HH:mm:ss"));
+                //    testStartTime = null;
+                //}
+            }));
         }
 
         public void SetOkCount(int count)
@@ -154,9 +269,9 @@
             infoTable.endTimeStr = endTime;
         }
 
-        public void SetConsumeTime(double consumeTime)
+        public void UpdateConsumeTime(double consumeTime, double? leftTime)
         {
-            infoTable.consumeTime = consumeTime;
+            infoTable.UpdateConsumeTime(consumeTime, leftTime);
         }
 
         private ChartWindow window;
@@ -178,6 +293,8 @@
             }
         }
 
+        private Scanner scanner;
+
         private void Window_Closed(object sender, EventArgs e)
         {
             window = null;
@@ -185,9 +302,174 @@
 
         private void SetStationGlobal_Click(object sender, RoutedEventArgs e)
         {
-            ClearChartData();
-            parent.SetStartFlag(this.index, true);
+
         }
+
+        private void StartSingleClick(object sender, RoutedEventArgs e)
+        {
+            if (IsTesting)
+            {
+                if (MsgBoxHelper2.WarnChoose(this.lang("Tr.MakeSureStopOvenTest", title)) == MessageBoxResult.OK)
+                {
+                    LogHelper.Info("UI", $"鑰佸寲鐐塠{title}]鍋滄鎸夐挳鎸変笅", out _);
+                    ViewControl.Logger.Info($"鑰佸寲鐐塠{title}]鍋滄鎸夐挳鎸変笅");
+                    parent.SetStartFlag(this.index, false);
+                }
+            }
+            else
+            {
+                /// 妫�鏌ユ槸鍚﹀叧闂�
+                if (!GetDoorClose(parent.executionWrapper))
+                {
+                    /// 娌″叧闂ㄤ笉鍏佽鍚姩
+                    MsgBoxHelper2.Warn("璇峰厛鍏抽棴鑸遍棬锛�");
+                    return;
+                }
+
+                /// 妫�鏌ユ槸鍚︽湁鏉$爜
+                bool flag = false;
+                foreach (var cell in cells)
+                {
+                    if (!string.IsNullOrEmpty(cell.sn))
+                    {
+                        flag = true;
+                        break;
+                    }
+                }
+                if (flag)
+                {
+                    LogHelper.Info("UI", $"鑰佸寲鐐塠{title}]鍚姩鎸夐挳鎸変笅", out _);
+                    ViewControl.Logger.Info($"鑰佸寲鐐塠{title}]鍚姩鎸夐挳鎸変笅");
+                    ClearChartData();
+                    parent.SetStartFlag(this.index, true);
+                }
+                else
+                {
+                    MsgBoxHelper2.Warn("璇峰厛瀹屾垚鎵爜锛�");
+                }
+            }
+        }
+
+        private void ScanWindow_Click(object sender, RoutedEventArgs e)
+        {
+            if (!parent.IsRunning)
+            {
+                MsgBoxHelper.WarnMessage(this, this.lang("Tr.StartSeqFirst"), null, MessageBoxButton.OK);
+                return;
+            }
+
+            if (scanner != null)
+            {
+                scanner.ShowDialog();
+            }
+            else
+            {
+                int rows = config.CellCount / config.PositionColumn + 1;
+                scanner = new Scanner(this.index, this.lang("Tr.ScanTitle", title), CbProduct.SelectedItem?.ToString(), mainGrid.Columns, rows)
+                {
+                    Owner = Window.GetWindow(this),
+                    Tag = title
+                };
+                scanner.FinishBarcode += Scanner_FinishBarcode;
+                scanner.ComplateClick += Scanner_ComplateClick; ;
+                scanner.Closed += Scanner_Closed;
+                scanner.ShowDialog();
+            }
+        }
+
+        private void Scanner_ComplateClick(object sender, RoutedEventArgs e)
+        {
+            string paramName = $"StationState.Scanner[{index}]";
+
+            parent.executionWrapper.SetStationGlobalValue<bool>(paramName, 1, true);
+            //parent.engine.Globals.SetValBoolean(paramName, 1, true);
+        }
+
+        private void Scanner_Closed(object sender, EventArgs e)
+        {
+            scanner = null;
+        }
+
+        public bool GetDoorClose(ITestExecutionWrapper wrapper)
+        {
+            return wrapper?.GetStationGlobalValue<bool>($"StationState.DoorClose[{this.index}]", 0) == true;
+        }
+
+        private void Scanner_FinishBarcode(object sender, BarcodeEventArg e)
+        {
+            if (parent.executionWrapper == null) return;
+            //if (parent.SequenceContext == null) return;
+
+            int rows = (config.CellCount / config.PositionColumn) + 1;
+            CellInfo cellInfo = ScannerParser.GetCellInfoByCode(CbProduct.SelectedItem?.ToString(), mainGrid.Columns, rows, e.positionCode);
+            string positionCode = e.positionCode, snrCode = e.snrCode;
+
+            //if (cellInfo.OvenName != this.title)
+            //{
+            //    MsgBoxHelper2.Warn($"璇峰垏鎹㈣嚦 [{cellInfo.OvenName}] 鍖烘壂鐮侊紝褰撳墠涓� [{this.title}] 鍖猴紒");
+            //    return;
+            //}
+
+
+            var targetTable = TestResultView.nameTables[cellInfo.OvenName];
+
+            //灏嗚鍒扮殑鏉$爜鍐欏叆鍒癝N涓�
+            int dutNo = targetTable.index * targetTable.cellCount + cellInfo.Index;
+            string LookupStr = $"StationState.SN[{dutNo}]";
+            cellInfo.LookUpStr = LookupStr;
+
+            ViewControl.Logger.Info($"PositionCode: [{e.positionCode}], SNR: [{e.snrCode}], LookUpStr: [{LookupStr}]");
+            ViewControl.Logger.Info($"OvenName: [{cellInfo.OvenName}], CellIndex: [{cellInfo.Index}]");
+            var cell = targetTable.GetSingleCell(cellInfo.Index);
+
+            if (targetTable.GetDoorClose(parent.executionWrapper))
+            {
+                /// 鍏抽棬浜嗗氨涓嶅厑璁告竻鏉$爜
+                MsgBoxHelper2.Warn($"{targetTable.title}鐐夌敓浜т腑锛屼笉鍏佽鎿嶄綔鏉$爜");
+                //MsgBoxHelper2.Warn(this.lang("Tr.CantClearSNR"));
+                return;
+            }
+
+            if (snrCode == null)
+            {
+                var oldCellInfo = e.lastInfo;
+                var oldTable = TestResultView.nameTables[oldCellInfo.OvenName];
+                var oldCell = oldTable.GetSingleCell(oldCellInfo.Index);
+                if (oldCell.status != "hadCode")
+                {
+                    throw new Exception(this.lang("Tr.PositionCantClearSNR", oldCellInfo.OriginCode));
+                }
+                // 绉婚櫎鏉$爜
+                parent.executionWrapper.SetStationGlobalValue<string>(oldCellInfo.LookUpStr, 1, "");
+                parent.executionWrapper.CommitToDisk(false);
+
+                //parent.engine.Globals.SetValString(oldCellInfo.LookUpStr, 1, "");
+                //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+                oldCell.SetStatus("waiting");
+                oldCell.ClearSN();
+                return;
+            }
+
+            /// 娓呮帀涓婁釜鏉$爜鐨勮褰�
+            var lastSn = cell.sn;
+            if (!string.IsNullOrEmpty(lastSn))
+            {
+                Scanner.RemoveSNR(lastSn);
+            }
+
+            // 鍐欏叆鏉$爜
+            parent.executionWrapper.SetStationGlobalValue<string>(LookupStr, 1, snrCode);
+            parent.executionWrapper.CommitToDisk(false);
+
+            //parent.engine.Globals.SetValString(LookupStr, 1, snrCode);
+            //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+
+            cell.SetStatus("hadCode");
+            cell.sn = snrCode;
+            Scanner.InsertNewCode(snrCode, cellInfo);
+            cell.LightGreen(true, out string msg);            
+        }
+
 
         /// <summary>
         /// 娓呯┖涓や釜鍥捐〃鏁版嵁
@@ -196,51 +478,67 @@
         {
             chart.Clear();
             multiChart.Clear();
+
+            tempratures.Clear();
+            detailTempratures.Clear();
         }
 
+        /// <summary>
+        /// 鍚姩Tcp鏈嶅姟鍣�
+        /// </summary>
         private void StartTcpServer()
         {
+            var serverConfig = new ServerConfig()
+            {
+                MaxRequestLength = 1024 * 1024,
+                Port = config.PortStart + index
+            };
             try
             {
                 if (tcpServer == null)
                 {
                     tcpServer = new TcpServer();
                     tcpServer.NewRequestReceived += TcpServer_NewRequestReceived;
-                    if (!tcpServer.Setup(config.PortStart + index))
+                    if (!tcpServer.Setup(serverConfig))
                     {
-                        ChangeTcpServerStatus("ERROR", "鏈嶅姟璁剧疆寮傚父");
+                        ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.SettingFailed"));
                         return;
                     }
                     if (!tcpServer.Start())
                     {
-                        ChangeTcpServerStatus("ERROR", "鏈嶅姟鍚姩寮傚父");
+                        ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.StartFailed"));
                         return;
                     }
-                    ChangeTcpServerStatus("RUNNING", "鏈嶅姟杩愯涓�");
+                    ChangeTcpServerStatus("RUNNING", this.lang("Tr.TcpServer.Running"));
+                }
+                else if (tcpServer.State != SuperSocket.SocketBase.ServerState.Running)
+                {
+                    if (!tcpServer.Setup(serverConfig))
+                    {
+                        ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.SettingFailed"));
+                        return;
+                    }
+                    if (!tcpServer.Start())
+                    {
+                        ChangeTcpServerStatus("ERROR", this.lang("Tr.TcpServer.StartFailed"));
+                        return;
+                    }
+                    ChangeTcpServerStatus("RUNNING", this.lang("Tr.TcpServer.Running"));
                 }
             }
             catch (Exception ex)
             {
-                ChangeTcpServerStatus("ERROR", $"鏈嶅姟寮傚父锛歿ex.Message}");
+                ChangeTcpServerStatus("ERROR", $"{ex.Message}");
                 tcpServer?.Stop();
                 tcpServer = null;
             }
         }
 
-        private void StopTcpServer()
-        {
-            if (tcpServer == null) return;
-            try
-            {
-                tcpServer.Stop();
-                tcpServer = null;
-            }
-            catch (Exception ex)
-            {
-
-            }
-        }
-
+        /// <summary>
+        /// 鏇存柊Tcp鏈嶅姟鍣ㄧ姸鎬�
+        /// </summary>
+        /// <param name="status"></param>
+        /// <param name="info"></param>
         private void ChangeTcpServerStatus(string status, string info)
         {
             Dispatcher.Invoke(() =>
@@ -250,27 +548,106 @@
             });
         }
 
+        /// <summary>
+        /// 鍋滄Tcp鏈嶅姟鍣�
+        /// </summary>
+        private void StopTcpServer()
+        {
+            try
+            {
+                tcpServer?.Stop();
+                tcpServer = null;
+            }
+            catch (Exception ex)
+            {
+
+            }
+        }
+
+        /// <summary>
+        /// 閲婃斁璧勬簮
+        /// </summary>
+        public void RelaseResource()
+        {
+            testTimeTimer?.Stop();
+            StopTcpServer();
+        }
+
+        /// <summary>
+        /// Tcp娑堟伅澶勭悊
+        /// </summary>
+        /// <param name="session"></param>
+        /// <param name="requestInfo"></param>
         private void TcpServer_NewRequestReceived(TcpSession session, StringRequestInfo requestInfo)
         {
             string msg = requestInfo.Body;
+            ViewControl.Logger.Debug($"TCP Data From {session.RemoteEndPoint}: {msg}.");
             string[] datas_10015 = msg.Split(';');
             int cellIndex = int.Parse(datas_10015[1]);
 
             string strs = datas_10015[2];
             string[] values = strs.Split(',');
-
-            //string step = datas_10015[2];
-            //string result = datas_10015[3];
-            GetSingleCell(cellIndex).SetInfos(new Info
+            Dispatcher.Invoke(() =>
             {
-                step = values[0],
-                value = values[1],
-                result = values[2],
-                range = values[3],
-                condition = values[4],
-                updateTime = values[5]
+                GetSingleCell(cellIndex).SetInfos(new Info
+                {
+                    step = values[0],
+                    value = values[1],
+                    limitUp = values[2],
+                    limitDown = values[3],
+                    unit = values[4],
+                    result = values[5],
+                    updateTime = values[6]
+                });
             });
-            session.Send("1");
+            //session.Send("1");
+        }
+
+        public void RefreshCount(int ok, int ng)
+        {
+            infoTable.UpdateNumber(infoTable.okCount + ok, infoTable.ngCount + ng);
+
+            //if (ParamSetting.ProbeByModel)
+            //{
+
+            //}
+            //else
+            //{
+
+            //}
+            IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(),
+                  this.CountIniPath);
+            IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(),
+                this.CountIniPath);
+        }
+
+        /// <summary>
+        /// 璇诲彇淇濆瓨鐨勬暟鎹�
+        /// </summary>
+        public void ReadCount()
+        {
+            try
+            {
+                int ok = Convert.ToInt32(IniFileHelper.ReadIniData($"Oven_{index}", "Pass", "", CountIniPath));
+                int ng = Convert.ToInt32(IniFileHelper.ReadIniData($"Oven_{index}", "Fail", "", CountIniPath));
+                infoTable.UpdateNumber(ok, ng);
+            }
+            catch (Exception ex)
+            {
+                //do nothing
+            }
+        }
+
+        /// <summary>
+        /// 璁℃暟娓呴浂
+        /// </summary>
+        public void ClearNumber()
+        {
+            infoTable.UpdateNumber(0, 0);
+            IniFileHelper.WriteIniData($"Oven_{index}", "Pass", infoTable.okCount.ToString(),
+                this.CountIniPath);
+            IniFileHelper.WriteIniData($"Oven_{index}", "Fail", infoTable.ngCount.ToString(),
+                this.CountIniPath);
         }
 
         private void UserControl_Loaded(object sender, RoutedEventArgs e)
@@ -283,5 +660,238 @@
         {
             StartTcpServer();
         }
+
+        public void SaveTempFile(string filePath)
+        {
+            try
+            {
+                FileInfo fi = new FileInfo(filePath);
+                if (!fi.Directory.Exists)
+                {
+                    fi.Directory.Create();  //鏂囦欢涓嶅瓨鍦紝鍒涘缓鏂囦欢
+                }
+
+                using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
+                using (StreamWriter sw = new StreamWriter(fs, System.Text.Encoding.UTF8))
+                {
+                    string title = string.Join(",", detailTempratures.Keys) + "," + this.lang("Tr.AvgTemp");
+                    sw.WriteLine(title);
+
+                    for (int i = 0; i < tempratures.Count; i++)
+                    {
+                        string line = "";
+                        foreach (string key in detailTempratures.Keys)
+                        {
+                            if (detailTempratures[key] == null || detailTempratures[key].Count <= i)
+                            {
+                                line += ",";
+                            }
+                            else
+                            {
+                                line += $"{detailTempratures[key][i]},";
+                            }
+                        }
+                        line += tempratures[i];
+                        sw.WriteLine(line);
+                    }
+                }
+            }
+            catch (Exception ex)
+            {
+                Console.WriteLine(ex.ToString());
+            }
+        }
+
+        public void SetProductSource(List<string> productSource)
+        {
+            CbProduct.ItemsSource = productSource;
+        }
+
+        public void SetCurrentProduct(string currentProduct)
+        {
+            CbProduct.SelectedItem = currentProduct;
+        }
+
+        private void CbProduct_SelectionChanged(object sender, SelectionChangedEventArgs e)
+        {
+            if (e.AddedItems.Count > 0)
+            {
+                var str = e.AddedItems[0];
+                parent.SetOvenProduct(index, str.ToString());
+            }
+            else
+            {
+                parent.SetOvenProduct(index, "");
+            }
+
+            foreach (var cell in cells)
+            {
+                cell.RefreshProbe();
+                cell.RefreshCharts();
+            }
+        }
+
+        public void ClearCellData()
+        {
+            foreach (var cell in cells)
+            {
+                cell.ClearChart();
+            }
+        }
+
+        //public void ClearElectricData()
+        //{
+        //    foreach (var cell in cells)
+        //    {
+        //        cell.ClearElectricData();
+        //    }
+        //}
+
+        //public void ClearVData()
+        //{
+        //    foreach (var cell in cells)
+        //    {
+        //        cell.ClearVData();
+        //    }
+        //}
+
+        //public void ClearWaterData()
+        //{
+        //    foreach (var cell in cells)
+        //    {
+        //        cell.ClearWaterData();
+        //    }
+        //}
+
+        private void Button_Click_1(object sender, RoutedEventArgs e)
+        {
+            ScannerSetting setting = new ScannerSetting()
+            {
+                Owner = Window.GetWindow(this)
+            };
+            setting.Open(true, this.title);
+        }
+
+        private void Manual_Cooler_Opt(object sender, RoutedEventArgs e)
+        {
+            //var btn = (Button)sender;
+            //var target = CoolerStatus == 2 ? 0 : 2;
+            //if (MsgBoxHelper2.WarnChoose($"纭畾瑕佽繘琛寋btn.Content}鍚楋紵") == MessageBoxResult.OK)
+            //{
+            //    if (S7Context.WriteData("1", $"Oven{index + 1}_CoolerStatus", (ushort)target, out string msg))
+            //    {
+            //        CoolerStatus = (ushort)target;
+            //        ToastHelper.Success("Success");
+            //    }
+            //    else
+            //    {
+            //        ToastHelper.Error($"{msg}");
+            //    }
+            //}
+            if (parent.IsRunning)
+            {
+                MsgBoxHelper2.Warn(this.lang("Tr.CantOptCooler"));
+                return;
+            }
+            var columns = mainGrid.Columns;
+            var window = new CoolerStatus(this.index, columns, title + this.lang("Tr.CoolerSetting"))
+            {
+
+                Owner = Window.GetWindow(this)
+            };
+            window.ShowDialog();
+        }
+
+        private void ClearAllSnr_Click(object sender, RoutedEventArgs e)
+        {
+            if (GetDoorClose(parent.executionWrapper))
+            {
+                /// 鍏抽棬浜嗗氨涓嶅厑璁告竻鏉$爜
+                MsgBoxHelper2.Warn(this.lang("Tr.CantClearSNR"));
+                return;
+            }
+
+            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), LangUtil.Get("Tr.MakeSureClearAllSNR")) == MessageBoxResult.OK)
+            {
+                try
+                {
+                    ClearAllSN();
+                    ToastHelper.Success(LangUtil.Get("App.DeleteSuccess"));
+                }
+                catch (Exception ex)
+                {
+                    ViewControl.Logger.Error("ClearAllSnr_Click Error.", ex);
+                    MsgBoxHelper.Error(Window.GetWindow(this), ex.Message);
+                }
+            }
+        }
+
+        public void ClearAllSN()
+        {
+            for (int i = 0; i < this.cellCount; i++)
+            {
+                ClearCellSN(i);
+            }
+        }
+
+        public void TryClearCellSN(int cellIndex)
+        {
+            if (GetDoorClose(parent.executionWrapper))
+            {
+                MsgBoxHelper.Error(Window.GetWindow(this), this.lang("Tr.CantClearSNR"));
+                return;
+            }
+            ClearCellSN(cellIndex);
+        }
+
+        private void ClearCellSN(int index)
+        {
+            var cell = GetSingleCell(index);
+            int dutNo = this.index * this.cellCount + index;
+            string LookupStr = $"StationState.SN[{dutNo}]";
+            var lastSN = cell.sn;
+            cell.SetStatus("waiting");
+
+            parent.executionWrapper.SetStationGlobalValue<string>(LookupStr, 1, "");
+            parent.executionWrapper.CommitToDisk(false);
+
+            //parent.engine.Globals.SetValString(LookupStr, 1, "");
+            //parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
+            if (!string.IsNullOrEmpty(lastSN)) Scanner.RemoveSNR(lastSN);
+            cell.ClearSN();
+        }
+
+        private void Abort_Click(object sender, RoutedEventArgs e)
+        {
+            if (!parent.IsRunning)
+            {
+                MsgBoxHelper.WarnMessage(this, this.lang("Tr.StartSeqFirst"), null, MessageBoxButton.OK);
+                return;
+            }
+
+            //string key = $"StationState.Start[{this.index}]";
+            //if (parent.executionWrapper?.GetStationGlobalValue<bool>(key, 0) == true)
+            //{
+            //    MsgBoxHelper2.Warn("娴嬭瘯鍚姩涓紝涓嶅厑璁窤bort");
+            //    return;
+            //}
+            var win = new RequirePasswordByUser("admin")
+            {
+                Owner = Window.GetWindow(this)
+            };
+            if (win.ShowDialog() != true)
+            {
+                return;
+            }
+
+            if (MsgBoxHelper2.WarnChoose("璇风‘璁よ�佸寲浠撳湪瀹夊叏娓╁害锛屾按鍐锋満鍚规按瀹屾垚锛屽崟鍑籓K鎸夐挳浠撲綅鍥炲埌鍒濆鍖栫姸鎬�") != MessageBoxResult.OK)
+            {
+                return;
+            }
+            LogHelper.Info("UI", $"{title} Abort鎸夐挳鎸変笅", out _);
+            ViewControl.Logger.Info($"{title} Abort鎸夐挳鎸変笅");
+            string key = $"StationState.Abort[{this.index}]";
+            parent.executionWrapper?.SetStationGlobalValue(key, 0, true);
+        }
     }
 }

--
Gitblit v1.9.1