alielie
2025-07-04 0940f31b7eba1cf6b6a8c1fca72d97cf686e79f2
Plugin.TestResult/DataTable.xaml.cs
@@ -1,11 +1,16 @@
using Plugin.TestResult_WPF.Model;
using HMI.Core.Util;
using HMI.UI.Util;
using HMI.Util;
using Plugin.TestResult;
using Plugin.TestResult_WPF.Model;
using Plugin.TestResult_WPF.Util;
using SuperSocket.SocketBase.Protocol;
using System;
using System.CodeDom.Compiler;
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.Windows;
using System.Windows.Controls;
@@ -55,7 +60,7 @@
            set { RaiseAndSetIfchanged(ref tcpServerStatus, value); }
        }
        private string tcpServerInfo = "未启动";
        private string tcpServerInfo = LangUtil.Get("App.NotStarted");
        public string TcpServerInfo
        {
@@ -63,7 +68,7 @@
            set { RaiseAndSetIfchanged(ref tcpServerInfo, value); }
        }
        private static CommonCodeParser codeParser = new CommonCodeParser();
        private readonly int index;
        private readonly int cellCount;
        private readonly string chartTitle;
@@ -75,9 +80,18 @@
        private SingleCell[] cells;
        private TcpServer tcpServer;
        private string CountIniPath;
        public DataTable(TestResultView parent,int index, string title, BaseConfig config)
        // 平均温度
        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;
@@ -87,18 +101,23 @@
            this.chartTitle = config.MainChartTitle;
            DataContext = this;
            InitializeComponent();
            mainGrid.Columns = config.PositionColumn;
            this.chart = new Chart(this.chartTitle, false, config.MaxSize, config.RefreshInterval);
            this.multiChart = new Chart(config.DetailChartTitle, true, config.MaxSize, config.RefreshInterval);
            this.multiChart = new Chart(config.DetailChartTitle, true, config.MaxSize, config.RefreshInterval)
            {
                BorderThickness = new Thickness(0)
            };
            this.grid.Children.Add(this.chart);
            Grid.SetRow(this.chart, 2);
            this.chart.MouseDoubleClick += chart_MouseDoubleClick;
            for (int i = 0; i < this.cellCount; i++)
            {
                var cell = new SingleCell(title, i, config.CellListMaxSize);
                var cell = new SingleCell(title, i, config.CellListMaxSize, countIniPath);
                mainGrid.Children.Add(cell);
                cells[i] = cell;
            }
            ReadCount();
        }
        public int GetSize()
@@ -119,11 +138,23 @@
        public void SetTemperature(double t)
        {
            infoTable.temperature = t;
            tempratures.Add(t);
            chart.AddData(t);
        }
        public void SetTemperature(string name, double t)
        {
            List<double> list;
            if (detailTempratures.ContainsKey(name))
            {
                list = detailTempratures[name];
            }
            else
            {
                list = new List<double>();
                detailTempratures.Add(name, list);
            }
            list.Add(t);
            multiChart.AddData(name, t);
        }
@@ -176,6 +207,8 @@
            }
        }
        private Scanner scanner;
        private void Window_Closed(object sender, EventArgs e)
        {
            window = null;
@@ -187,6 +220,53 @@
            parent.SetStartFlag(this.index, true);
        }
        private void ScanWindow_Click(object sender, RoutedEventArgs e)
        {
            if (scanner != null)
            {
                scanner.Activate();
            }
            else
            {
                scanner = new Scanner(this.lang("Tr.ScanTitle", title))
                {
                    Tag = title
                };
                scanner.FinishBarcode += Scanner_FinishBarcode;
                scanner.Closed += Scanner_Closed;
                scanner.Show();
            }
        }
        private void Scanner_Closed(object sender, EventArgs e)
        {
            scanner = null;
        }
        private void Scanner_FinishBarcode(object sender, BarcodeEventArg e)
        {
            if (parent.SequenceContext == null) return;
            CellInfo cellInfo = codeParser.GetCellInfoByCode(e.positionCode);
            string paramName = $"StationState.StartScanner_{title}";
            parent.engine.Globals.SetValBoolean(paramName, 0, true);
            string positionCode = e.positionCode, snrCode = e.snrCode;
            //TODO 需要增加条码校验功能
            //将读到的条码写入到SN中
            int dutNo = Convert.ToInt16(positionCode.Split('-')[2]) - 1;
            dutNo = this.index * this.cellCount + dutNo;
            string LookupStr = $"StationState.SN[{dutNo}]";
            ViewControl.Logger.Info($"PositionCode: [{e.positionCode}], SNR: [{e.snrCode}], LookUpStr: [{LookupStr}]");
            parent.engine.Globals.SetValString(LookupStr, 0, snrCode);
            parent.engine.CommitGlobalsToDisk(promptOnSaveConflicts: false);
            string code = parent.engine.Globals.GetValString(LookupStr, 0);
            parent.nameTables[cellInfo.OvenName].GetSingleCell(cellInfo.Index).SetStatus("hadCode");
        }
        /// <summary>
        /// 清空两个图表数据
        /// </summary>
@@ -194,8 +274,14 @@
        {
            chart.Clear();
            multiChart.Clear();
            tempratures.Clear();
            detailTempratures.Clear();
        }
        /// <summary>
        /// 启动Tcp服务器
        /// </summary>
        private void StartTcpServer()
        {
            try
@@ -206,39 +292,44 @@
                    tcpServer.NewRequestReceived += TcpServer_NewRequestReceived;
                    if (!tcpServer.Setup(config.PortStart + index))
                    {
                        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(config.PortStart + index))
                    {
                        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(() =>
@@ -248,9 +339,39 @@
            });
        }
        /// <summary>
        /// 停止Tcp服务器
        /// </summary>
        private void StopTcpServer()
        {
            try
            {
                tcpServer?.Stop();
                tcpServer = null;
            }
            catch (Exception ex)
            {
            }
        }
        /// <summary>
        /// 释放资源
        /// </summary>
        public void RelaseResource()
        {
            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.Info($"TCP Data From {session.RemoteEndPoint}: {msg}.");
            string[] datas_10015 = msg.Split(';');
            int cellIndex = int.Parse(datas_10015[1]);
@@ -268,7 +389,45 @@
                condition = values[4],
                updateTime = values[5]
            });
            session.Send("1");
            //session.Send("1");
        }
        public void RefreshCount(int ok, int ng)
        {
            infoTable.UpdateNumber(infoTable.okCount + ok, infoTable.ngCount + ng);
            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)
@@ -281,5 +440,109 @@
        {
            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) + ",平均值";
                    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, "");
            }
        }
        public void ClearElectricData()
        {
            foreach (var cell in cells)
            {
                cell.ClearElectricData();
            }
        }
        private void Button_Click_1(object sender, RoutedEventArgs e)
        {
            ScannerSetting setting = new ScannerSetting()
            {
                Owner = Window.GetWindow(this)
            };
            setting.Open(true, this.title);
        }
        private void ClearAllSnr_Click(object sender, RoutedEventArgs e)
        {
            if (MsgBoxHelper.WarnMessage(Window.GetWindow(this), LangUtil.Get("Tr.MakeSureClearAllSNR")) == MessageBoxResult.OK)
            {
                try
                {
                    for (int i = 0; i < this.cellCount; i++)
                    {
                        int dutNo = this.index * this.cellCount + i;
                        string LookupStr = $"StationState.SN[{dutNo}]";
                        parent.engine.Globals.SetValString(LookupStr, 0, "");
                        GetSingleCell(i).SetStatus("waiting");
                    }
                    ToastHelper.Success(LangUtil.Get("App.DeleteSuccess"));
                }
                catch (Exception ex)
                {
                    ViewControl.Logger.Error("ClearAllSnr_Click Error.", ex);
                    MsgBoxHelper.Error(Window.GetWindow(this), ex.Message);
                }
            }
        }
    }
}