From 88b8ddefbfb1fe1a73d328d7e1db7da8c11ac265 Mon Sep 17 00:00:00 2001 From: "HM-CN\\zhengxuan.zhang" Date: Sat, 30 Aug 2025 01:02:49 +0800 Subject: [PATCH] =?UTF-8?q?#250829=20=E5=89=A5=E7=A6=BB=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=8A=A5=E5=91=8A=E4=B8=BA=E7=8B=AC=E7=AB=8B?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Analysis/CenterControl.cs | 6229 +++++++++-------- Analysis/CenterControl.designer.cs | 5 +- Analysis/Program.cs | 2 +- Analysis/bin/x64/Debug/DAL.dll | Bin 50176 -> 50176 bytes Analysis/bin/x64/Debug/DAL.pdb | Bin 128512 -> 128512 bytes Analysis/bin/x64/Debug/Debug.txt | 58 +- .../bin/x64/Debug/File/AnalysisConfig.ini | 4 +- Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml | 2 +- Analysis/bin/x64/Debug/Key/reg.key | 2 +- Analysis/bin/x64/Debug/NSAnalysis.exe | Bin 2482176 -> 2482688 bytes Analysis/bin/x64/Debug/NSAnalysis.pdb | Bin 497152 -> 497152 bytes DAL/SQLHelper.cs | 4 +- DAL/bin/Debug/DAL.dll | Bin 50176 -> 50176 bytes DAL/bin/Debug/DAL.pdb | Bin 128512 -> 128512 bytes 14 files changed, 3172 insertions(+), 3134 deletions(-) diff --git a/Analysis/CenterControl.cs b/Analysis/CenterControl.cs index 7da1f4e..c6ab28a 100644 --- a/Analysis/CenterControl.cs +++ b/Analysis/CenterControl.cs @@ -1,1368 +1,1221 @@ -using System; +using BaseFunction; +using DAL; +using HslCommunication.Profinet.Siemens; +using Newtonsoft.Json; +using NSAnalysis.Properties; +using PLCModule; +using System; using System.Collections.Generic; -using System.ComponentModel; using System.Data; using System.Drawing; -using System.Text; -using System.Windows.Forms; -using System.Text.RegularExpressions; -using System.Collections; using System.IO; -using System.Xml; -using BaseFunction; -using Telerik.WinControls.UI; -using Telerik.WinControls; -using System.Linq; -using System.Windows.Forms.DataVisualization.Charting; -using NSAnalysis.Properties; -using static Telerik.WinControls.UI.ValueMapper; -using PLCModule; -using HslCommunication.Profinet.Siemens; -using static System.Windows.Forms.VisualStyles.VisualStyleElement.TrackBar; -using System.Threading; -using UserControlClass; -using DAL; -using System.Linq.Expressions; -using Newtonsoft.Json; -using System.Net; -using System.Xml.Linq; using System.IO.Ports; -using System.Drawing.Printing; -using System.Drawing.Text; -using NSAnalysis; +using System.Linq; +using System.Net; +using System.Text; +using System.Threading; +using System.Windows.Forms; +using Telerik.WinControls; +using Telerik.WinControls.UI; +using UserControlClass; namespace NSAnalysis { - public partial class CenterControl : Telerik.WinControls.UI.ShapedForm - { - #region 全局变量 + /// + /// + /// + /// + /// + /// 2025.08.29 ---------------------------------------------------- + /// 1、增加对 生成报告数据的备份 √ + /// 2、增加对上传json的记录和重发 + /// 3、增加对 PLC启动测量信号的判断 4、PLC通讯阻塞问题 + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// - private int[] yValues = new int[3]; - private string[] xValues = new string[3]; - private DataTable dtCSVContent = new DataTable(); - private DataTable dtRangeData = new DataTable(); - private TMeasureMSSQLDAL tmdal = new TMeasureMSSQLDAL(); - private string strSaveReprotPath = ""; - private bool bReadCSVFlag = false; - private List ListPostIOTData = new List(); - private FEHYLeftCarData fLEHY = null; - private FEHYRightCarData fREHY = null; + public partial class CenterControl : Telerik.WinControls.UI.ShapedForm + { + #region 全局变量 - private FEH3LeftCarData fLEH3 = null; - private FEH3RightCarData fREH3 = null; + private int[] yValues = new int[3]; + private string[] xValues = new string[3]; + private DataTable dtCSVContent = new DataTable(); + private DataTable dtRangeData = new DataTable(); + private TMeasureMSSQLDAL tmdal = new TMeasureMSSQLDAL(); + private string strSaveReprotPath = ""; + private bool bReadCSVFlag = false; + private List ListPostIOTData = new List(); + private FEHYLeftCarData fLEHY = null; + private FEHYRightCarData fREHY = null; - private int iCurrentMeasureItemsFailedCount = 0; - #region PLC相关变量 + private FEH3LeftCarData fLEH3 = null; + private FEH3RightCarData fREH3 = null; - private bool bStopPlcNormal = false; - private static int HeartBeatCount = 0; - private bool bPlcLiveTickLast = false; + private int iCurrentMeasureItemsFailedCount = 0; + #region PLC相关变量 - private Thread m_ThreadReconnectPLC = null; - private int m_ReConnectNum = 0; - private bool bTickt = true; - private int iLastNSStartMeasure = 0; - private int iLastCarPassFlag = 0; - private int iLastStation1To2 = 0; - private int iLastStation2To3 = 0; - private int iLastReadVINFinishFlag = 0; + private bool bStopPlcNormal = false; + private static int HeartBeatCount = 0; + private bool bPlcLiveTickLast = false; - private SerialPort serialTestPort = null; + private Thread m_ThreadReconnectPLC = null; + private int m_ReConnectNum = 0; + private bool bTickt = true; + private int iLastNSStartMeasure = 0; + private int iLastCarPassFlag = 0; + private int iLastStation1To2 = 0; + private int iLastStation2To3 = 0; + private int iLastReadVINFinishFlag = 0; - private SerialPort serialPort = null; - private int iLastMesureCount = 0; + private SerialPort serialTestPort = null; - #endregion PLC相关变量 + private SerialPort serialPort = null; + private int iLastMesureCount = 0; - #region 分页全局变量 + #endregion PLC相关变量 - private DataTable PageTable = new DataTable(); + #region 分页全局变量 - /// - /// 每页记录数 - /// - public int pageSize = 20; + private DataTable PageTable = new DataTable(); - /// - /// 总记录数 - /// - public int recordCount = 0; + /// + /// 每页记录数 + /// + public int pageSize = 20; - /// - /// 总页数 - /// - public int pageCount = 0; + /// + /// 总记录数 + /// + public int recordCount = 0; - /// - /// 当前页 - /// - public int currentPage = 0; + /// + /// 总页数 + /// + public int pageCount = 0; - #endregion 分页全局变量 + /// + /// 当前页 + /// + public int currentPage = 0; - #endregion 全局变量 + #endregion 分页全局变量 - #region 主窗口事件 + #endregion 全局变量 - public CenterControl() - { - InitializeComponent(); - SQLHelper.connStr = DatabaseDfn.SqlConnectStr(); + // 定义三个文件路径,分别存储 plc, csv 和iot过点数据,位于程序运行目录下 plc.csv iot.csv nextsense.csv + private string strPlcDataPath = Application.StartupPath + "\\plc.csv"; - // + private string strIotDataPath = Application.StartupPath + "\\iot.csv"; + private string strNextsenseDataPath = Application.StartupPath + "\\nextsense.csv"; - #region 加载皮肤 + #region 主窗口事件 - ThemeResolutionService.LoadPackageFile(ConfigDfn.strTheme); - this.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); - RPV.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); + public CenterControl() + { + InitializeComponent(); + SQLHelper.connStr = DatabaseDfn.SqlConnectStr(); - #endregion 加载皮肤 - } + #region 加载皮肤 - private void CenterControl_Load(object sender, EventArgs e) - { - #region 初始化全局变量 - fLEHY = new FEHYLeftCarData(this); - fREHY = new FEHYRightCarData(this); - fLEH3 = new FEH3LeftCarData(this); - fREH3 = new FEH3RightCarData(this); - MyBase.rleMessage = rleMessage; - rdtpStartTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); - rdtpEndTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); - - #endregion - //需要显示车身数据 不分析csv文件 - if (ConfigDfn.iShowCarDataFlag == 1) - { - MyBase.TraceWriteLine(" 进入显示车身模式!显示车身界面。"); - lpcShowCarData_Click(null, null); - //serialPort = new SerialPort(ConfigDfn.strCOMPort, 115200, Parity.None, 8, StopBits.One); // 设置串口参数 - //serialPort.DataReceived += new SerialDataReceivedEventHandler(DataAutoReceivedHandler); // 注册数据接收事件处理方法 - //serialPort.Open(); // 打开串口 - //if (serialPort.IsOpen) - //{ - // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开成功O(∩_∩)O"); - //} - //else - //{ - // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开失败!"); - // MessageBox.Show(ConfigDfn.strCOMPort + "打开失败!请检查扫抢串口设置是否正确。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); - //} - - } - else - { - MyBase.TraceWriteLine(" 进入不显示车身模式!"); - } - if (ConfigDfn.iAnalysisCSVFlag == 1) - { - btnConnectPlc_Click(null, null); - MyBase.TraceWriteLine(" 进入解析CSV文件模式,开始解析扫码CSV文件!"); - tmReadNextsenseCSV.Interval = 500; - tmReadNextsenseCSV.Start(); - //tmdal.updateMaintenceInfoEmpty(); - } - else - { - MyBase.TraceWriteLine(" 进入不解析CSV文件模式!"); - tmReadNextsenseCSV.Stop(); - } - - if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) - { - MyBase.TraceWriteLine("软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEH3Path); - } - else - { - string strTip = "错误:软件首次启动,读取NextSense生成EH3 CSV报告的路径:" + ConfigDfn.strNextSenseCSVEH3Path + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; - MyBase.TraceWriteLine(strTip); - Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); - //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); - //if (dResult == DialogResult.Yes) - //{ - // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); - // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEH3Path); - //} - //else - //{ - // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); - //} - } - if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) - { - MyBase.TraceWriteLine("软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEHYPath); - } - else - { - string strTip = "错误:软件首次启动,读取NextSense生成EHY CSV报告的路径:" + ConfigDfn.strNextSenseCSVEHYPath + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; - MyBase.TraceWriteLine(strTip); - Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); - //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); - //if (dResult == DialogResult.Yes) - //{ - // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); - // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEHYPath); - //} - //else - //{ - // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); - //} - } - initLPCControl(); - - - rddlSizeName.SelectedIndex = 0; - DataTable dtMPName = tmdal.SelectAllMeasPointName(); - if (dtMPName.Rows.Count > 0) - { - for (int i = 0; i < dtMPName.Rows.Count; i++) - { - rddlMeasurePoint.Items.Add(dtMPName.Rows[i][0].ToString()); - } - rddlMeasurePoint.SelectedIndex = 0; - } - //tmdal.updateMaintenceInfoEmpty(); - //iLastMesureCount = tmdal.SelectTMeasureResultCount(); - - #region 清空信息 - - labVIN.Text = ""; - labOKCount.Text = ""; - labNGCount.Text = ""; - labRejectCount.Text = ""; - labSumMeasureCount.Text = ""; - labMeaTime.Text = ""; - labResultPercent.Text = ""; - labResult.Text = ""; - labCarType.Text = ""; - - #endregion 清空信息 - - InitTableColumns(); - strSaveReprotPath = ConfigDfn.strReportPath + @"\"; - - - //testIotUpload(); + ThemeResolutionService.LoadPackageFile(ConfigDfn.strTheme); + this.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); + RPV.ThemeName = ConfigDfn.strSkinName.Substring(0, ConfigDfn.strSkinName.Length - 5); + #endregion 加载皮肤 } - private void InitTableColumns() - { - #region 测量数据表始化表 - - //创建虚拟表 - DataColumn column2 = new DataColumn("CarID", Type.GetType("System.String")); - DataColumn dcCarType = new DataColumn("CarType", Type.GetType("System.String")); - DataColumn column3 = new DataColumn("MeasPointName", Type.GetType("System.String")); - DataColumn column4 = new DataColumn("DimensionName", Type.GetType("System.String")); - DataColumn column5 = new DataColumn("NormalValue", Type.GetType("System.String")); - DataColumn column6 = new DataColumn("LowerTolVal", Type.GetType("System.String")); - DataColumn column7 = new DataColumn("UpperTolVal", Type.GetType("System.String")); - DataColumn column8 = new DataColumn("MeasureValue", Type.GetType("System.String")); - DataColumn column10 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); - DataColumn column9 = new DataColumn("MeasureDate", Type.GetType("System.DateTime")); - DataColumn column1 = new DataColumn("Remark", Type.GetType("System.String")); - //将列添加到table表中 - - dtCSVContent.Columns.Add(column2); - dtCSVContent.Columns.Add(dcCarType); - dtCSVContent.Columns.Add(column3); - dtCSVContent.Columns.Add(column4); - dtCSVContent.Columns.Add(column5); - dtCSVContent.Columns.Add(column6); - dtCSVContent.Columns.Add(column7); - dtCSVContent.Columns.Add(column8); - dtCSVContent.Columns.Add(column10); - dtCSVContent.Columns.Add(column9); - dtCSVContent.Columns.Add(column1); - - #endregion 测量数据表始化表 - - #region 极差数据Table初始化 - - //创建虚拟表 - DataColumn dcCarID = new DataColumn("CarID", Type.GetType("System.String")); - DataColumn dcRangeName = new DataColumn("RangeName", Type.GetType("System.String")); - DataColumn dcRangeValue = new DataColumn("RangeValue", Type.GetType("System.String")); - DataColumn dcRangeLowUpp = new DataColumn("RangeLowUpp", Type.GetType("System.String")); - DataColumn dcResult = new DataColumn("Result", Type.GetType("System.String")); - DataColumn dcCreateTime = new DataColumn("CreateTime", Type.GetType("System.DateTime")); - DataColumn dcRemark = new DataColumn("Remark", Type.GetType("System.String")); - //将列添加到table表中 - - dtRangeData.Columns.Add(dcCarID); - dtRangeData.Columns.Add(dcRangeName); - dtRangeData.Columns.Add(dcRangeValue); - dtRangeData.Columns.Add(dcRangeLowUpp); - dtRangeData.Columns.Add(dcResult); - dtRangeData.Columns.Add(dcCreateTime); - dtRangeData.Columns.Add(dcRemark); - - #endregion 测量数据表始化表 - - #region 分页相关 - - //创建分页虚拟表 - DataColumn column11 = new DataColumn("CarID", Type.GetType("System.String")); - DataColumn column12 = new DataColumn("MeasPointName", Type.GetType("System.String")); - DataColumn column13 = new DataColumn("DimensionName", Type.GetType("System.String")); - DataColumn column14 = new DataColumn("NormalValue", Type.GetType("System.String")); - DataColumn column15 = new DataColumn("LowerTolVal", Type.GetType("System.String")); - DataColumn column16 = new DataColumn("UpperTolVal", Type.GetType("System.String")); - DataColumn column17 = new DataColumn("MeasureValue", Type.GetType("System.String")); - DataColumn column18 = new DataColumn("MeasureDate", Type.GetType("System.String")); - DataColumn column19 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); - - //将列添加到table表中 - PageTable.Columns.Add(column11); - PageTable.Columns.Add(column12); - PageTable.Columns.Add(column13); - PageTable.Columns.Add(column14); - PageTable.Columns.Add(column15); - PageTable.Columns.Add(column16); - PageTable.Columns.Add(column17); - PageTable.Columns.Add(column18); - PageTable.Columns.Add(column19); - - labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 - labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 - labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 - rddlPageRecorderCount.SelectedIndex = 0; - - #endregion 分页相关 - } - - private void DataAutoReceivedHandler(object sender, SerialDataReceivedEventArgs e) - { - SerialPort sp = (SerialPort)sender; - string strScanVIN = sp.ReadExisting(); - MyBase.TraceWriteLine("扫抢获取的VIN码为:" + strScanVIN); - if (strScanVIN.Length > 0) - { - tmdal.updateMaintenceInfo(strScanVIN, 3); - MyBase.TraceWriteLine("更新数据库中存储的VIN码:" + strScanVIN); - } - } - - private void initLPCControl() - { - lpcSoftwareSetup.labPicture.Click += new EventHandler(lpcSoftwareSetup_Click); - lpcSoftwareSetup.labText.Click += new EventHandler(lpcSoftwareSetup_Click); - - lpcToleranceSetup.labPicture.Click += new EventHandler(lpcToleranceSetup_Click); - lpcToleranceSetup.labText.Click += new EventHandler(lpcToleranceSetup_Click); - - lpcRange.labPicture.Click += new EventHandler(lpcRange_Click); - lpcRange.labText.Click += new EventHandler(lpcRange_Click); - - lpcPLCAddress.labPicture.Click += new EventHandler(lpcPLCAddress_Click); - lpcPLCAddress.labText.Click += new EventHandler(lpcPLCAddress_Click); - - lpcPLCTest.labPicture.Click += new EventHandler(lpcPLCTest_Click); - lpcPLCTest.labText.Click += new EventHandler(lpcPLCTest_Click); - - lpcAboutSoftware.labPicture.Click += new EventHandler(lpcAboutSoftware_Click); - lpcAboutSoftware.labText.Click += new EventHandler(lpcAboutSoftware_Click); - - lpcUploadIOTTest.labPicture.Click += new EventHandler(lpcUploadIOTTest_Click); - lpcUploadIOTTest.labText.Click += new EventHandler(lpcUploadIOTTest_Click); - - lpcTestGetCarTye.labPicture.Click += new EventHandler(lpcTestGetCarTye_Click); - lpcTestGetCarTye.labText.Click += new EventHandler(lpcTestGetCarTye_Click); - - lpcShowCarData.labPicture.Click += new EventHandler(lpcShowCarData_Click); - lpcShowCarData.labText.Click += new EventHandler(lpcShowCarData_Click); - - lpcShowLog.labPicture.Click += new EventHandler(lpcShowLog_Click); - lpcShowLog.labText.Click += new EventHandler(lpcShowLog_Click); - } - - - - private void CenterControl_FormClosed(object sender, FormClosedEventArgs e) - { - MyBase.TraceWriteLine("-------------海克斯康面隙分析软件程序关闭---------------------"); - LogDebugDfn.strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss"); - string CopyFileName = ConfigDfn.strFileFolder + "\\DebugFiles\\" + "Debug(" + LogDebugDfn.strStartTime + " To " + LogDebugDfn.strEndTime + ")" + ".txt"; - if (File.Exists(LogDebugDfn.strDebugFile)) - File.Copy(LogDebugDfn.strDebugFile, CopyFileName); - System.Environment.Exit(0); - } - - private void tmSystem_Tick(object sender, EventArgs e) - { - rleTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - if (ConfigDfn.iAnalysisCSVFlag == 1) - rleReadCSVStatus.ForeColor = bReadCSVFlag ? Color.Green : Color.White; - bReadCSVFlag = !bReadCSVFlag; - } - - #endregion 主窗口事件 - - private void tmReadNextsenseCSV_Tick(object sender, EventArgs e) - { - tmReadNextsenseCSV.Stop(); - AnalysisNextSenseSelfMeasureCSV(); - AnalysisNextSenseEH3CSV(); - AnalysisNextSenseEHYCSV(); - tmReadNextsenseCSV.Start(); - } - - #region⭐⭐⭐⭐⭐ 解析Nextsense CSV文件功能 核心算法 ⭐⭐⭐⭐⭐ - - private double CalculateStrictLowerTolerance(double dLower, double dUpper) - { - double dStrictLower = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dTolerancePer; - return dStrictLower; - } - - private double CalculateStrictUpperTolerance(double dLower, double dUpper) - { - double dStrictUpper = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dTolerancePer; - return dStrictUpper; - } - private double CalculateExceptionLowerTolerance(double dLower, double dUpper) - { - double dStrictLower = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dExceptionTolerancePer; - return dStrictLower; - } - - private double CalculateExceptionUpperTolerance(double dLower, double dUpper) - { - double dStrictUpper = 0; - double dNormalValue = (dLower + dUpper) / 2; - dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dExceptionTolerancePer; - return dStrictUpper; - } - /// - /// 解析EH3 CSV文件函数;后续如果Nextsense的csv报告模板变了,修改该函数的行号即可LineNum wsp - /// - private void AnalysisNextSenseEH3CSV() - { - try - { - lbCSVFiles.Items.Clear(); - FileInfo[] fileInfos = null; - if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) - { - DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEH3Path); - fileInfos = di.GetFiles("*.CSV"); - if (fileInfos.Count() >= 1) - { - MyBase.TraceWriteLine("存在EH3 CSV文件,开始解析:"); - List listCSVTitleInfo = new List(); - string strCarID = ""; - foreach (FileInfo fi in fileInfos) - { - listCSVTitleInfo.Clear(); - ListPostIOTData.Clear(); - dtCSVContent.Clear(); - dgvMeasureContent.Rows.Clear(); - string strCSVName = fi.FullName; - File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); - MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); - lbCSVFiles.Items.Add(fi.Name); - - #region 解析EH3 CSV报告 - - MyBase.TraceWriteLine("开始解析NextSense EH3 CSV 报告:" + strCSVName); - Encoding encoding = GetType(strCSVName); - FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); - StreamReader sr = new StreamReader(fs, encoding); - //记录每次读取的一行记录 - string strLine = ""; - //记录每行记录中的各字段内容 - string[] aryLineContent = null; - - //逐行读取CSV中的数据 - int LineNum = 0; - //表格行数 - int dtRowCount = 0; - //超差个数 - double OutCount = 0; - //Ok个数 - double OKCount = 0; - //异常个数 - double RejectedCount = 0; - //合格率 - double FPYPercent = 0; - double dStrictTLower = 0; - double dStrictTUpper = 0; - double dLowerValue = 0; - double dUpperValue = 0; - double dExcepitonTLower = 0; - double dExceptionTUpper = 0; - double dMeasureValue = 0.0; - DataTable dt = null; - while ((strLine = sr.ReadLine()) != null) - { - LineNum++; - if (LineNum >= 3 & LineNum <= 16) - { - listCSVTitleInfo.Add(strLine); - } - if (LineNum == 10) - { - aryLineContent = strLine.Split(','); - MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); - strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); - MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); - if (strCarID.ToLower().Contains("nofind")) - { - MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); - labVIN.Text = "L" + aryLineContent[1]; - strCarID = "L" + aryLineContent[1]; - } - else - { - labVIN.Text = strCarID; - tmdal.DeleteOneTTempVIN(strCarID); - MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); - } - } - if (LineNum >= 19) - { - aryLineContent = strLine.Split(','); - //ConfigDfn.strMeasureTime = aryLineContent[6].Substring(0, 4) + "-" + aryLineContent[6].Substring(4, 2) + "-" + aryLineContent[6].Substring(6, 2) + " " + aryLineContent[7].Substring(0, 2) + ":" + aryLineContent[7].Substring(2, 2) + ":" + aryLineContent[7].Substring(4, 2); - ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - double dNormalValue = 0.0d; - - dt = tmdal.SelectOneToleranceByCondition("EH3", aryLineContent[0], aryLineContent[1]); - if (dt.Rows.Count == 1) - { - dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); - dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); - dNormalValue = (dLowerValue + dUpperValue) / 2; - dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); - dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); - dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); - dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); - } - else - { - dStrictTLower = 0; - dStrictTUpper = 0; - dLowerValue = 0; - dUpperValue = 0; - MyBase.TraceWriteLine("EH3 " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一,请检查公差带配置!"); - } - - if (aryLineContent[2].ToLower().Contains("inv")) - { - aryLineContent[2]= ""; - aryLineContent[4] = "ng2"; - } - else - { - dMeasureValue = double.Parse(aryLineContent[2]); - if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) - { - aryLineContent[4] = "good"; - } - else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) - { - aryLineContent[4] = "ng1"; - } - else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) - { - aryLineContent[4] = "ng3"; - aryLineContent[2] = ""; - } - else - { - aryLineContent[4] = "ng2"; - } - } - - //测量数据存储到table里 - dtCSVContent.Rows.Add(strCarID, "EH3", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); - string strMeasureResult = aryLineContent[4].ToLower(); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - OKCount++; - aryLineContent[4] = "OK"; - } - else if ( strMeasureResult.Contains("ng2")) - { - OutCount++; - aryLineContent[4] = "NG"; - } - else - { - RejectedCount++; - aryLineContent[4] = ""; - aryLineContent[2] = ""; - } - - dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); - - CheryIOTData cIOTData = new CheryIOTData(); - cIOTData.vin = strCarID; - cIOTData.gfNo = aryLineContent[1]; - cIOTData.pointNumber = aryLineContent[0]; - cIOTData.actualValue = aryLineContent[2]; - cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - cIOTData.measurementResult = "OK"; - } - else - { - cIOTData.measurementResult = "NG"; - } - ListPostIOTData.Add(cIOTData); - dtRowCount++; - dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); - } - }//End While - sr.Close(); - fs.Close(); - tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); - MyBase.TraceWriteLine("解析EH3数据完成,并将所有测量数据插入到数据库完毕。"); - MyBase.TraceWriteLine("解析NextSense EH3 CSV 报告完毕!检测项数=" + dtRowCount.ToString()); - if (dtRowCount <= ConfigDfn.iMeasureItemsCount) - { - iCurrentMeasureItemsFailedCount++; - } - else - { - iCurrentMeasureItemsFailedCount = 0; - } - - // 连续多个车异常 - if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) - { - MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); - PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); - } - - // 单个报告内 invalued 项超过某个值 - - - - // 机器人忙碌状态 且 多个小时无测量报告 - - - - - - #endregion 解析EH3 CSV报告 - - #region 计算极差 - CalculateRange(strCarID, "EH3"); - Thread.Sleep(20); - DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - if (ConfigDfn.iIncludeRangeFlag == 1) - { - if (row.ItemArray[5].ToString().Contains("OK")) - { - OKCount++; - } - else - { - OutCount++; - } - } - - dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); - } - } - - if (ConfigDfn.iIncludeRangeFlag == 1) - { - dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; - for (int i = 1; i <= dtRowCount; i++) - { - dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); - } - - MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); - } - #endregion - - #region 界面显示功能 - - labCarType.Text = "EH3"; - TMeasureResultModel tmrm = new TMeasureResultModel(); - labNGCount.Text = OutCount.ToString(); - labOKCount.Text = OKCount.ToString(); - labRejectCount.Text = RejectedCount.ToString(); - labMeaTime.Text = ConfigDfn.strMeasureTime; - labSumMeasureCount.Text = dtRowCount.ToString(); - FPYPercent = OKCount / (OKCount + OutCount); - if (FPYPercent >= ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.LimeGreen; - labResult.ForeColor = Color.LimeGreen; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); - } - else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.Yellow; - labResult.ForeColor = Color.Yellow; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); - } - else - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "不合格"; - labResultPercent.ForeColor = Color.Red; - labResult.ForeColor = Color.Red; - pbResult.Image = Resources.NG; - tmrm.Result = 2; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); - } - xValues[0] = "合格 : " + OKCount.ToString(); - xValues[1] = "不合格 : " + OutCount.ToString(); - xValues[2] = "异常 : " + RejectedCount.ToString(); - yValues[0] = (int)OKCount; - yValues[1] = (int)OutCount; - yValues[2] = (int)RejectedCount; - chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); - - string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; - - tmrm.CarID = strCarID; - tmrm.CarType = "EH3"; - tmrm.SumMeasureItems = dtRowCount; - tmrm.GoodMeasureItems = (int)OKCount; - tmrm.NoGoodMeasureItems = (int)OutCount; - tmrm.RejectMeasureItems = (int)RejectedCount; - tmrm.FPY = FPYPercent.ToString("F4"); - tmrm.Remark = ""; - tmrm.MeasureDate = ConfigDfn.strMeasureTime; - tmdal.InsertTMeasureResult(tmrm); - MyBase.TraceWriteLine("将EH3总结果插入数据库完毕。"); - MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); - fi.Delete(); - dgvMeasureContent.Rows.Add(); - dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); - this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; - if (dgvMeasureContent.Rows.Count > 0) - { - SetdgvRowBgColor(dgvMeasureContent); - for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) - { - //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) - //{ - // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - //} - if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - } - else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; - } - else - { - } - } - } - - #endregion 界面显示功能 - - - //生成客户的 CSV文件 - if (ConfigDfn.iCreateReportFlag == 1) - { - #region 解析完报告后,重新生成客户模板报告 - - string filePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 - string strWithoutLCarVin = strCarID.Substring(1); - StringBuilder sb = new StringBuilder(); - //添加表头 - sb.Append("Measurement Info Name"); - sb.Append(","); - sb.Append("Measurement Info"); - sb.AppendLine(); - sb.Append("Date_Time"); - sb.Append(","); - sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); - sb.AppendLine(); - for (int i = 0; i < listCSVTitleInfo.Count; i++) - { - if (listCSVTitleInfo[i].Contains("prodnum")) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum", "Part_ident"); - } - if (listCSVTitleInfo[i].Contains(strWithoutLCarVin)) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace(strWithoutLCarVin, strCarID); - } - sb.Append(listCSVTitleInfo[i]); - sb.AppendLine(); - } - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - //添加测量数据 - sb.Append("Characteristic"); - sb.Append(","); - sb.Append("Extension"); - sb.Append(","); - sb.Append("Measured_Value"); - sb.AppendLine(); - foreach (DataRow row in dtCSVContent.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.Append(","); - sb.Append(row.ItemArray[7]); - sb.AppendLine(); - } - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append("G"); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.AppendLine(); - } - } - sb.Append("POP"); - sb.Append(","); - sb.Append("P"); - sb.Append(","); - sb.Append(Math.Round(FPYPercent * 100.00d, 2).ToString("F2")); - sb.AppendLine(); - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户csv报告生成完毕,路径为:" + filePath); - - #endregion 解析完报告后,重新生成客户模板报告 - } - else - { - MyBase.TraceWriteLine("EH3数据生成报告功能未启用!"); - } - - #region Update Data To IOT - - if (ConfigDfn.iStartIOTFlag == 1) - { - bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); - if (bVINMeasuedFlag) - { - MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); - } - else - { - #region IOT上传功能 - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - CheryIOTData cIOTData = new CheryIOTData(); - cIOTData.vin = strCarID; - cIOTData.gfNo = "G"; - cIOTData.pointNumber = row.ItemArray[2].ToString(); - cIOTData.actualValue = row.ItemArray[3].ToString(); - cIOTData.controlLine = row.ItemArray[4].ToString(); - cIOTData.measurementResult = row.ItemArray[5].ToString(); - if (cIOTData.measurementResult.ToUpper().Contains("NG")) - { - if (!cIOTData.actualValue.ToLower().Contains("inv")) - { - dLowerValue = double.Parse(row.ItemArray[4].ToString().Substring(0, 3)); - dUpperValue = double.Parse(row.ItemArray[4].ToString().Substring(4, 3)); - dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); - dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); - double dValue = double.Parse(row.ItemArray[3].ToString()); - if (dValue > dStrictTLower && dValue < dStrictTUpper) - { - cIOTData.measurementResult = "OK"; - } - } - } - ListPostIOTData.Add(cIOTData); - } - } - string strGapList = JsonHelper.ObjectToJson(ListPostIOTData); - string strCaliResult = "OK"; - if (labResult.Text == "合格") - { - strCaliResult = "OK"; - } - else - { - strCaliResult = "NG"; - } - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strCarID + "\",\"model\":\"EH3\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"" + strCaliResult + "\",\"detectionTime\":\"" + ConfigDfn.strMeasureTime + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"" + labResultPercent.Text + "\",\"GapList\":" + strGapList + "}]}"; - MyBase.TraceWriteLine("Update To IOT Data Content: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); - MyBase.TraceWriteLine("EH3数据上传IOT完成,结果返回为:" + strPostResult); - if (strPostResult.Contains("成功")) - { - MyBase.TraceWriteLine("EH3数据上传IOT成功 ^_^"); - } - else - { - MyBase.TraceWriteLine("EH3数据上传IOT失败!"); - } - - #endregion IOT上传功能 - } - } - else - { - MyBase.TraceWriteLine("数据上传IOT功能未启用!"); - } - - #endregion Update Data To IOT - } - } - } - //else - //{ - // MyBase.TraceWriteLine("错误:AnalysisNextSenseEH3CSV函数中,检测EH3 CSV 路径不存在:" + ConfigDfn.strNextSenseCSVPath); - //} - } - catch (Exception ex) - { - MyBase.TraceWriteLine("AnalysisNextSenseCSV 函数分析异常:" + ex.ToString()); - } - } - - private void AnalysisNextSenseEHYCSV() - { - try - { - lbCSVFiles.Items.Clear(); - FileInfo[] fileInfos = null; - if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) - { - DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEHYPath); - fileInfos = di.GetFiles("*.CSV"); - if (fileInfos.Count() >= 1) - { - MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); - List listCSVTitleInfo = new List(); - string strCarID = ""; - foreach (FileInfo fi in fileInfos) - { - listCSVTitleInfo.Clear(); - ListPostIOTData.Clear(); - dtCSVContent.Clear(); - dgvMeasureContent.Rows.Clear(); - string strCSVName = fi.FullName; - File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); - MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); - lbCSVFiles.Items.Add(fi.Name); - - #region 解析EHY CSV报告 - - MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); - Encoding encoding = GetType(strCSVName); - FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); - StreamReader sr = new StreamReader(fs, encoding); - //记录每次读取的一行记录 - string strLine = ""; - //记录每行记录中的各字段内容 - string[] aryLineContent = null; - - //逐行读取CSV中的数据 - int LineNum = 0; - //表格行数 - int dtRowCount = 0; - //超差个数 - double OutCount = 0; - //Ok个数 - double OKCount = 0; - //异常个数 - double RejectedCount = 0; - //合格率 - double FPYPercent = 0; - double dStrictTLower = 0; - double dStrictTUpper = 0; - double dLowerValue = 0; - double dUpperValue = 0; - double dExcepitonTLower = 0; - double dExceptionTUpper = 0; - double dMeasureValue = 0.0; - DataTable dt = null; - while ((strLine = sr.ReadLine()) != null) - { - LineNum++; - if (LineNum >= 3 & LineNum <= 16) - { - listCSVTitleInfo.Add(strLine); - } - if (LineNum == 10) - { - aryLineContent = strLine.Split(','); - MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); - strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); - MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); - if (strCarID.ToLower().Contains("nofind")) - { - MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); - labVIN.Text = "L" + aryLineContent[1]; - strCarID = "L" + aryLineContent[1]; - } - else - { - labVIN.Text = strCarID; - tmdal.DeleteOneTTempVIN(strCarID); - MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); - } - } - if (LineNum >= 19) - { - aryLineContent = strLine.Split(','); - ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - double dNormalValue = 0.0d; - - dt = tmdal.SelectOneToleranceByCondition("EHY", aryLineContent[0], aryLineContent[1]); - if (dt.Rows.Count == 1) - { - dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); - dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); - dNormalValue = (dLowerValue + dUpperValue) / 2; - dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); - dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); - dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); - dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); - } - else - { - dStrictTLower = 0; - dStrictTUpper = 0; - dLowerValue = 0; - dUpperValue = 0; - MyBase.TraceWriteLine("EHY " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一或不存在,请检查公差带配置!"); - } - - if (aryLineContent[2].ToLower().Contains("inv")) - { + private void CenterControl_Load(object sender, EventArgs e) + { + #region 初始化全局变量 + fLEHY = new FEHYLeftCarData(this); + fREHY = new FEHYRightCarData(this); + fLEH3 = new FEH3LeftCarData(this); + fREH3 = new FEH3RightCarData(this); + MyBase.rleMessage = rleMessage; + rdtpStartTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); + rdtpEndTime.Text = DateTime.Now.ToString("yyyy-MM-dd"); + + #endregion 初始化全局变量 + //需要显示车身数据 不分析csv文件 + if (ConfigDfn.iShowCarDataFlag == 1) + { + MyBase.TraceWriteLine(" 进入显示车身模式!显示车身界面。"); + lpcShowCarData_Click(null, null); + //serialPort = new SerialPort(ConfigDfn.strCOMPort, 115200, Parity.None, 8, StopBits.One); // 设置串口参数 + //serialPort.DataReceived += new SerialDataReceivedEventHandler(DataAutoReceivedHandler); // 注册数据接收事件处理方法 + //serialPort.Open(); // 打开串口 + //if (serialPort.IsOpen) + //{ + // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开成功O(∩_∩)O"); + //} + //else + //{ + // MyBase.TraceWriteLine(ConfigDfn.strCOMPort + "打开失败!"); + // MessageBox.Show(ConfigDfn.strCOMPort + "打开失败!请检查扫抢串口设置是否正确。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); + //} + } + else + { + MyBase.TraceWriteLine(" 进入不显示车身模式!"); + } + if (ConfigDfn.iAnalysisCSVFlag == 1) + { + btnConnectPlc_Click(null, null); + MyBase.TraceWriteLine(" 进入解析CSV文件模式,开始解析扫码CSV文件!"); + tmReadNextsenseCSV.Interval = 500; + tmReadNextsenseCSV.Start(); + //tmdal.updateMaintenceInfoEmpty(); + } + else + { + MyBase.TraceWriteLine(" 进入不解析CSV文件模式!"); + tmReadNextsenseCSV.Stop(); + } + + if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) + { + MyBase.TraceWriteLine("软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEH3Path); + } + else + { + string strTip = "错误:软件首次启动,读取NextSense生成EH3 CSV报告的路径:" + ConfigDfn.strNextSenseCSVEH3Path + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; + MyBase.TraceWriteLine(strTip); + Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); + //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); + //if (dResult == DialogResult.Yes) + //{ + // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEH3Path); + // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEH3Path); + //} + //else + //{ + // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); + //} + } + if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) + { + MyBase.TraceWriteLine("软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:" + ConfigDfn.strNextSenseCSVEHYPath); + } + else + { + string strTip = "错误:软件首次启动,读取NextSense生成EHY CSV报告的路径:" + ConfigDfn.strNextSenseCSVEHYPath + " 不存在!请检查并进行修改!点击是按钮,软件将自动创建该路径!"; + MyBase.TraceWriteLine(strTip); + Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); + //DialogResult dResult = MessageBox.Show(strTip, "错误", MessageBoxButtons.YesNo, MessageBoxIcon.Error); + //if (dResult == DialogResult.Yes) + //{ + // Directory.CreateDirectory(ConfigDfn.strNextSenseCSVEHYPath); + // MyBase.TraceWriteLine(strTip + " ; 点击了是按钮,软件自动创建读取目录:" + ConfigDfn.strNextSenseCSVEHYPath); + //} + //else + //{ + // MyBase.TraceWriteLine(strTip + " ;点击了否按钮,不创建目录!"); + //} + } + initLPCControl(); + + //tmdal.updateMaintenceInfoEmpty(); + //iLastMesureCount = tmdal.SelectTMeasureResultCount(); + + #region 清空信息 + + labVIN.Text = ""; + labOKCount.Text = ""; + labNGCount.Text = ""; + labRejectCount.Text = ""; + labSumMeasureCount.Text = ""; + labMeaTime.Text = ""; + labResultPercent.Text = ""; + labResult.Text = ""; + labCarType.Text = ""; + + #endregion 清空信息 + + InitTableColumns(); + strSaveReprotPath = ConfigDfn.strReportPath + @"\"; + + //testIotUpload(); + } + + private void InitTableColumns() + { + #region 测量数据表始化表 + + //创建虚拟表 + DataColumn column2 = new DataColumn("CarID", Type.GetType("System.String")); + DataColumn dcCarType = new DataColumn("CarType", Type.GetType("System.String")); + DataColumn column3 = new DataColumn("MeasPointName", Type.GetType("System.String")); + DataColumn column4 = new DataColumn("DimensionName", Type.GetType("System.String")); + DataColumn column5 = new DataColumn("NormalValue", Type.GetType("System.String")); + DataColumn column6 = new DataColumn("LowerTolVal", Type.GetType("System.String")); + DataColumn column7 = new DataColumn("UpperTolVal", Type.GetType("System.String")); + DataColumn column8 = new DataColumn("MeasureValue", Type.GetType("System.String")); + DataColumn column10 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); + DataColumn column9 = new DataColumn("MeasureDate", Type.GetType("System.DateTime")); + DataColumn column1 = new DataColumn("Remark", Type.GetType("System.String")); + //将列添加到table表中 + + dtCSVContent.Columns.Add(column2); + dtCSVContent.Columns.Add(dcCarType); + dtCSVContent.Columns.Add(column3); + dtCSVContent.Columns.Add(column4); + dtCSVContent.Columns.Add(column5); + dtCSVContent.Columns.Add(column6); + dtCSVContent.Columns.Add(column7); + dtCSVContent.Columns.Add(column8); + dtCSVContent.Columns.Add(column10); + dtCSVContent.Columns.Add(column9); + dtCSVContent.Columns.Add(column1); + + #endregion 测量数据表始化表 + + #region 极差数据Table初始化 + + //创建虚拟表 + DataColumn dcCarID = new DataColumn("CarID", Type.GetType("System.String")); + DataColumn dcRangeName = new DataColumn("RangeName", Type.GetType("System.String")); + DataColumn dcRangeValue = new DataColumn("RangeValue", Type.GetType("System.String")); + DataColumn dcRangeLowUpp = new DataColumn("RangeLowUpp", Type.GetType("System.String")); + DataColumn dcResult = new DataColumn("Result", Type.GetType("System.String")); + DataColumn dcCreateTime = new DataColumn("CreateTime", Type.GetType("System.DateTime")); + DataColumn dcRemark = new DataColumn("Remark", Type.GetType("System.String")); + //将列添加到table表中 + + dtRangeData.Columns.Add(dcCarID); + dtRangeData.Columns.Add(dcRangeName); + dtRangeData.Columns.Add(dcRangeValue); + dtRangeData.Columns.Add(dcRangeLowUpp); + dtRangeData.Columns.Add(dcResult); + dtRangeData.Columns.Add(dcCreateTime); + dtRangeData.Columns.Add(dcRemark); + + #endregion 极差数据Table初始化 + + #region 分页相关 + + //创建分页虚拟表 + DataColumn column11 = new DataColumn("CarID", Type.GetType("System.String")); + DataColumn column12 = new DataColumn("MeasPointName", Type.GetType("System.String")); + DataColumn column13 = new DataColumn("DimensionName", Type.GetType("System.String")); + DataColumn column14 = new DataColumn("NormalValue", Type.GetType("System.String")); + DataColumn column15 = new DataColumn("LowerTolVal", Type.GetType("System.String")); + DataColumn column16 = new DataColumn("UpperTolVal", Type.GetType("System.String")); + DataColumn column17 = new DataColumn("MeasureValue", Type.GetType("System.String")); + DataColumn column18 = new DataColumn("MeasureDate", Type.GetType("System.String")); + DataColumn column19 = new DataColumn("MeasureItemResult", Type.GetType("System.String")); + + //将列添加到table表中 + PageTable.Columns.Add(column11); + PageTable.Columns.Add(column12); + PageTable.Columns.Add(column13); + PageTable.Columns.Add(column14); + PageTable.Columns.Add(column15); + PageTable.Columns.Add(column16); + PageTable.Columns.Add(column17); + PageTable.Columns.Add(column18); + PageTable.Columns.Add(column19); + + labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 + labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 + labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 + rddlPageRecorderCount.SelectedIndex = 0; + + #endregion 分页相关 + } + + private void DataAutoReceivedHandler(object sender, SerialDataReceivedEventArgs e) + { + SerialPort sp = (SerialPort)sender; + string strScanVIN = sp.ReadExisting(); + MyBase.TraceWriteLine("扫抢获取的VIN码为:" + strScanVIN); + if (strScanVIN.Length > 0) + { + tmdal.updateMaintenceInfo(strScanVIN, 3); + MyBase.TraceWriteLine("更新数据库中存储的VIN码:" + strScanVIN); + } + } + + private void initLPCControl() + { + lpcSoftwareSetup.labPicture.Click += new EventHandler(lpcSoftwareSetup_Click); + lpcSoftwareSetup.labText.Click += new EventHandler(lpcSoftwareSetup_Click); + + lpcToleranceSetup.labPicture.Click += new EventHandler(lpcToleranceSetup_Click); + lpcToleranceSetup.labText.Click += new EventHandler(lpcToleranceSetup_Click); + + lpcRange.labPicture.Click += new EventHandler(lpcRange_Click); + lpcRange.labText.Click += new EventHandler(lpcRange_Click); + + lpcPLCAddress.labPicture.Click += new EventHandler(lpcPLCAddress_Click); + lpcPLCAddress.labText.Click += new EventHandler(lpcPLCAddress_Click); + + lpcPLCTest.labPicture.Click += new EventHandler(lpcPLCTest_Click); + lpcPLCTest.labText.Click += new EventHandler(lpcPLCTest_Click); + + lpcAboutSoftware.labPicture.Click += new EventHandler(lpcAboutSoftware_Click); + lpcAboutSoftware.labText.Click += new EventHandler(lpcAboutSoftware_Click); + + lpcUploadIOTTest.labPicture.Click += new EventHandler(lpcUploadIOTTest_Click); + lpcUploadIOTTest.labText.Click += new EventHandler(lpcUploadIOTTest_Click); + + lpcTestGetCarTye.labPicture.Click += new EventHandler(lpcTestGetCarTye_Click); + lpcTestGetCarTye.labText.Click += new EventHandler(lpcTestGetCarTye_Click); + + lpcShowCarData.labPicture.Click += new EventHandler(lpcShowCarData_Click); + lpcShowCarData.labText.Click += new EventHandler(lpcShowCarData_Click); + + lpcShowLog.labPicture.Click += new EventHandler(lpcShowLog_Click); + lpcShowLog.labText.Click += new EventHandler(lpcShowLog_Click); + } + + private void CenterControl_FormClosed(object sender, FormClosedEventArgs e) + { + MyBase.TraceWriteLine("-------------海克斯康面隙分析软件程序关闭---------------------"); + LogDebugDfn.strEndTime = DateTime.Now.ToString("yyyy.MM.dd HH-mm-ss"); + string CopyFileName = ConfigDfn.strFileFolder + "\\DebugFiles\\" + "Debug(" + LogDebugDfn.strStartTime + " To " + LogDebugDfn.strEndTime + ")" + ".txt"; + if (File.Exists(LogDebugDfn.strDebugFile)) + File.Copy(LogDebugDfn.strDebugFile, CopyFileName); + System.Environment.Exit(0); + } + + private void tmSystem_Tick(object sender, EventArgs e) + { + rleTime.Text = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + if (ConfigDfn.iAnalysisCSVFlag == 1) + rleReadCSVStatus.ForeColor = bReadCSVFlag ? Color.Green : Color.White; + bReadCSVFlag = !bReadCSVFlag; + } + + #endregion 主窗口事件 + + private void tmReadNextsenseCSV_Tick(object sender, EventArgs e) + { + tmReadNextsenseCSV.Stop(); + AnalysisNextSenseSelfMeasureCSV(); + AnalysisNextSenseEH3CSV(); + AnalysisNextSenseEHYCSV(); + tmReadNextsenseCSV.Start(); + } + + #region⭐⭐⭐⭐⭐ 解析Nextsense CSV文件功能 核心算法 ⭐⭐⭐⭐⭐ + + private double CalculateStrictLowerTolerance(double dLower, double dUpper) + { + double dStrictLower = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dTolerancePer; + return dStrictLower; + } + + private double CalculateStrictUpperTolerance(double dLower, double dUpper) + { + double dStrictUpper = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dTolerancePer; + return dStrictUpper; + } + + private double CalculateExceptionLowerTolerance(double dLower, double dUpper) + { + double dStrictLower = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictLower = dNormalValue + (dLower - dNormalValue) * ConfigDfn.dExceptionTolerancePer; + return dStrictLower; + } + + private double CalculateExceptionUpperTolerance(double dLower, double dUpper) + { + double dStrictUpper = 0; + double dNormalValue = (dLower + dUpper) / 2; + dStrictUpper = dNormalValue + (dUpper - dNormalValue) * ConfigDfn.dExceptionTolerancePer; + return dStrictUpper; + } + + /// + /// 解析EH3 CSV文件函数;后续如果Nextsense的csv报告模板变了,修改该函数的行号即可LineNum wsp + /// + private void AnalysisNextSenseEH3CSV() + { + try + { + lbCSVFiles.Items.Clear(); + FileInfo[] fileInfos = null; + if (Directory.Exists(ConfigDfn.strNextSenseCSVEH3Path)) + { + DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEH3Path); + fileInfos = di.GetFiles("*.CSV"); + if (fileInfos.Count() >= 1) + { + MyBase.TraceWriteLine("存在EH3 CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = ""; + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.Clear(); + dgvMeasureContent.Rows.Clear(); + string strCSVName = fi.FullName; + File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); + MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); + lbCSVFiles.Items.Add(fi.Name); + + #region 解析EH3 CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense EH3 CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); + StreamReader sr = new StreamReader(fs, encoding); + //记录每次读取的一行记录 + string strLine = ""; + //记录每行记录中的各字段内容 + string[] aryLineContent = null; + + //逐行读取CSV中的数据 + int LineNum = 0; + //表格行数 + int dtRowCount = 0; + //超差个数 + double OutCount = 0; + //Ok个数 + double OKCount = 0; + //异常个数 + double RejectedCount = 0; + //合格率 + double FPYPercent = 0; + double dStrictTLower = 0; + double dStrictTUpper = 0; + double dLowerValue = 0; + double dUpperValue = 0; + double dExcepitonTLower = 0; + double dExceptionTUpper = 0; + double dMeasureValue = 0.0; + DataTable dt = null; + while ((strLine = sr.ReadLine()) != null) + { + LineNum++; + if (LineNum >= 3 & LineNum <= 16) + { + listCSVTitleInfo.Add(strLine); + } + if (LineNum == 10) + { + aryLineContent = strLine.Split(','); + MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); + strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); + MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); + if (strCarID.ToLower().Contains("nofind")) + { + MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); + labVIN.Text = "L" + aryLineContent[1]; + strCarID = "L" + aryLineContent[1]; + } + else + { + labVIN.Text = strCarID; + tmdal.DeleteOneTTempVIN(strCarID); + MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); + } + + // 向 strNextsenseDataPath 文件中插入数据 strCarID + AppendRecord(strCarID, strNextsenseDataPath); + } + if (LineNum >= 19) + { + aryLineContent = strLine.Split(','); + //ConfigDfn.strMeasureTime = aryLineContent[6].Substring(0, 4) + "-" + aryLineContent[6].Substring(4, 2) + "-" + aryLineContent[6].Substring(6, 2) + " " + aryLineContent[7].Substring(0, 2) + ":" + aryLineContent[7].Substring(2, 2) + ":" + aryLineContent[7].Substring(4, 2); + ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + double dNormalValue = 0.0d; + + dt = tmdal.SelectOneToleranceByCondition("EH3", aryLineContent[0], aryLineContent[1]); + if (dt.Rows.Count == 1) + { + dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); + dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); + dNormalValue = (dLowerValue + dUpperValue) / 2; + dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); + dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); + dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); + dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); + } + else + { + dStrictTLower = 0; + dStrictTUpper = 0; + dLowerValue = 0; + dUpperValue = 0; + MyBase.TraceWriteLine("EH3 " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一,请检查公差带配置!"); + } + + if (aryLineContent[2].ToLower().Contains("inv")) + { aryLineContent[2] = ""; aryLineContent[4] = "ng2"; - } - else - { - dMeasureValue = double.Parse(aryLineContent[2]); - if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) - { - aryLineContent[4] = "good"; - } - else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) - { - aryLineContent[4] = "ng1"; - } - else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) - { - aryLineContent[4] = "ng3"; - aryLineContent[2] = ""; - } - else - { - aryLineContent[4] = "ng2"; - } - } + } + else + { + dMeasureValue = double.Parse(aryLineContent[2]); + if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) + { + aryLineContent[4] = "good"; + } + else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) + { + aryLineContent[4] = "ng1"; + } + else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) + { + aryLineContent[4] = "ng3"; + aryLineContent[2] = ""; + } + else + { + aryLineContent[4] = "ng2"; + } + } - //测量数据存储到table里 - dtCSVContent.Rows.Add(strCarID, "EHY", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); - string strMeasureResult = aryLineContent[4].ToLower(); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - OKCount++; - aryLineContent[4] = "OK"; - } - else if ( strMeasureResult.Contains("ng2")) - { - OutCount++; - aryLineContent[4] = "NG"; - } - else - { - RejectedCount++; - aryLineContent[4] = ""; - aryLineContent[2] = ""; - } + //测量数据存储到table里 + dtCSVContent.Rows.Add(strCarID, "EH3", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); + string strMeasureResult = aryLineContent[4].ToLower(); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + OKCount++; + aryLineContent[4] = "OK"; + } + else if (strMeasureResult.Contains("ng2")) + { + OutCount++; + aryLineContent[4] = "NG"; + } + else + { + RejectedCount++; + aryLineContent[4] = ""; + aryLineContent[2] = ""; + } - dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); + dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); - CheryIOTData cIOTData = new CheryIOTData(); - cIOTData.vin = strCarID; - cIOTData.gfNo = aryLineContent[1]; - cIOTData.pointNumber = aryLineContent[0]; - cIOTData.actualValue = aryLineContent[2]; - cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); - if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) - { - cIOTData.measurementResult = "OK"; - } - else - { - cIOTData.measurementResult = "NG"; - } - ListPostIOTData.Add(cIOTData); - dtRowCount++; - dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); - } - }//End While - sr.Close(); - fs.Close(); - tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); - MyBase.TraceWriteLine("解析EHY数据完成,并将所有测量数据插入到数据库完毕。"); - MyBase.TraceWriteLine("解析NextSense EHY CSV 报告完毕!检查数量=" + dtRowCount.ToString()); - if (dtRowCount <= ConfigDfn.iMeasureItemsCount) - { - iCurrentMeasureItemsFailedCount++; - } - else - { - iCurrentMeasureItemsFailedCount = 0; - } + CheryIOTData cIOTData = new CheryIOTData(); + cIOTData.vin = strCarID; + cIOTData.gfNo = aryLineContent[1]; + cIOTData.pointNumber = aryLineContent[0]; + cIOTData.actualValue = aryLineContent[2]; + cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + cIOTData.measurementResult = "OK"; + } + else + { + cIOTData.measurementResult = "NG"; + } + ListPostIOTData.Add(cIOTData); + dtRowCount++; + dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); + } + }//End While + sr.Close(); + fs.Close(); + tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); + MyBase.TraceWriteLine("解析EH3数据完成,并将所有测量数据插入到数据库完毕。"); + MyBase.TraceWriteLine("解析NextSense EH3 CSV 报告完毕!检测项数=" + dtRowCount.ToString()); + if (dtRowCount <= ConfigDfn.iMeasureItemsCount) + { + iCurrentMeasureItemsFailedCount++; + } + else + { + iCurrentMeasureItemsFailedCount = 0; + } - if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) - { - MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); - PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); - } - #endregion 解析EHY CSV报告 + // 连续多个车异常 + if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) + { + MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); + PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); + } - #region 计算极差 - CalculateRange(strCarID, "EHY"); - Thread.Sleep(20); - DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - if (ConfigDfn.iIncludeRangeFlag == 1) - { - if (row.ItemArray[5].ToString().Contains("OK")) - { - OKCount++; - } - else - { - OutCount++; - } - } + // 单个报告内 invalued 项超过某个值 - dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); - } - } + // 机器人忙碌状态 且 多个小时无测量报告 - if (ConfigDfn.iIncludeRangeFlag == 1) - { - dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; - for (int i = 1; i <= dtRowCount; i++) - { - dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); - } - MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); - } + #endregion 解析EH3 CSV报告 - #endregion + #region 计算极差 + CalculateRange(strCarID, "EH3"); + Thread.Sleep(20); + DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + if (ConfigDfn.iIncludeRangeFlag == 1) + { + if (row.ItemArray[5].ToString().Contains("OK")) + { + OKCount++; + } + else + { + OutCount++; + } + } - #region 界面显示功能 + dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); + } + } - labCarType.Text = "EHY"; - TMeasureResultModel tmrm = new TMeasureResultModel(); - labNGCount.Text = OutCount.ToString(); - labOKCount.Text = OKCount.ToString(); - labRejectCount.Text = RejectedCount.ToString(); - labMeaTime.Text = ConfigDfn.strMeasureTime; - labSumMeasureCount.Text = dtRowCount.ToString(); - FPYPercent = OKCount / (OKCount + OutCount); - if (FPYPercent >= ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.LimeGreen; - labResult.ForeColor = Color.LimeGreen; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); - } - else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "合格"; - labResultPercent.ForeColor = Color.Yellow; - labResult.ForeColor = Color.Yellow; - pbResult.Image = Resources.OK; - tmrm.Result = 1; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); - } - else - { - labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; - labResult.Text = "不合格"; - labResultPercent.ForeColor = Color.Red; - labResult.ForeColor = Color.Red; - pbResult.Image = Resources.NG; - tmrm.Result = 2; - PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); - } - xValues[0] = "合格 : " + OKCount.ToString(); - xValues[1] = "不合格 : " + OutCount.ToString(); - xValues[2] = "异常 : " + RejectedCount.ToString(); - yValues[0] = (int)OKCount; - yValues[1] = (int)OutCount; - yValues[2] = (int)RejectedCount; - chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); + if (ConfigDfn.iIncludeRangeFlag == 1) + { + dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; + for (int i = 1; i <= dtRowCount; i++) + { + dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); + } - string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); + } + #endregion 计算极差 - tmrm.CarID = strCarID; - tmrm.CarType = "EHY"; - tmrm.SumMeasureItems = dtRowCount; - tmrm.GoodMeasureItems = (int)OKCount; - tmrm.NoGoodMeasureItems = (int)OutCount; - tmrm.RejectMeasureItems = (int)RejectedCount; - tmrm.FPY = FPYPercent.ToString("F4"); - tmrm.Remark = ""; - tmrm.MeasureDate = ConfigDfn.strMeasureTime; - tmdal.InsertTMeasureResult(tmrm); - MyBase.TraceWriteLine("将总结果插入数据库完毕。"); - MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); - fi.Delete(); + #region 界面显示功能 - dgvMeasureContent.Rows.Add(); - dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); - this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; - if (dgvMeasureContent.Rows.Count > 0) - { - SetdgvRowBgColor(dgvMeasureContent); - for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) - { - //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) - //{ - // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - //} - if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - } - else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) - { - dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; - } - else - { - } - } - } + labCarType.Text = "EH3"; + TMeasureResultModel tmrm = new TMeasureResultModel(); + labNGCount.Text = OutCount.ToString(); + labOKCount.Text = OKCount.ToString(); + labRejectCount.Text = RejectedCount.ToString(); + labMeaTime.Text = ConfigDfn.strMeasureTime; + labSumMeasureCount.Text = dtRowCount.ToString(); + FPYPercent = OKCount / (OKCount + OutCount); + if (FPYPercent >= ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.LimeGreen; + labResult.ForeColor = Color.LimeGreen; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); + } + else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.Yellow; + labResult.ForeColor = Color.Yellow; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); + } + else + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "不合格"; + labResultPercent.ForeColor = Color.Red; + labResult.ForeColor = Color.Red; + pbResult.Image = Resources.NG; + tmrm.Result = 2; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); + } + xValues[0] = "合格 : " + OKCount.ToString(); + xValues[1] = "不合格 : " + OutCount.ToString(); + xValues[2] = "异常 : " + RejectedCount.ToString(); + yValues[0] = (int)OKCount; + yValues[1] = (int)OutCount; + yValues[2] = (int)RejectedCount; + chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); - #endregion 界面显示功能 + string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + tmrm.CarID = strCarID; + tmrm.CarType = "EH3"; + tmrm.SumMeasureItems = dtRowCount; + tmrm.GoodMeasureItems = (int)OKCount; + tmrm.NoGoodMeasureItems = (int)OutCount; + tmrm.RejectMeasureItems = (int)RejectedCount; + tmrm.FPY = FPYPercent.ToString("F4"); + tmrm.Remark = ""; + tmrm.MeasureDate = ConfigDfn.strMeasureTime; + tmdal.InsertTMeasureResult(tmrm); + MyBase.TraceWriteLine("将EH3总结果插入数据库完毕。"); + MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); + fi.Delete(); + dgvMeasureContent.Rows.Add(); + dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); + this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; + if (dgvMeasureContent.Rows.Count > 0) + { + SetdgvRowBgColor(dgvMeasureContent); + for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) + { + //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) + //{ + // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + //} + if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + } + else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; + } + else + { + } + } + } - if (ConfigDfn.iCreateReportFlag == 1) - { - #region 解析完报告后,重新生成客户模板报告 + #endregion 界面显示功能 - MyBase.TraceWriteLine("开始生成客户所需要的CSV格式文件:"); - string filePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 - string strWithoutLCarVin = strCarID.Substring(1); - StringBuilder sb = new StringBuilder(); - //添加表头 - sb.Append("Measurement Info Name"); - sb.Append(","); - sb.Append("Measurement Info"); - sb.AppendLine(); - sb.Append("Date_Time"); - sb.Append(","); - sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); - sb.AppendLine(); - for (int i = 0; i < listCSVTitleInfo.Count; i++) - { - if (listCSVTitleInfo[i].Contains("prodnum")) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum", "Part_ident"); - } - if (listCSVTitleInfo[i].Contains(strWithoutLCarVin)) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace(strWithoutLCarVin, strCarID); - } - sb.Append(listCSVTitleInfo[i]); - sb.AppendLine(); - } - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - //添加测量数据 - sb.Append("Characteristic"); - sb.Append(","); - sb.Append("Extension"); - sb.Append(","); - sb.Append("Measured_Value"); - sb.AppendLine(); - foreach (DataRow row in dtCSVContent.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.Append(","); - sb.Append(row.ItemArray[7]); - sb.AppendLine(); - } - if (dtAllRangeDate.Rows.Count > 0) - { - foreach (DataRow row in dtAllRangeDate.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append("G"); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.AppendLine(); - } - } - sb.Append("POP"); - sb.Append(","); - sb.Append("P"); - sb.Append(","); - sb.Append(Math.Round(FPYPercent * 100.00d, 2).ToString("F2")); - sb.AppendLine(); - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户EHY csv报告生成完毕,路径为:" + filePath); + //生成客户的 CSV文件 + if (ConfigDfn.iCreateReportFlag == 1) + { + GenUserReportCSV(strCarID, listCSVTitleInfo, dtAllRangeDate, FPYPercent); + } + else + { + MyBase.TraceWriteLine("EH3数据生成报告功能未启用!"); + } - #endregion 解析完报告后,重新生成客户模板报告 - } - else - { - MyBase.TraceWriteLine("iCreateReportFlag=0 : EHY数据生成报告功能未启用!"); - } + #region Update Data To IOT + if (ConfigDfn.iStartIOTFlag == 1) + { + bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); + if (bVINMeasuedFlag) + { + MyBase.TraceWriteLine("VIN:" + strCarID + " 该VIN码已经在数据库中存在了,说明已经测量过了,不再进行IOT数据上传操作。"); + } + else + { + #region IOT上传功能 + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + CheryIOTData cIOTData = new CheryIOTData(); + cIOTData.vin = strCarID; + cIOTData.gfNo = "G"; + cIOTData.pointNumber = row.ItemArray[2].ToString(); + cIOTData.actualValue = row.ItemArray[3].ToString(); + cIOTData.controlLine = row.ItemArray[4].ToString(); + cIOTData.measurementResult = row.ItemArray[5].ToString(); + if (cIOTData.measurementResult.ToUpper().Contains("NG")) + { + if (!string.IsNullOrEmpty(cIOTData.actualValue) && !cIOTData.actualValue.ToLower().Contains("inv")) //避免为空的情况 + { + dLowerValue = double.Parse(row.ItemArray[4].ToString().Substring(0, 3)); + dUpperValue = double.Parse(row.ItemArray[4].ToString().Substring(4, 3)); + dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); + dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); + double dValue = double.Parse(row.ItemArray[3].ToString()); + if (dValue > dStrictTLower && dValue < dStrictTUpper) + { + cIOTData.measurementResult = "OK"; + } + } + } + ListPostIOTData.Add(cIOTData); + } + } + string strGapList = JsonHelper.ObjectToJson(ListPostIOTData); + string strCaliResult = "OK"; + if (labResult.Text == "合格") + { + strCaliResult = "OK"; + } + else + { + strCaliResult = "NG"; + } + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strCarID + "\",\"model\":\"EH3\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"" + strCaliResult + "\",\"detectionTime\":\"" + ConfigDfn.strMeasureTime + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"" + labResultPercent.Text + "\",\"GapList\":" + strGapList + "}]}"; + MyBase.TraceWriteLine("Update To IOT Data Content: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); + MyBase.TraceWriteLine("EH3数据上传IOT完成,结果返回为:" + strPostResult); + if (strPostResult.Contains("成功")) + { + MyBase.TraceWriteLine("EH3数据上传IOT成功 ^_^"); + } + else + { + MyBase.TraceWriteLine("EH3数据上传IOT失败!"); + } - #region Update Data To IOT + #endregion IOT上传功能 + } + } + else + { + MyBase.TraceWriteLine("数据上传IOT功能未启用!"); + } - if (ConfigDfn.iStartIOTFlag == 1) - { + #endregion Update Data To IOT + } + } + } + //else + //{ + // MyBase.TraceWriteLine("错误:AnalysisNextSenseEH3CSV函数中,检测EH3 CSV 路径不存在:" + ConfigDfn.strNextSenseCSVPath); + //} + } + catch (Exception ex) + { + MyBase.TraceWriteLine("AnalysisNextSenseCSV 函数分析异常:" + ex.ToString()); + } + } + private void AnalysisNextSenseEHYCSV() + { + try + { + lbCSVFiles.Items.Clear(); + FileInfo[] fileInfos = null; + if (Directory.Exists(ConfigDfn.strNextSenseCSVEHYPath)) + { + DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseCSVEHYPath); + fileInfos = di.GetFiles("*.CSV"); + if (fileInfos.Count() >= 1) + { + MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = ""; + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.Clear(); + dgvMeasureContent.Rows.Clear(); + string strCSVName = fi.FullName; + File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); + MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); + lbCSVFiles.Items.Add(fi.Name); + + #region 解析EHY CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); + StreamReader sr = new StreamReader(fs, encoding); + //记录每次读取的一行记录 + string strLine = ""; + //记录每行记录中的各字段内容 + string[] aryLineContent = null; + + //逐行读取CSV中的数据 + int LineNum = 0; + //表格行数 + int dtRowCount = 0; + //超差个数 + double OutCount = 0; + //Ok个数 + double OKCount = 0; + //异常个数 + double RejectedCount = 0; + //合格率 + double FPYPercent = 0; + double dStrictTLower = 0; + double dStrictTUpper = 0; + double dLowerValue = 0; + double dUpperValue = 0; + double dExcepitonTLower = 0; + double dExceptionTUpper = 0; + double dMeasureValue = 0.0; + DataTable dt = null; + while ((strLine = sr.ReadLine()) != null) + { + LineNum++; + if (LineNum >= 3 & LineNum <= 16) + { + listCSVTitleInfo.Add(strLine); + } + if (LineNum == 10) + { + aryLineContent = strLine.Split(','); + MyBase.TraceWriteLine("解析出NextSense CSV中的VIN为:" + aryLineContent[1]); + strCarID = tmdal.SelectVINByCSVVIN(aryLineContent[1]); + MyBase.TraceWriteLine("通过CSV VIN从数据库中获取的完整VIN为:" + strCarID); + if (strCarID.ToLower().Contains("nofind")) + { + MyBase.TraceWriteLine("数据库中没有查找到VIN码,NoFind, +L 使用CSV码"); + labVIN.Text = "L" + aryLineContent[1]; + strCarID = "L" + aryLineContent[1]; + } + else + { + labVIN.Text = strCarID; + tmdal.DeleteOneTTempVIN(strCarID); + MyBase.TraceWriteLine("在数据库表TTempSaveVIN中删除该VIN:" + strCarID); + } + + // 向 strNextsenseDataPath 文件中插入数据 strCarID + AppendRecord(strCarID, strNextsenseDataPath); + } + if (LineNum >= 19) + { + aryLineContent = strLine.Split(','); + ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + double dNormalValue = 0.0d; + + dt = tmdal.SelectOneToleranceByCondition("EHY", aryLineContent[0], aryLineContent[1]); + if (dt.Rows.Count == 1) + { + dLowerValue = double.Parse(dt.Rows[0]["TolLower"].ToString()); + dUpperValue = double.Parse(dt.Rows[0]["TolUpper"].ToString()); + dNormalValue = (dLowerValue + dUpperValue) / 2; + dStrictTLower = CalculateStrictLowerTolerance(dLowerValue, dUpperValue); + dStrictTUpper = CalculateStrictUpperTolerance(dLowerValue, dUpperValue); + dExcepitonTLower = CalculateExceptionLowerTolerance(dLowerValue, dUpperValue); + dExceptionTUpper = CalculateExceptionUpperTolerance(dLowerValue, dUpperValue); + } + else + { + dStrictTLower = 0; + dStrictTUpper = 0; + dLowerValue = 0; + dUpperValue = 0; + MyBase.TraceWriteLine("EHY " + aryLineContent[0] + " " + aryLineContent[1] + " 查询数据获取公差带失败!数据库中数量不唯一或不存在,请检查公差带配置!"); + } + + if (aryLineContent[2].ToLower().Contains("inv")) + { + aryLineContent[2] = ""; + aryLineContent[4] = "ng2"; + } + else + { + dMeasureValue = double.Parse(aryLineContent[2]); + if (dMeasureValue >= dLowerValue && dMeasureValue <= dUpperValue) + { + aryLineContent[4] = "good"; + } + else if (dMeasureValue >= dStrictTLower && dMeasureValue <= dStrictTUpper) + { + aryLineContent[4] = "ng1"; + } + else if (dMeasureValue >= dExceptionTUpper || dMeasureValue <= dExcepitonTLower) + { + aryLineContent[4] = "ng3"; + aryLineContent[2] = ""; + } + else + { + aryLineContent[4] = "ng2"; + } + } + + //测量数据存储到table里 + dtCSVContent.Rows.Add(strCarID, "EHY", aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], aryLineContent[4], DateTime.Now, ""); + string strMeasureResult = aryLineContent[4].ToLower(); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + OKCount++; + aryLineContent[4] = "OK"; + } + else if (strMeasureResult.Contains("ng2")) + { + OutCount++; + aryLineContent[4] = "NG"; + } + else + { + RejectedCount++; + aryLineContent[4] = ""; + aryLineContent[2] = ""; + } + + dgvMeasureContent.Rows.Add(aryLineContent[0], aryLineContent[1], dNormalValue.ToString("F1"), dLowerValue.ToString("F1"), dUpperValue.ToString("F1"), aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[4]); + + CheryIOTData cIOTData = new CheryIOTData(); + cIOTData.vin = strCarID; + cIOTData.gfNo = aryLineContent[1]; + cIOTData.pointNumber = aryLineContent[0]; + cIOTData.actualValue = aryLineContent[2]; + cIOTData.controlLine = dLowerValue.ToString("F1") + @"/" + dUpperValue.ToString("F1"); + if (strMeasureResult.Contains("good") || strMeasureResult.Contains("best") || strMeasureResult.Contains("ng1")) + { + cIOTData.measurementResult = "OK"; + } + else + { + cIOTData.measurementResult = "NG"; + } + ListPostIOTData.Add(cIOTData); + dtRowCount++; + dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); + } + }//End While + sr.Close(); + fs.Close(); + tmdal.InsertTMeasureDatabyDataTable(dtCSVContent); + MyBase.TraceWriteLine("解析EHY数据完成,并将所有测量数据插入到数据库完毕。"); + MyBase.TraceWriteLine("解析NextSense EHY CSV 报告完毕!检查数量=" + dtRowCount.ToString()); + if (dtRowCount <= ConfigDfn.iMeasureItemsCount) + { + iCurrentMeasureItemsFailedCount++; + } + else + { + iCurrentMeasureItemsFailedCount = 0; + } + + if (iCurrentMeasureItemsFailedCount >= ConfigDfn.iFailedCarCount) + { + MyBase.TraceWriteLine("iCurrentMeasureItemsFailedCount=" + iCurrentMeasureItemsFailedCount.ToString() + "超过报警数量" + ConfigDfn.iFailedCarCount.ToString() + " ;给PLC发送报警10。"); + PlcObject.InsertWriteQueue(PlcSignalDfn.MeasureError, (byte)10); + } + #endregion 解析EHY CSV报告 + + #region 计算极差 + CalculateRange(strCarID, "EHY"); + Thread.Sleep(20); + DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + if (ConfigDfn.iIncludeRangeFlag == 1) + { + if (row.ItemArray[5].ToString().Contains("OK")) + { + OKCount++; + } + else + { + OutCount++; + } + } + + dgvMeasureContent.Rows.Add(row.ItemArray[2].ToString(), "G", "0", row.ItemArray[4].ToString().Substring(0, 3), row.ItemArray[4].ToString().Substring(4, 3), row.ItemArray[3].ToString(), ConfigDfn.strMeasureTime, row.ItemArray[5].ToString()); + } + } + + if (ConfigDfn.iIncludeRangeFlag == 1) + { + dtRowCount = dtRowCount + dtAllRangeDate.Rows.Count; + for (int i = 1; i <= dtRowCount; i++) + { + dgvMeasureContent.Rows[i - 1].HeaderCell.Value = i.ToString(); + } + MyBase.TraceWriteLine("计算合格率的时:包含极差计算项!"); + } + + #endregion 计算极差 + + #region 界面显示功能 + + labCarType.Text = "EHY"; + TMeasureResultModel tmrm = new TMeasureResultModel(); + labNGCount.Text = OutCount.ToString(); + labOKCount.Text = OKCount.ToString(); + labRejectCount.Text = RejectedCount.ToString(); + labMeaTime.Text = ConfigDfn.strMeasureTime; + labSumMeasureCount.Text = dtRowCount.ToString(); + FPYPercent = OKCount / (OKCount + OutCount); + if (FPYPercent >= ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.LimeGreen; + labResult.ForeColor = Color.LimeGreen; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)10); + } + else if (FPYPercent >= ConfigDfn.dFPY2 && FPYPercent < ConfigDfn.dFPY) + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "合格"; + labResultPercent.ForeColor = Color.Yellow; + labResult.ForeColor = Color.Yellow; + pbResult.Image = Resources.OK; + tmrm.Result = 1; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)20); + } + else + { + labResultPercent.Text = Math.Round(FPYPercent * 100.00d, 2).ToString("F2") + "%"; + labResult.Text = "不合格"; + labResultPercent.ForeColor = Color.Red; + labResult.ForeColor = Color.Red; + pbResult.Image = Resources.NG; + tmrm.Result = 2; + PlcObject.InsertWriteQueue(PlcSignalDfn.CMMResult, (byte)30); + } + xValues[0] = "合格 : " + OKCount.ToString(); + xValues[1] = "不合格 : " + OutCount.ToString(); + xValues[2] = "异常 : " + RejectedCount.ToString(); + yValues[0] = (int)OKCount; + yValues[1] = (int)OutCount; + yValues[2] = (int)RejectedCount; + chartResultPie.Series[0].Points.DataBindXY(xValues, yValues); + + string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + + tmrm.CarID = strCarID; + tmrm.CarType = "EHY"; + tmrm.SumMeasureItems = dtRowCount; + tmrm.GoodMeasureItems = (int)OKCount; + tmrm.NoGoodMeasureItems = (int)OutCount; + tmrm.RejectMeasureItems = (int)RejectedCount; + tmrm.FPY = FPYPercent.ToString("F4"); + tmrm.Remark = ""; + tmrm.MeasureDate = ConfigDfn.strMeasureTime; + tmdal.InsertTMeasureResult(tmrm); + MyBase.TraceWriteLine("将总结果插入数据库完毕。"); + MyBase.TraceWriteLine("全部插入解析完毕,删除文件:" + fi.Name); + fi.Delete(); + + dgvMeasureContent.Rows.Add(); + dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].Cells["MResult"].Value = (dtRowCount - OutCount - RejectedCount).ToString() + "/" + dtRowCount.ToString(); + this.dgvMeasureContent.Rows[dgvMeasureContent.Rows.Count - 1].DefaultCellStyle.ForeColor = Color.White; + if (dgvMeasureContent.Rows.Count > 0) + { + SetdgvRowBgColor(dgvMeasureContent); + for (int i = 0; i < dgvMeasureContent.Rows.Count; i++) + { + //if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ok")) + //{ + // dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + //} + if (dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString().ToLower().Contains("ng")) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + } + else if (string.IsNullOrEmpty(dgvMeasureContent.Rows[i].Cells["MResult"].Value.ToString())) + { + dgvMeasureContent.Rows[i].DefaultCellStyle.BackColor = Color.Red; + } + else + { + } + } + } + + #endregion 界面显示功能 + + if (ConfigDfn.iCreateReportFlag == 1) + { + GenUserReportCSV(strCarID, listCSVTitleInfo, dtAllRangeDate, FPYPercent); + } + else + { + MyBase.TraceWriteLine("iCreateReportFlag=0 : EHY数据生成报告功能未启用!"); + } + + #region Update Data To IOT + + if (ConfigDfn.iStartIOTFlag == 1) + { bool bVINMeasuedFlag = tmdal.CheckVINExistInDB(strCarID); if (bVINMeasuedFlag) { @@ -1375,7 +1228,6 @@ namespace NSAnalysis { foreach (DataRow row in dtAllRangeDate.Rows) { - CheryIOTData cIOTData = new CheryIOTData(); cIOTData.vin = strCarID; cIOTData.gfNo = "G"; @@ -1385,7 +1237,7 @@ namespace NSAnalysis cIOTData.measurementResult = row.ItemArray[5].ToString(); if (cIOTData.measurementResult.ToUpper().Contains("NG")) { - if (!cIOTData.actualValue.ToLower().Contains("inv")) + if (!string.IsNullOrEmpty(cIOTData.actualValue) && !cIOTData.actualValue.ToLower().Contains("inv")) //避免为空的情况 { dLowerValue = double.Parse(row.ItemArray[4].ToString().Substring(0, 3)); dUpperValue = double.Parse(row.ItemArray[4].ToString().Substring(4, 3)); @@ -1423,50 +1275,317 @@ namespace NSAnalysis { MyBase.TraceWriteLine("EHY数据上传IOT失败!"); } - } - } - else - { - MyBase.TraceWriteLine("EHY数据上传IOT功能未启用!"); - } - - #endregion Update Data To IOT - } - } - } - //else - //{ - // MyBase.TraceWriteLine("错误:AnalysisNextSenseEHYCSV 函数中,检测EHY CSV 路径不存在:" + ConfigDfn.strNextSenseCSVEHYPath); - //} - } - catch (Exception ex) - { - MyBase.TraceWriteLine("AnalysisNextSenseEHYCSV 函数分析异常:" + ex.ToString()); - } - } - - - private void testIotUpload() - { - - // 修复极差 计算问题 - //LNNBBDEC7SDF49695 - //string strVIN = "LNNBBDEC5SDF49694"; - // string strCarType = "EHY"; - //CalculateRange(strVIN, strCarType); - - - //修复IOt上传问题 - string strCarID = "LNNBDDEF4SDF49707"; - DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); - string strTargetRate = "97.00%"; - UploadIOTData(strCarID, dtAllRangeDate, strTargetRate); + else + { + MyBase.TraceWriteLine("EHY数据上传IOT功能未启用!"); + } + #endregion Update Data To IOT + } + } + } + //else + //{ + // MyBase.TraceWriteLine("错误:AnalysisNextSenseEHYCSV 函数中,检测EHY CSV 路径不存在:" + ConfigDfn.strNextSenseCSVEHYPath); + //} + } + catch (Exception ex) + { + MyBase.TraceWriteLine("AnalysisNextSenseEHYCSV 函数分析异常:" + ex.ToString()); + } } - private void UploadIOTData(string strCarID, DataTable dtAllRangeDate, string strTargetRate) + private void AnalysisNextSenseSelfMeasureCSV() + { + try + { + lbCSVFiles.Items.Clear(); + FileInfo[] fileInfos = null; + if (Directory.Exists(ConfigDfn.strNextSenseSelfMeasurePath)) + { + DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseSelfMeasurePath); + fileInfos = di.GetFiles("*.CSV"); + if (fileInfos.Count() >= 1) + { + MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); + List listCSVTitleInfo = new List(); + string strCarID = "SelfMeasure" + DateTime.Now.ToString("yyyyMMddHHmmss"); + foreach (FileInfo fi in fileInfos) + { + listCSVTitleInfo.Clear(); + ListPostIOTData.Clear(); + dtCSVContent.Clear(); + dgvMeasureContent.Rows.Clear(); + string strCSVName = fi.FullName; + File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); + MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); + lbCSVFiles.Items.Add(fi.Name); + + #region 解析NextSense自检CSV报告 + + MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); + Encoding encoding = GetType(strCSVName); + FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); + StreamReader sr = new StreamReader(fs, encoding); + //记录每次读取的一行记录 + string strLine = ""; + //记录每行记录中的各字段内容 + string[] aryLineContent = null; + + //逐行读取CSV中的数据 + int LineNum = 0; + //表格行数 + int dtRowCount = 0; + + while ((strLine = sr.ReadLine()) != null) + { + LineNum++; + if (LineNum >= 1 & LineNum <= 17) + { + listCSVTitleInfo.Add(strLine); + } + if (LineNum >= 19) + { + aryLineContent = strLine.Split(','); + ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); + + if (aryLineContent[2].ToLower().Contains("inv")) + { + aryLineContent[2] = ""; //当为inv ,内容为空 + aryLineContent[10] = "NG"; + } + string strMeasPointName = ""; + if (aryLineContent[0].ToUpper().Contains("L")) + { + strMeasPointName = "L-ZJ1"; + } + else + { + strMeasPointName = "R-ZJ1"; + } + //测量数据存储到table里 + dtCSVContent.Rows.Add(strCarID, "SelfMeasure", strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], aryLineContent[10], DateTime.Now, ""); + + dgvMeasureContent.Rows.Add(strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[10]); + + dtRowCount++; + dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); + } + }//End While + sr.Close(); + fs.Close(); + + MyBase.TraceWriteLine("解析NextSense 自检报告完毕!检查数量=" + dtRowCount.ToString()); + labCarType.Text = "自检报告"; + + fi.Delete(); + #endregion 解析NextSense自检CSV报告 + + if (ConfigDfn.iCreateReportFlag == 1) + { + #region 解析完报告后,重新生成客户模板报告 + + MyBase.TraceWriteLine("开始生成客户所需要的CSV格式文件:"); + string targetFilePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 + + // 创建临时路径,为应用程序目录\ReportBackup 路径下 + string tempFilePath = Application.StartupPath + "\\ReportBackup"; + + if (!Directory.Exists(tempFilePath)) + { + Directory.CreateDirectory(tempFilePath); + //日志 + MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + tempFilePath); + } + + StringBuilder sb = new StringBuilder(); + //添加表头 + sb.Append("Measurement Info Name"); + sb.Append(","); + sb.Append("Measurement Info"); + sb.AppendLine(); + sb.Append("Date_Time"); + sb.Append(","); + sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); + sb.AppendLine(); + for (int i = 2; i < listCSVTitleInfo.Count - 1; i++) + { + if (listCSVTitleInfo[i].Contains("prodnum")) + { + listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum,", "Part_ident," + DateTime.Now.ToString("yyyyMMdd")); + } + + sb.Append(listCSVTitleInfo[i]); + sb.AppendLine(); + } + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + //添加测量数据 + sb.Append("Characteristic"); + sb.Append(","); + sb.Append("Extension"); + sb.Append(","); + sb.Append("Measured_Value"); + sb.AppendLine(); + foreach (DataRow row in dtCSVContent.Rows) + { + sb.Append(row.ItemArray[2]); + sb.Append(","); + sb.Append(row.ItemArray[3]); + sb.Append(","); + sb.Append(row.ItemArray[7]); + sb.AppendLine(); + } + sb.AppendLine(); + // 将数据写入CSV文件 + File.WriteAllText(tempFilePath, sb.ToString()); + MyBase.TraceWriteLine("客户自检报告生成完毕,备份路径为:" + targetFilePath); + + // 尝试进行复制到 目标路径 往目标路径copy该文件,并记录是否成功 + try + { + File.Copy(tempFilePath, targetFilePath, true); + if (File.Exists(targetFilePath)) + { + MyBase.TraceWriteLine("客户自检报告生成并复制成功,路径为:" + targetFilePath); + } + else + { + MyBase.TraceWriteLine("客户自检报告复制失败,目标文件不存在:" + targetFilePath); + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("客户自检报告复制异常:" + ex.Message); + } + + #endregion 解析完报告后,重新生成客户模板报告 + } + else + { + MyBase.TraceWriteLine("iCreateReportFlag=0 : 数据生成报告功能未启用!"); + } + } + } + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("AnalysisNextSenseSelfMeasureCSV 函数分析异常:" + ex.ToString()); + } + } + + public void GenUserReportCSV(string strCarID, List listCSVTitleInfo, DataTable dtAllRangeDate, double FPYPercent) + { + #region 解析完报告后,重新生成客户模板报告 + + // 目的路径 + string targetFilePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 + + // 新建一个备份路径,应用程序根目录\ReportBackup + string backupPath = Application.StartupPath + "\\ReportBackup"; + if (!Directory.Exists(backupPath)) + { + Directory.CreateDirectory(backupPath); + //日志 + MyBase.TraceWriteLine("创建ReportBackup文件夹完毕,路径为:" + backupPath); + } + + string strWithoutLCarVin = strCarID.Substring(1); + StringBuilder sb = new StringBuilder(); + //添加表头 + sb.Append("Measurement Info Name"); + sb.Append(","); + sb.Append("Measurement Info"); + sb.AppendLine(); + sb.Append("Date_Time"); + sb.Append(","); + sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); + sb.AppendLine(); + for (int i = 0; i < listCSVTitleInfo.Count; i++) + { + if (listCSVTitleInfo[i].Contains("prodnum")) + { + listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum", "Part_ident"); + } + if (listCSVTitleInfo[i].Contains(strWithoutLCarVin)) + { + listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace(strWithoutLCarVin, strCarID); + } + sb.Append(listCSVTitleInfo[i]); + sb.AppendLine(); + } + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + sb.AppendLine(); + //添加测量数据 + sb.Append("Characteristic"); + sb.Append(","); + sb.Append("Extension"); + sb.Append(","); + sb.Append("Measured_Value"); + sb.AppendLine(); + foreach (DataRow row in dtCSVContent.Rows) + { + sb.Append(row.ItemArray[2]); + sb.Append(","); + sb.Append(row.ItemArray[3]); + sb.Append(","); + sb.Append(row.ItemArray[7]); + sb.AppendLine(); + } + if (dtAllRangeDate.Rows.Count > 0) + { + foreach (DataRow row in dtAllRangeDate.Rows) + { + sb.Append(row.ItemArray[2]); + sb.Append(","); + sb.Append("G"); + sb.Append(","); + sb.Append(row.ItemArray[3]); + sb.AppendLine(); + } + } + sb.Append("POP"); + sb.Append(","); + sb.Append("P"); + sb.Append(","); + sb.Append(Math.Round(FPYPercent * 100.00d, 2).ToString("F2")); + sb.AppendLine(); + // 将数据写入CSV文件 + File.WriteAllText(backupPath, sb.ToString()); + // 记录日志,说明备份成功 + MyBase.TraceWriteLine("客户EHY csv报告备份完毕,路径为:" + backupPath); + + // 往目标路径copy该文件,并记录是否成功 + try + { + File.Copy(backupPath, targetFilePath, true); + if (File.Exists(targetFilePath)) + { + MyBase.TraceWriteLine("客户csv报告生成并复制成功,路径为:" + targetFilePath); + } + else + { + MyBase.TraceWriteLine("客户csv报告复制失败,目标文件不存在:" + targetFilePath); + } + } + catch (Exception ex) + { + MyBase.TraceWriteLine("客户csv报告复制异常:" + ex.Message); + } + + #endregion 解析完报告后,重新生成客户模板报告 + } + + private void UploadIOTData(string strCarID, DataTable dtAllRangeDate, string strTargetRate) { double dStrictTLower = 0; double dStrictTUpper = 0; @@ -1484,7 +1603,6 @@ namespace NSAnalysis { foreach (DataRow row in dtAllRangeDate.Rows) { - CheryIOTData cIOTData = new CheryIOTData(); cIOTData.vin = strCarID; cIOTData.gfNo = "G"; @@ -1532,1762 +1650,1671 @@ namespace NSAnalysis { MyBase.TraceWriteLine("EHY数据上传IOT失败!"); } - } - } - private void CalculateRange(string strVIN, string strCarType) - { - MyBase.TraceWriteLine(strVIN + " " + strCarType + "开始计算极差:============"); - tmdal.DeleteRangeData(strVIN); - dtRangeData.Clear(); - DataTable dtRange = tmdal.SelectRangeByCarType(strCarType); - if (dtRange != null && dtRange.Rows.Count > 0) - { - string strRangeValue = ""; - string strRangeLowUpp = ""; - string strRangeResult = ""; - DateTime dtTime = DateTime.Now; - string strRemark = ""; - for (int i = 0; i < dtRange.Rows.Count; i++) - { - string[] strArrRangePoint = dtRange.Rows[i]["RangePoint"].ToString().Split(','); - double[] dMeasureData = new double[strArrRangePoint.Length]; - int iCalcCount = 0; - for (int j = 0; j < strArrRangePoint.Length; j++) - { - string strMeasureValue = tmdal.SelectOneMeasureValueByCondition(strVIN, strArrRangePoint[j].Substring(0, 4)); - if (string.IsNullOrEmpty(strMeasureValue) || strMeasureValue.ToLower().Contains("inv")) - { - strRangeValue = ""; - strRangeResult = "NG"; - MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为inv"); - break; - } - else if (strMeasureValue.ToLower().Contains("nofind")) - { - strRangeValue = ""; - strRangeResult = "NG"; - MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为no find"); - break; - } - else - { - dMeasureData[j] = Convert.ToDouble(strMeasureValue); - iCalcCount++; - } - } + private void CalculateRange(string strVIN, string strCarType) + { + MyBase.TraceWriteLine(strVIN + " " + strCarType + "开始计算极差:============"); + tmdal.DeleteRangeData(strVIN); + dtRangeData.Clear(); + DataTable dtRange = tmdal.SelectRangeByCarType(strCarType); + if (dtRange != null && dtRange.Rows.Count > 0) + { + string strRangeValue = ""; + string strRangeLowUpp = ""; + string strRangeResult = ""; + DateTime dtTime = DateTime.Now; + string strRemark = ""; + for (int i = 0; i < dtRange.Rows.Count; i++) + { + string[] strArrRangePoint = dtRange.Rows[i]["RangePoint"].ToString().Split(','); + double[] dMeasureData = new double[strArrRangePoint.Length]; + int iCalcCount = 0; + for (int j = 0; j < strArrRangePoint.Length; j++) + { + string strMeasureValue = tmdal.SelectOneMeasureValueByCondition(strVIN, strArrRangePoint[j].Substring(0, 4)); + + if (string.IsNullOrEmpty(strMeasureValue) || strMeasureValue.ToLower().Contains("inv")) + { + strRangeValue = ""; + strRangeResult = "NG"; + MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为inv"); + break; + } + else if (strMeasureValue.ToLower().Contains("nofind")) + { + strRangeValue = ""; + strRangeResult = "NG"; + MyBase.TraceWriteLine(strArrRangePoint[j] + " G 查询的测量值为no find"); + break; + } + else + { + dMeasureData[j] = Convert.ToDouble(strMeasureValue); + iCalcCount++; + } + } //iCalcCount 的作用就是确保只有全部测点都有效时才计算极差,否则提前退出。 if (iCalcCount == strArrRangePoint.Length) - { - double dMax = dMeasureData.Max(); - double dMin = dMeasureData.Min(); - double dRangeData = dMax - dMin; - strRangeValue = dRangeData.ToString("F1"); - if (dRangeData >= Convert.ToDouble(dtRange.Rows[i]["RangeLower"]) && dRangeData <= Convert.ToDouble(dtRange.Rows[i]["RangeUpper"])) - { - strRangeResult = "OK"; - } - else - { - strRangeResult = "NG"; - } - } - strRangeLowUpp = dtRange.Rows[i]["RangeLower"].ToString() + @"/" + dtRange.Rows[i]["RangeUpper"].ToString(); - dtRangeData.Rows.Add(strVIN, dtRange.Rows[i]["RangeName"].ToString(), strRangeValue, strRangeLowUpp, strRangeResult, dtTime, strRemark); - } - tmdal.InsertTRangeDatabyDataTable(dtRangeData); - MyBase.TraceWriteLine(strVIN + " " + strCarType + "计算极差完成,并插入数据库:============"); - } - - } - - public string PostJsonToIOT(string url, string jsonData, int? timeout = null) - { - try - { - HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); - - if (null != timeout && 0 != timeout) - { - req.Timeout = timeout.Value; - } - Encoding encoding = Encoding.UTF8; - byte[] bs = Encoding.UTF8.GetBytes(jsonData); - string responseData; - req.Method = "POST"; - req.ContentType = "application/json"; - req.ContentLength = bs.Length; - using (Stream reqStream = req.GetRequestStream()) - { - reqStream.Write(bs, 0, bs.Length); - reqStream.Close(); - } - using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) - { - using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) - { - responseData = reader.ReadToEnd(); - } - } - return responseData; - } - catch (Exception ex) - { - return "Error: " + ex.ToString(); - } - } - - /// 通过给定的文件流,判断文件的编码类型 - /// 文件流 - /// 文件的编码类型 - public static Encoding GetType(FileStream fs) - { - byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; - byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; - byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM - System.Text.Encoding reVal = System.Text.Encoding.Default; - - System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default); - int i; - int.TryParse(fs.Length.ToString(), out i); - byte[] ss = r.ReadBytes(i); - if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) - { - reVal = System.Text.Encoding.UTF8; - } - else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) - { - reVal = System.Text.Encoding.BigEndianUnicode; - } - else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) - { - reVal = System.Text.Encoding.Unicode; - } - r.Close(); - return reVal; - } - - /// 判断是否是不带 BOM 的 UTF8 格式 - /// - /// - private static bool IsUTF8Bytes(byte[] data) - { - int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 - byte curByte; //当前分析的字节. - for (int i = 0; i < data.Length; i++) - { - curByte = data[i]; - if (charByteCounter == 1) - { - if (curByte >= 0x80) - { - //判断当前 - while (((curByte <<= 1) & 0x80) != 0) - { - charByteCounter++; - } - //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X  - if (charByteCounter == 1 || charByteCounter > 6) - { - return false; - } - } - } - else - { - //若是UTF-8 此时第一位必须为1 - if ((curByte & 0xC0) != 0x80) - { - return false; - } - charByteCounter--; - } - } - if (charByteCounter > 1) - { - throw new Exception("非预期的byte格式"); - } - return true; - } - - public Encoding GetType(string FileName) - { - FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read); - Encoding er = GetType(fs); - fs.Close(); - return er; - } - - - private void AnalysisNextSenseSelfMeasureCSV() - { - try - { - lbCSVFiles.Items.Clear(); - FileInfo[] fileInfos = null; - if (Directory.Exists(ConfigDfn.strNextSenseSelfMeasurePath)) - { - DirectoryInfo di = new DirectoryInfo(ConfigDfn.strNextSenseSelfMeasurePath); - fileInfos = di.GetFiles("*.CSV"); - if (fileInfos.Count() >= 1) - { - MyBase.TraceWriteLine("存在EHY CSV文件,开始解析:"); - List listCSVTitleInfo = new List(); - string strCarID = "SelfMeasure" + DateTime.Now.ToString("yyyyMMddHHmmss"); - foreach (FileInfo fi in fileInfos) - { - listCSVTitleInfo.Clear(); - ListPostIOTData.Clear(); - dtCSVContent.Clear(); - dgvMeasureContent.Rows.Clear(); - string strCSVName = fi.FullName; - File.Copy(fi.FullName, ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name, true); - MyBase.TraceWriteLine("Copy " + fi.FullName + " TO " + ConfigDfn.strFileFolder + "\\NextSenseCSVBackup\\" + fi.Name + " Done. 备份完成"); - lbCSVFiles.Items.Add(fi.Name); - - #region 解析NextSense自检CSV报告 - - MyBase.TraceWriteLine("开始解析NextSense EHY CSV 报告:" + strCSVName); - Encoding encoding = GetType(strCSVName); - FileStream fs = new FileStream(strCSVName, FileMode.Open, FileAccess.Read); - StreamReader sr = new StreamReader(fs, encoding); - //记录每次读取的一行记录 - string strLine = ""; - //记录每行记录中的各字段内容 - string[] aryLineContent = null; - - //逐行读取CSV中的数据 - int LineNum = 0; - //表格行数 - int dtRowCount = 0; - - while ((strLine = sr.ReadLine()) != null) - { - LineNum++; - if (LineNum >= 1 & LineNum <= 17) - { - listCSVTitleInfo.Add(strLine); - } - if (LineNum >= 19) - { - aryLineContent = strLine.Split(','); - ConfigDfn.strMeasureTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); - - - if (aryLineContent[2].ToLower().Contains("inv")) - { - aryLineContent[2] = ""; //当为inv ,内容为空 - aryLineContent[10] = "NG"; - } - string strMeasPointName = ""; - if (aryLineContent[0].ToUpper().Contains("L")) - { - strMeasPointName = "L-ZJ1"; - } - else - { - strMeasPointName = "R-ZJ1"; - } - //测量数据存储到table里 - dtCSVContent.Rows.Add(strCarID, "SelfMeasure", strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], aryLineContent[10], DateTime.Now, ""); - - - dgvMeasureContent.Rows.Add(strMeasPointName, aryLineContent[1], aryLineContent[4], aryLineContent[8], aryLineContent[9], aryLineContent[2], ConfigDfn.strMeasureTime, aryLineContent[10]); - - dtRowCount++; - dgvMeasureContent.Rows[dtRowCount - 1].HeaderCell.Value = dtRowCount.ToString(); - } - }//End While - sr.Close(); - fs.Close(); - - MyBase.TraceWriteLine("解析NextSense 自检报告完毕!检查数量=" + dtRowCount.ToString()); - labCarType.Text = "自检报告"; - - fi.Delete(); - #endregion 解析EHY CSV报告 - - if (ConfigDfn.iCreateReportFlag == 1) - { - #region 解析完报告后,重新生成客户模板报告 - - MyBase.TraceWriteLine("开始生成客户所需要的CSV格式文件:"); - string filePath = strSaveReprotPath + DateTime.Now.ToString("yyyyMMddHHmmss") + "_" + strCarID + ".csv"; //wsp 后期还要再改 - StringBuilder sb = new StringBuilder(); - //添加表头 - sb.Append("Measurement Info Name"); - sb.Append(","); - sb.Append("Measurement Info"); - sb.AppendLine(); - sb.Append("Date_Time"); - sb.Append(","); - sb.Append(DateTime.Now.ToString("yyyy/MM/dd HH:mm:ss")); - sb.AppendLine(); - for (int i = 2; i < listCSVTitleInfo.Count-1; i++) - { - if (listCSVTitleInfo[i].Contains("prodnum")) - { - listCSVTitleInfo[i] = listCSVTitleInfo[i].Replace("prodnum,", "Part_ident,"+ DateTime.Now.ToString("yyyyMMdd")); - } - - sb.Append(listCSVTitleInfo[i]); - sb.AppendLine(); - } - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - sb.AppendLine(); - //添加测量数据 - sb.Append("Characteristic"); - sb.Append(","); - sb.Append("Extension"); - sb.Append(","); - sb.Append("Measured_Value"); - sb.AppendLine(); - foreach (DataRow row in dtCSVContent.Rows) - { - sb.Append(row.ItemArray[2]); - sb.Append(","); - sb.Append(row.ItemArray[3]); - sb.Append(","); - sb.Append(row.ItemArray[7]); - sb.AppendLine(); - } - sb.AppendLine(); - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户自检报告生成完毕,路径为:" + filePath); - - #endregion 解析完报告后,重新生成客户模板报告 - } - else - { - MyBase.TraceWriteLine("iCreateReportFlag=0 : 数据生成报告功能未启用!"); - } - } - } - } - } - catch (Exception ex) - { - MyBase.TraceWriteLine("AnalysisNextSenseSelfMeasureCSV 函数分析异常:" + ex.ToString()); - } - } - #endregion 解析Nextsense CSV文件功能 - - #region Home Page - - /// - /// 设置DataGridView各行变色 - /// - /// DataGridView - public void SetdgvRowBgColor(DataGridView dgv) - { - if (dgv.Rows.Count > 0) - { - foreach (DataGridViewRow item in dgv.Rows) - { - if (item.Index % 2 == 0) - { - item.DefaultCellStyle.BackColor = Color.FromArgb(19, 46, 53); - } - else - { - item.DefaultCellStyle.BackColor = Color.FromArgb(27, 60, 68); - } - } - } - } - - //TODO: - - #endregion Home Page - - #region Search Data - - #region datagridview分页功能 - - /// - /// LoadPage方法 - /// - private void LoadPage() - { - if (currentPage < 1) currentPage = 1; - if (currentPage > pageCount) currentPage = pageCount; - - int beginRecord; //开始指针 - int endRecord; //结束指针 - DataTable dtTemp; - dtTemp = PageTable.Clone();//Clone方法只会复制DataTable的结构(列定义),而不会复制数据行的引用。 - - beginRecord = pageSize * (currentPage - 1); - if (currentPage == 1) beginRecord = 0; - endRecord = pageSize * currentPage; - - if (currentPage == pageCount) endRecord = recordCount; - for (int i = beginRecord; i < endRecord; i++) - { - // 使用ImportRow方法将源PageTable的行导入到目标dtTemp - dtTemp.ImportRow(PageTable.Rows[i]); - } - - dgvSelectMeasureData.Rows.Clear(); - - for (int i = 0; i < dtTemp.Rows.Count; i++) - { - dgvSelectMeasureData.Rows.Add(new object[] { dtTemp.Rows[i][0], dtTemp.Rows[i][1], dtTemp.Rows[i][2], dtTemp.Rows[i][3], dtTemp.Rows[i][4], dtTemp.Rows[i][5], dtTemp.Rows[i][6], dtTemp.Rows[i][7], dtTemp.Rows[i][8] }); - } - SetdgvRowBgColor(dgvSelectMeasureData); - for (int i = 0; i < dgvSelectMeasureData.Rows.Count; i++) - { - string strResult = dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Value.ToString(); - if (strResult.ToLower().Contains("ng")) - { - //dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Orange; - dgvSelectMeasureData.Rows[i].DefaultCellStyle.BackColor = Color.Orange; - } - if (strResult.ToLower().Contains("rej")) - { - dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Red; - } - } - labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 - labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 - labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 - } - - private void rbtnFirtstPage_Click(object sender, EventArgs e) - { - if (currentPage == 1) - { return; } - currentPage = 1; - LoadPage(); - } - - private void rbtnPrevPage_Click(object sender, EventArgs e) - { - if (currentPage == 1) - { return; } - currentPage--; - LoadPage(); - } - - private void rbtnNextPage_Click(object sender, EventArgs e) - { - if (currentPage == pageCount) - { return; } - currentPage++; - LoadPage(); - } - - private void rbtnLastPage_Click(object sender, EventArgs e) - { - if (currentPage == pageCount) - { return; } - currentPage = pageCount; - LoadPage(); - } - - private void rddlPageRecorderCount_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e) - { - pageSize = int.Parse(rddlPageRecorderCount.Text.Trim()); - //PageSorter(); - } - - #endregion datagridview分页功能 - - private void rbtnSearchMeaserData_Click(object sender, EventArgs e) - { - dgvFPYResult.Visible = false; - chartFPYLine.Visible = false; - rbtnExportCSVReport.Visible = false; - string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; - string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; - string strCarID = rtbPartID.Text.Trim(); - PageTable.Clear(); - PageTable = tmdal.SelectTMeasureDataByCarIDAndTime(strCarID, strStartTime, strEndTime); - if (PageTable.Rows.Count > 0) - { - recordCount = PageTable.Rows.Count; //记录总行数 - pageCount = (recordCount / pageSize); - if ((recordCount % pageSize) > 0) - { - pageCount++; - } - - //默认第一页 - currentPage = 1; - - LoadPage();//调用加载数据的方法 - dgvSelectMeasureData.Visible = true; - rbtnExportCSVReport.Visible = true; - pnlPage.Visible = true; - labSearchResult.Visible = false; - pnlPage.Visible = true; - } - else - { - dgvSelectMeasureData.Visible = false; - labSearchResult.Visible = true; - rbtnExportCSVReport.Visible = false; - pnlPage.Visible = false; - } - } - - private void rbtSelectFPY_Click(object sender, EventArgs e) - { - dgvSelectMeasureData.Visible = false; - rbtnExportCSVReport.Visible = false; - pnlPage.Visible = false; - string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; - string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; - string strCarID = rtbPartID.Text.Trim(); - DataTable dtFPY = new DataTable(); - dtFPY = tmdal.SelectTMeasureResultByTime(strCarID, strStartTime, strEndTime); - if (dtFPY.Rows.Count > 0) - { - dgvFPYResult.Visible = true; - labSearchResult.Visible = false; - rbtnExportCSVReport.Visible = true; - chartFPYLine.Visible = true; - dgvFPYResult.DataSource = dtFPY; - SetdgvRowBgColor(dgvFPYResult); - for (int i = 0; i < dgvFPYResult.Rows.Count; i++) - { - if (dgvFPYResult.Rows[i].Cells["SMResult"].Value.ToString().ToLower().Contains("不合格")) - { - dgvFPYResult.Rows[i].Cells["SMResult"].Style.ForeColor = Color.Red; - } - } - - #region 合格率折线图 - - //合格率折线图 - string[] strXDate = new string[dtFPY.Rows.Count]; - double[] dFPYResult = new double[dtFPY.Rows.Count]; - for (int i = 0; i < dtFPY.Rows.Count; i++) - { - strXDate[i] = dtFPY.Rows[i]["CarID"].ToString(); - } - for (int i = 0; i < dtFPY.Rows.Count; i++) - { - double dResult = double.Parse(dtFPY.Rows[i]["FPY"].ToString()); - dFPYResult[i] = dResult * 100.00; - } - chartFPYLine.ChartAreas[0].AxisX.LabelStyle.Angle = -50; //X轴标签倾斜角度设置 - chartFPYLine.ChartAreas[0].AxisY.LabelStyle.Format = "{0:F2}" + "%"; //设置Y轴值的格式化 带% - chartFPYLine.Series[0].Label = "#VAL%"; //设置显示Y的值 - chartFPYLine.Series[0].LabelForeColor = Color.White; - chartFPYLine.Series[0].ToolTip = "车身编号 : #VALX \r\n合格率 : #VAL%"; //鼠标移动到对应点显示数值 - chartFPYLine.Series[0].Points.DataBindXY(strXDate, dFPYResult); - - #endregion 合格率折线图 - } - else - { - dgvFPYResult.Visible = false; - labSearchResult.Visible = true; - rbtnExportCSVReport.Visible = false; - chartFPYLine.Visible = false; - } - } - - public static void ExportdgvDataToCsv(DataGridView dataGridView, string filePath) - { - StringBuilder sb = new StringBuilder(); - - // 添加列标题 - foreach (DataGridViewColumn column in dataGridView.Columns) - { - sb.Append(column.HeaderText); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - - // 添加行数据 - foreach (DataGridViewRow row in dataGridView.Rows) - { - foreach (DataGridViewCell cell in row.Cells) - { - sb.Append(cell.Value); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - } - - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - } - - public static void ExportDataTableDataToCsv(DataTable dt, string filePath) - { - StringBuilder sb = new StringBuilder(); - - // 添加列标题 - foreach (DataColumn column in dt.Columns) - { - sb.Append(column.ColumnName); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - - // 添加行数据 - foreach (DataRow row in dt.Rows) - { - foreach (object item in row.ItemArray) - { - sb.Append(item); - sb.Append(","); - } - sb.Remove(sb.Length - 1, 1); - sb.AppendLine(); - } - - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - } - - private void rbtnExportCSVReport_Click(object sender, EventArgs e) - { - string strCSVExportPath = ""; - string strExportTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); - FolderBrowserDialog m_Folder = new FolderBrowserDialog(); - m_Folder.Description = "请选择要导出的CSV文件的路径"; - m_Folder.RootFolder = Environment.SpecialFolder.Desktop; - if (dgvFPYResult.Visible == true && dgvFPYResult.Rows.Count > 0) - { - m_Folder.ShowDialog(); - if (Directory.Exists(m_Folder.SelectedPath)) - { - strCSVExportPath = m_Folder.SelectedPath + "\\合格率" + strExportTime + ".CSV"; - ExportdgvDataToCsv(dgvFPYResult, strCSVExportPath); - } - } - if (dgvSelectMeasureData.Visible == true && dgvSelectMeasureData.Rows.Count > 0) - { - m_Folder.ShowDialog(); - if (Directory.Exists(m_Folder.SelectedPath)) - { - strCSVExportPath = m_Folder.SelectedPath + "\\车身尺寸数据" + strExportTime + ".CSV"; - ExportDataTableDataToCsv(PageTable, strCSVExportPath); - } - } - } - - private void dgvFPYResult_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) - { - e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); - } - - private void dgvSelectMeasureData_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) - { - e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); - } - - #endregion Search Data - - #region CP CPK - - private void rbtnSearchCPCPK_Click(object sender, EventArgs e) - { - DataTable dtCPCPK = new DataTable(); - string strMeasureName = rddlMeasurePoint.Text; - string strSizeName = rddlSizeName.Text.Trim().Substring(0, 1); - int iLimitCount = (int)nudMeasureCount.Value; - dtCPCPK = tmdal.SelectMeasureValuebyMeasureNameAndSize(strMeasureName, strSizeName, iLimitCount); - int iSelectRows = dtCPCPK.Rows.Count; - if (iSelectRows < 5) - { - chartCPCPK.Visible = false; - labSearchCPCPKResult.Visible = true; - pnlCPCPK.Visible = false; - } - else - { - double dNormalValue = double.Parse(dtCPCPK.Rows[0]["NormalValue"].ToString()); - double dLowerTolValue = double.Parse(dtCPCPK.Rows[0]["LowerTolVal"].ToString()); - double dUpperTolValue = double.Parse(dtCPCPK.Rows[0]["UpperTolVal"].ToString()); - double dLSL = dNormalValue + dLowerTolValue; - double dUSL = dNormalValue + dUpperTolValue; - - List listMDoubleData = new List(); - List listMStrData = new List(); - listMStrData.Clear(); - listMDoubleData.Clear(); - for (int i = 0; i < iSelectRows; i++) - { - listMDoubleData.Add(double.Parse(dtCPCPK.Rows[i]["MeasureValue"].ToString())); - listMStrData.Add(dtCPCPK.Rows[i]["MeasureValue"].ToString()); - } - - #region 数据赋值 - - labLSL.Text = dLSL.ToString("F2"); - labUSL.Text = dUSL.ToString("F2"); - labTarget.Text = dNormalValue.ToString("F2"); - labSampleSize.Text = iSelectRows.ToString(); - labAverage.Text = CpCpkHelper.GetAverage(listMStrData).ToString("F4"); - labStdDev.Text = CpCpkHelper.GetSigma(listMStrData).ToString("F4"); - List listCpCpk = CpCpkHelper.GetCpList(listMStrData, dUSL, dLSL); - labCp.Text = listCpCpk[0].ToString("F4"); - labCpl.Text = listCpCpk[1].ToString("F4"); - labCpu.Text = listCpCpk[2].ToString("F4"); - labCpk.Text = listCpCpk[3].ToString("F4"); - List listPpPpk = CpCpkHelper.GetPpList(listMStrData, dUSL, dLSL); - labPp.Text = listPpPpk[0].ToString("F4"); - labPpl.Text = listPpPpk[1].ToString("F4"); - labPpu.Text = listPpPpk[2].ToString("F4"); - labPpk.Text = listPpPpk[3].ToString("F4"); - - #endregion 数据赋值 - - #region 画柱状图 - - Dictionary histogramDataDic = new Dictionary(); - histogramDataDic = CpCpkHelper.GetHistogramData(listMDoubleData); - string[] strXValue = new string[histogramDataDic.Count]; - int[] dYValue = new int[histogramDataDic.Count]; - for (int i = 0; i <= histogramDataDic.Count - 1; i++) - { - strXValue[i] = (histogramDataDic.ElementAt(i).Key); - dYValue[i] = int.Parse(histogramDataDic.ElementAt(i).Value); - } - chartCPCPK.Series[0].Label = "#VAL"; //设置显示Y的值 - chartCPCPK.Series[0].LabelForeColor = Color.White; - chartCPCPK.Series[0].ToolTip = "区间范围 : #VALX \r\n数量 : #VAL"; //鼠标移动到对应点显示数值 - chartCPCPK.Series[0].Points.DataBindXY(strXValue, dYValue); - - #endregion 画柱状图 - - chartCPCPK.Visible = true; - labSearchCPCPKResult.Visible = false; - pnlCPCPK.Visible = true; - } - } - - #endregion CP CPK - - #region 软件设置 - - private void lpcSoftwareSetup_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - FSoftwareSetup fss = new FSoftwareSetup(); - fss.ShowDialog(this); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcToleranceSetup_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - FToleranceSetup fts = new FToleranceSetup(); - fts.ShowDialog(this); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcRange_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - FRangeSetup frs = new FRangeSetup(); - frs.ShowDialog(this); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcPLCAddress_Click(object sender, EventArgs e) - { - string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); - if (strInputPwd.Contains("-999.999")) - { - return; - } - else if (strInputPwd == ConfigDfn.strPwd) - { - PlcAddrSetup PLCAS = new PlcAddrSetup(3, ConfigDfn.strConfigFile); - PLCAS.Show(); - } - else - { - MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - } - - private void lpcPLCTest_Click(object sender, EventArgs e) - { - FormDebugSiemensS7 FDS7 = new FormDebugSiemensS7(SiemensPLCS.S1200); - FDS7.Show(); - } - - private void lpcAboutSoftware_Click(object sender, EventArgs e) - { - AboutSoftwareInfo asi = new AboutSoftwareInfo(); - asi.ShowDialog(); - } - - private void lpcShowLog_Click(object sender, EventArgs e) - { - System.Diagnostics.Process.Start("notepad.exe", LogDebugDfn.strDebugFile); - } - - #endregion 软件设置 - - #region RadButton鼠标事件 - - private void btn_MouseHover(object sender, EventArgs e) - { - RadButton btn = sender as RadButton; - btn.BackColor = Color.FromArgb(0, 151, 186); - } - - private void btn_MouseLeave(object sender, EventArgs e) - { - RadButton btn = sender as RadButton; - btn.BackColor = Color.FromArgb(19, 46, 53); - } - - #endregion RadButton鼠标事件 - - #region PLC相关函数 - - #region PLC重连操作 - - private void tmrReadPLCData_Tick(object sender, EventArgs e) - { - tmrReadPLCData.Stop(); - - #region 判断PLC是否正常运行 - - if (ConfigPlc.PlcType == 3 && ConfigPlc.bReConnect && !HslSiemensS7Obj.bConnected) - { - MyBase.TraceWriteLine("PLC断开,重连!"); - tmrHeartBeatConnect.Stop(); - ReConnectPLC(); - return; - } - - byte[] m_Datas = null; - if (!HslSiemensS7Obj.ReadDatas(PlcAddrSetup.S7ReadStartAddr, (ushort)PlcAddrSetup.S7ReadByteCount, ref m_Datas)) - { - tmrReadPLCData.Start(); - return; - } - if (m_Datas == null) - { - tmrReadPLCData.Start(); - MyBase.TraceWriteLine("PLC读取数据对象为空,退出!"); - return; - } - - #endregion 判断PLC是否正常运行 - - try - { - #region 循环读取PLC数据块中的信息 - - if (m_Datas.Length >= PlcAddrSetup.S7ReadByteCount) - { - PLCDfn.bPlcLiveTick = PlcObject.GetS7ByteData(PlcSignalDfn.PlcLive) == 1; - PLCDfn.ReadVINFinishFlag = PlcObject.GetS7ByteData(PlcSignalDfn.ReadVINFinishFlag); - //从PLC获取VIN码后,通过访问IOT接口 获取汽车类型,再反馈给PLC - if (iLastReadVINFinishFlag == 0 && PLCDfn.ReadVINFinishFlag == 10) - { - string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); - //PLCDfn.CarType = PlcObject.GetS7ByteData(PlcSignalDfn.CarType); - MyBase.TraceWriteLine("PLC读码完成信号:0->10;Read PLC VIN is: " + strCarID); - if (strCarID.Length > 10) - { - string strCarColor = ""; - string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); - if (!strCarType.ToUpper().Contains("ERR")) - { - if (strCarType.ToUpper().Contains("EH3")) - { - PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)1); - } - else - { - PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)2); - } - PlcObject.InsertWriteQueue(PlcSignalDfn.WCarColor, strCarColor); - MyBase.TraceWriteLine("往PLC写入车型: " + strCarType + " ;车身颜色:" + strCarColor); - tmdal.InsertVIN(strCarID); - MyBase.TraceWriteLine(strCarID + " 插入到数据库表TTempSaveVIN中完成。"); - } - else - { - MyBase.TraceWriteLine("报错:根据VIN从IOT上获取车型信息失败,不发送给PLC车型信息和颜色信息。 "); - } - } - } - PLCDfn.CarPassFlag = PlcObject.GetS7ByteData(PlcSignalDfn.CarPassFlag); - if (iLastCarPassFlag == 0 && PLCDfn.CarPassFlag == 10) - { - string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); - MyBase.TraceWriteLine("读取PLC CarPassFlag 完成信号:0->10;Read PLC VIN is: " + strCarID); - string strSecondPosCarID = tmdal.SelectMaintenanceStationVINbyStationNo(2); - if (strSecondPosCarID.Length == 21) - { - string strTempCarID = strSecondPosCarID.Substring(0, 17); - string strTempCarType = strSecondPosCarID.Substring(18, 3); - if (tmdal.CheckMRVINExistOrNotByVIN(strTempCarID) == 0) - { - string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; - - MyBase.TraceWriteLine(strSecondPosCarID + " ;该VIN码只扫码没有测量,没有测量结果,上传IOT NG消息。"); - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strTempCarID + "\",\"model\":\"" + strTempCarType + "\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"NG\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"0.00%\",\"GapList\":[]}]}"; - MyBase.TraceWriteLine("Update NG To IOT Data Content: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); - MyBase.TraceWriteLine("NG数据上传IOT完成,结果返回为:" + strPostResult); - } - } - - if (!string.IsNullOrEmpty(strCarID) && strCarID.Length > 10) - { - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); - Thread.Sleep(20); - string strCarColor = ""; - string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); - if (!strCarType.ToUpper().Contains("ERR")) - { - if (strCarType.ToUpper().Contains("EH3")) - { - strCarID = strCarID + "_EH3"; - } - else - { - strCarID = strCarID + "_EHY"; - } - } - tmdal.updateMaintenceInfo(strCarID, 1); - MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为: " + strCarID); - } - else - { - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); - Thread.Sleep(20); - tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); - Thread.Sleep(20); - tmdal.updateMaintenceInfo("empty", 1); - MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为:empty "); - } - - } - if (ConfigDfn.iRecordEncoderFlag == 1) - { - double dSpeed1 = PlcObject.GetS7Double(PlcSignalDfn.Speed1); - double dSpeed2 = PlcObject.GetS7Double(PlcSignalDfn.Speed2); - double dR01 = PlcObject.GetS7Double(PlcSignalDfn.R01_Pules); - double dR02 = PlcObject.GetS7Double(PlcSignalDfn.R02_Pules); - NLogger.Fatal(dSpeed1 + "," + dSpeed2 + "," + dR01 + "," + dR02); - } - } - iLastCarPassFlag = PLCDfn.CarPassFlag; - iLastReadVINFinishFlag = PLCDfn.ReadVINFinishFlag; - #endregion 循环读取PLC数据块中的信息 - } - catch (Exception ex) - { - MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); - } - - - tmrReadPLCData.Start(); - } - - private void tmrRefreshPLCStatus_Tick(object sender, EventArgs e) - { - if (labelTimeStatus_Tip.Text == "─") { labelTimeStatus_Tip.Text = "╲"; } - else if (labelTimeStatus_Tip.Text == "╲") { labelTimeStatus_Tip.Text = "│"; } - else if (labelTimeStatus_Tip.Text == "│") { labelTimeStatus_Tip.Text = "╱"; } - else if (labelTimeStatus_Tip.Text == "╱") { labelTimeStatus_Tip.Text = "─"; } - - lampPLCHeart.State = PLCDfn.bPlcLiveTick ? LampColor.Green : LampColor.Silver; - rlePLCHeart.ForeColor = PLCDfn.bPlcLiveTick ? Color.Lime : Color.White; - } - - private void tmrHeartBeatConnect_Tick(object sender, EventArgs e) - { - if (bPlcLiveTickLast != PLCDfn.bPlcLiveTick) - { - HeartBeatCount = 0; - } - else - { - HeartBeatCount++; - } - - if (HeartBeatCount >= 600) - { - HeartBeatCount = 0; - if (!bStopPlcNormal) - { - MyBase.TraceWriteLine("PLC心跳检测10分钟内未变化,断开PLC,进行PLC重连!"); - PlcObject.ClosePlc(); - } - } - bPlcLiveTickLast = PLCDfn.bPlcLiveTick; - } - - private void tmrWritePLCLive_Tick(object sender, EventArgs e) - { - bTickt = !bTickt; - PlcObject.InsertWriteQueue(PlcSignalDfn.SoftLive, Convert.ToByte(bTickt ? 1 : 0)); - } - - private void ReConnectPLC() - { - m_ThreadReconnectPLC = null; - m_ThreadReconnectPLC = new Thread(new ThreadStart(ReConnectPlcProcess)); - if (!m_ThreadReconnectPLC.IsAlive) - { - m_ThreadReconnectPLC.Start(); - } - } - - private void ReConnectPlcProcess() - { - while (!PlcObject.IsPlcConnected()) - { - bool bConnectResult = PlcObject.ConnectPlc(); - if (!bConnectResult) - { - m_ReConnectNum++; - MyBase.TraceWriteLine("重连PLC,第" + m_ReConnectNum + "次!"); - } - Thread.Sleep(1000); - } - MyBase.TraceWriteLine("重新连接PLC成功!"); - lampConnectPLCStatus.State = LampColor.Green; - rlePLCStatus.ForeColor = Color.Lime; - this.BeginInvoke((EventHandler)delegate - { - tmrHeartBeatConnect.Start(); - }); - bStopPlcNormal = false; - m_ReConnectNum = 0; - this.Invoke((EventHandler)(delegate - { - tmrReadPLCData.Start(); - tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 - tmrRefreshPLCStatus.Start();//刷新PLC等的状态 - })); - m_ThreadReconnectPLC.Abort(); - } - - #endregion PLC重连操作 - - private void ConnectThread() - { - MyBase.TraceWriteLine("连接PLC...."); - - bool bConnectResult = PlcObject.ConnectPlc(); - this.Invoke((EventHandler)(delegate - { - if (bConnectResult) - { - lampConnectPLCStatus.State = LampColor.Green; - rlePLCStatus.ForeColor = Color.Lime; - MyBase.TraceWriteLine("连接PLC成功"); - } - else - { - lampConnectPLCStatus.State = LampColor.Red; - rlePLCStatus.ForeColor = Color.Red; - tmrReadPLCData.Stop(); - MyBase.TraceWriteLine("连接PLC失败"); - return; - } - - tmrReadPLCData.Start(); //读取PLC数据信息 - tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 - tmrRefreshPLCStatus.Start();//刷新PLC等的状态 - if (ConfigPlc.bReConnect) - tmrHeartBeatConnect.Start(); //监测来自plc的心跳5分钟内没有变化,重新连接PLC - })); - } - - private void btnConnectPlc_Click(object sender, EventArgs e) - { - try - { - PlcObject.InitWritePlcThread(); - bStopPlcNormal = false; - Thread m_Thread = new Thread(ConnectThread); - m_Thread.Start(); - return; - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - private void btnClosePlc_Click(object sender, EventArgs e) - { - try - { - MyBase.TraceWriteLine("点击了断开PLC按钮,断开PLC!"); - tmrReadPLCData.Stop(); - tmrHeartBeatConnect.Stop(); - tmrWritePLCLive.Stop(); - tmrRefreshPLCStatus.Stop(); - lampConnectPLCStatus.State = LampColor.White; - rlePLCStatus.ForeColor = Color.White; - rlePLCHeart.ForeColor = Color.White; - lampPLCHeart.State = LampColor.White; - bStopPlcNormal = true; - PlcObject.ClosePlc(); - } - catch (Exception ex) - { - MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); - } - } - - #endregion PLC相关函数 - - private void lpcUploadIOTTest_Click(object sender, EventArgs e) - { - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"test001\",\"model\":\"EHY\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"OK\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"GapList\":[{\"vin\":\"test001\",\"gfNo\":\"F\",\"pointNumber\":\"L-01\",\"actualValue\":\"-0.30\",\"controlLine\":\"-1.00/1.00\",\"measurementResult\":\"OK\"}]}]}"; - MyBase.TraceWriteLine("Test Post Data: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); - MessageBox.Show("测试上传数据完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - MyBase.TraceWriteLine("测试上传数据完成,获取到的返回值为: " + strPostResult); - } - private void lpcTestGetCarTye_Click(object sender, EventArgs e) - { - string strPostData = "{\"serno\":\"312314141\",\"vin\":\"LNNAJDDU9RDA00213\"}"; - MyBase.TraceWriteLine("Test Post Data: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 10000); - MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - MyBase.TraceWriteLine("测试从IOT获取车型信息完成,获取到的原返回值为: " + strPostResult); - string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); - MessageBox.Show("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - MyBase.TraceWriteLine("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult); - CheryCarTypeInfo ccti = new CheryCarTypeInfo(); - ccti = JsonConvert.DeserializeObject(strNewResult); - MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strNewResult + "; 解析出的车型:" + ccti.data.model + " ;解析出的物料号为" + ccti.data.material + " ;解析出颜色编号:" + ccti.data.material.Substring(7, 2), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); - } - private string GetCarTypeByIOTAPI(string strVIN, out string strMaterialNo) - { - string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"vin\":\"" + strVIN + "\"}"; - MyBase.TraceWriteLine(" Post VIN Data: " + strPostData); - string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 5000); - MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return CarType Infomation : " + strPostResult); - string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); - MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return New CarType Infomation : " + strNewResult); - CheryCarTypeInfo ccti = new CheryCarTypeInfo(); - ccti = JsonConvert.DeserializeObject(strNewResult); - if (ccti.message.Contains("成功")) - { - - if (ccti.data.material != null && ccti.data.material.Length > 9) - { - strMaterialNo = ccti.data.material.Substring(7, 2); - MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + "解析出车颜色编号:" + strMaterialNo); - } - else - { - strMaterialNo = "TE"; - MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + ";未解析出车颜色编号"); - } - return ccti.data.model; - } - else - { - MyBase.TraceWriteLine(" IOT Return CarType Infomation ERROR : " + strPostResult); - strMaterialNo = "ER"; - return "ERR"; - } - } - - private void lpcShowCarData_Click(object sender, EventArgs e) - { - if (ConfigDfn.strShowCarLR == "L") - { - if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) - { - fLEH3.Show(); - fLEHY.Show(); - fLEHY.Hide(); - } - else - { - fLEH3.Show(); - fLEH3.Hide(); - fLEHY.Show(); - } - } - else - { - if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) - { - fREH3.Show(); - fREHY.Show(); - fREHY.Hide(); - } - else - { - fREH3.Show(); - fREH3.Hide(); - fREHY.Show(); - } - } - } - public void ShowCarMeasureDataByCarType(int iCarType) - { - if (ConfigDfn.strShowCarLR == "L") - { - if (iCarType == 1) - { - fLEH3.Show(); - fLEHY.Show(); - fLEHY.Hide(); - MyBase.TraceWriteLine("显示左侧EH3车身数据界面。"); - } - else - { - fLEH3.Show(); - fLEH3.Hide(); - fLEHY.Show(); - MyBase.TraceWriteLine("显示左侧EHY车身数据界面。"); - } - } - else - { - if (iCarType == 1) - { - fREH3.Show(); - fREHY.Show(); - fREHY.Hide(); - MyBase.TraceWriteLine("显示右侧EH3车身数据界面。"); - } - else - { - fREH3.Show(); - fREH3.Hide(); - fREHY.Show(); - MyBase.TraceWriteLine("显示右侧EHY车身数据界面。"); - } - } - } - private void rbtnTestCOM_Click(object sender, EventArgs e) - { - if (rbtnTestCOM.Text == "打开串口") - { - serialTestPort = new SerialPort(rtbPort.Text.Trim(), 115200, Parity.None, 8, StopBits.One); // 设置串口参数 - serialTestPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // 注册数据接收事件处理方法 - serialTestPort.Open(); // 打开串口 - if (serialTestPort.IsOpen) - { - rbtnTestCOM.Text = "关闭串口"; - } - } - else - { - serialTestPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler); - serialTestPort.Close(); - serialTestPort.Dispose(); - rbtnTestCOM.Text = "打开串口"; - } - } - - private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) - { - SerialPort sp = (SerialPort)sender; - string indata = sp.ReadExisting(); - MyBase.TraceWriteLine(indata); - rtbCOMContent.Text = indata; - } - - private void tmrMonitorDBToCreateReport_Tick(object sender, EventArgs e) - { - tmrMonitorDBToCreateReport.Stop(); - int iCurrentMeasureCount = tmdal.SelectTMeasureResultCount(); - if (iCurrentMeasureCount > iLastMesureCount && (iCurrentMeasureCount == (iLastMesureCount + 1))) - { - MyBase.TraceWriteLine("监控数据库,开始生成ipn文件:"); - DataTable dtMeaResult = tmdal.SelectNewestTMeasureResult(); - string strVIN = dtMeaResult.Rows[0]["CarID"].ToString(); - DateTime dateMeaDate = Convert.ToDateTime(dtMeaResult.Rows[0]["Remark"].ToString()); - DataTable dtMeaContent = tmdal.SelectTMeasureDataByVIN(strVIN); - string strCarType = dtMeaContent.Rows[0][2].ToString(); - int iMeaCount = dtMeaContent.Rows.Count; - - #region 解析完报告后,重新生成客户模板报告 - - string filePath = ""; - if (strCarType.ToLower().Contains("tava")) - { - filePath = ConfigDfn.strReportPath + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; - } - else - { - filePath = ConfigDfn.strReportPath2 + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; - } - - StringBuilder sb = new StringBuilder(); - - #region 添加表头 - - sb.Append("GAUGE ID"); - sb.Append("\t"); - sb.Append("JSN"); - sb.Append("\t"); - sb.Append("MO"); - sb.Append("\t"); - sb.Append("DAY"); - sb.Append("\t"); - sb.Append("YR"); - sb.Append("\t"); - sb.Append("HR"); - sb.Append("\t"); - sb.Append("MIN"); - sb.Append("\t"); - sb.Append("SEC"); - sb.Append("\t"); - sb.Append("MODEL"); - sb.Append("\t"); - sb.Append("AuxID1"); - sb.Append("\t"); - sb.Append("AuxID2"); - sb.Append("\t"); - sb.Append("QUAL"); - sb.Append("\t"); - sb.Append("SHIFT"); - sb.Append("\t"); - sb.Append("DATA TYPE"); - sb.Append("\t"); - sb.Append("FIXTURE"); - sb.Append("\t"); - for (int i = 0; i < iMeaCount / 2; i++) - { - string strMeaPointName = dtMeaContent.Rows[i * 2]["MeasPointName"].ToString(); - string strMPF = strMeaPointName + " Flush"; - string strMPG = strMeaPointName + " Gap"; - sb.Append("D " + strMPF); - sb.Append("\t"); - sb.Append("D " + strMPG); - sb.Append("\t"); - - sb.Append("B " + strMPF); - sb.Append("\t"); - sb.Append("B " + strMPG); - sb.Append("\t"); - - sb.Append("A " + strMPF); - sb.Append("\t"); - sb.Append("A " + strMPG); - sb.Append("\t"); - - sb.Append("US " + strMPF); - sb.Append("\t"); - sb.Append("LS " + strMPF); - sb.Append("\t"); - sb.Append("US " + strMPG); - sb.Append("\t"); - sb.Append("LS " + strMPG); - sb.Append("\t"); - - sb.Append("UR " + strMPF); - sb.Append("\t"); - sb.Append("LR " + strMPF); - sb.Append("\t"); - sb.Append("UR " + strMPG); - sb.Append("\t"); - sb.Append("LR " + strMPG); - sb.Append("\t"); - - sb.Append("UT " + strMPF); - sb.Append("\t"); - sb.Append("LT " + strMPF); - sb.Append("\t"); - sb.Append("UT " + strMPG); - sb.Append("\t"); - sb.Append("LT " + strMPG); - sb.Append("\t"); - } - - #endregion 添加表头 - - sb.AppendLine(); - - #region 添加内容 - - sb.Append(ConfigDfn.strStationName); - sb.Append("\t"); - sb.Append(strVIN); - sb.Append("\t"); - sb.Append(dateMeaDate.Month.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Day.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Year.ToString().Substring(2)); - sb.Append("\t"); - sb.Append(dateMeaDate.Hour.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Minute.ToString()); - sb.Append("\t"); - sb.Append(dateMeaDate.Second.ToString()); - sb.Append("\t"); - if (strCarType.ToLower().Contains("tava")) - sb.Append(ConfigDfn.strUploadPath); - else - { - sb.Append(ConfigDfn.strUploadPath2); - } - sb.Append("\t"); - sb.Append("Unknow"); - sb.Append("\t"); - sb.Append("Unknow"); - sb.Append("\t"); - sb.Append("2"); - sb.Append("\t"); - sb.Append(""); - sb.Append("\t"); - sb.Append("AUTO"); - sb.Append("\t"); - sb.Append("NONE"); - sb.Append("\t"); - - double dDevFVal = 0; - double dDevGVal = 0; - - double dMeaFVal = 0; - double dMeaGVal = 0; - - double dNorFVal = 0; - double dNorGVal = 0; - - double dFUpper = 0; - double dFLower = 0; - double dGUpper = 0; - double dGLower = 0; - - double dFUpper2 = 0; - double dFLower2 = 0; - double dGUpper2 = 0; - double dGLower2 = 0; - - double dFUpper3 = 0; - double dFLower3 = 0; - double dGUpper3 = 0; - double dGLower3 = 0; - for (int i = 0; i < iMeaCount / 2; i++) - { - string strMeasureFValue = dtMeaContent.Rows[i * 2]["MeasureValue"].ToString(); - string strMeasureGValue = dtMeaContent.Rows[i * 2 + 1]["MeasureValue"].ToString(); - string strNormalFValue = dtMeaContent.Rows[i * 2]["NormalValue"].ToString(); - string strNormalGValue = dtMeaContent.Rows[i * 2 + 1]["NormalValue"].ToString(); - - dNorFVal = double.Parse(strNormalFValue); - dNorGVal = double.Parse(strNormalGValue); - dFUpper = double.Parse(dtMeaContent.Rows[i * 2]["UpperTolVal"].ToString()); - dFLower = double.Parse(dtMeaContent.Rows[i * 2]["LowerTolVal"].ToString()); - dGUpper = double.Parse(dtMeaContent.Rows[i * 2 + 1]["UpperTolVal"].ToString()); - dGLower = double.Parse(dtMeaContent.Rows[i * 2 + 1]["LowerTolVal"].ToString()); - - dFUpper2 = dFUpper * ConfigDfn.dLevel2; - dFLower2 = dFLower * ConfigDfn.dLevel2; - dGUpper2 = dGUpper * ConfigDfn.dLevel2; - dGLower2 = dGLower * ConfigDfn.dLevel2; - - dFUpper3 = dFUpper * ConfigDfn.dLevel3; - dFLower3 = dFLower * ConfigDfn.dLevel3; - dGUpper3 = dGUpper * ConfigDfn.dLevel3; - dGLower3 = dGLower * ConfigDfn.dLevel3; - - if (strMeasureFValue.Contains("inv")) - { - sb.Append("inv"); - sb.Append("\t"); - } - else - { - dMeaFVal = double.Parse(strMeasureFValue); - dDevFVal = dMeaFVal - dNorFVal; - sb.Append(dDevFVal.ToString("F3")); - sb.Append("\t"); - } - if (strMeasureGValue.Contains("inv")) - { - sb.Append("inv"); - sb.Append("\t"); - } - else - { - dMeaGVal = double.Parse(strMeasureGValue); - dDevGVal = dMeaGVal - dNorGVal; - sb.Append(dDevGVal.ToString("F3")); - sb.Append("\t"); - } - - sb.Append(strNormalFValue); - sb.Append("\t"); - sb.Append(strNormalGValue); - sb.Append("\t"); - - sb.Append(strMeasureFValue); - sb.Append("\t"); - sb.Append(strMeasureGValue); - sb.Append("\t"); - - sb.Append(dFUpper.ToString("F3")); - sb.Append("\t"); - sb.Append(dFLower.ToString("F3")); - sb.Append("\t"); - sb.Append(dGUpper.ToString("F3")); - sb.Append("\t"); - sb.Append(dGLower.ToString("F3")); - sb.Append("\t"); - - sb.Append(dFUpper2.ToString("F3")); - sb.Append("\t"); - sb.Append(dFLower2.ToString("F3")); - sb.Append("\t"); - sb.Append(dGUpper2.ToString("F3")); - sb.Append("\t"); - sb.Append(dGLower2.ToString("F3")); - sb.Append("\t"); - - sb.Append(dFUpper3.ToString("F3")); - sb.Append("\t"); - sb.Append(dFLower3.ToString("F3")); - sb.Append("\t"); - sb.Append(dGUpper3.ToString("F3")); - sb.Append("\t"); - sb.Append(dGLower3.ToString("F3")); - sb.Append("\t"); - } - - #endregion 添加内容 - - // 将数据写入CSV文件 - File.WriteAllText(filePath, sb.ToString()); - MyBase.TraceWriteLine("客户定制ipn报告生成完毕,路径为:" + filePath); - - #endregion 解析完报告后,重新生成客户模板报告 - } - iLastMesureCount = iCurrentMeasureCount; - tmrMonitorDBToCreateReport.Start(); - } - - - } - - public class CheryIOTData - { - /// VIN号 - public string vin { get; set; } - - /// FG - public string gfNo { get; set; } - - /// 测点编号 - public string pointNumber { get; set; } - - /// 实测值 - public string actualValue { get; set; } - - /// 控制线 - public string controlLine { get; set; } - - /// 测量结果 - public string measurementResult { get; set; } - } - public class CarInfoData - { - public string material { get; set; } - public string model { get; set; } - } - public class CheryCarTypeInfo - { - /// data - public CarInfoData data { get; set; } - - /// message - public string message { get; set; } - - /// serno - public string serno { get; set; } - - /// success - public string success { get; set; } - - } - - public static class JsonHelper - { - /// - /// 对象转成JSON 格式字符串 - /// - /// 对象 - /// JSON格式的字符串 - public static string ObjectToJson(object obj) - { - return JsonConvert.SerializeObject(obj); - } - - /// - /// 解析JSON字符串生成对象实体 - /// - /// 对象类型 - /// json字符串 - /// 对象实体 - public static T DeserializeJsonToObject(string json) where T : class - { - Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); - StringReader sr = new StringReader(json); - object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T)); - T t = o as T; - return t; - } - - /// - /// 解析JSON数组生成对象实体集合 - /// - /// 对象类型 - /// json数组字符串(eg.[{"ID":"112","Name":"石子儿"}]) - /// 对象实体集合 - public static List DeserializeJsonToList(string json) where T : class - { - Newtonsoft.Json.JsonSerializer serializer = new JsonSerializer(); - StringReader sr = new StringReader(json); - object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List)); - List list = o as List; - return list; - } - - /// - /// 数据表转键值对集合 - /// 把DataTable转成 List集合, 存每一行 - /// 集合中放的是键值对字典,存每一列 - /// - /// 数据表 - /// 哈希表数组 - public static List> DataTableToList(DataTable dt) - { - List> list = new List>(); - - foreach (DataRow dr in dt.Rows) - { - Dictionary dic = new Dictionary(); - foreach (DataColumn dc in dt.Columns) - { - dic.Add(dc.ColumnName, dr[dc.ColumnName]); - } - list.Add(dic); - } - return list; - } - - /// - /// 数据集转键值对数组字典 - /// - /// 键值对数组字典 - public static Dictionary>> DataSetToDic(DataSet ds) - { - Dictionary>> result = new Dictionary>>(); - - foreach (DataTable dt in ds.Tables) - result.Add(dt.TableName, DataTableToList(dt)); - - return result; - } - - /// - /// 数据表转JSON - /// - /// 数据表 - /// JSON字符串 - public static string DataTableToJson(DataTable dt) - { - return ObjectToJson(DataTableToList(dt)); - } - - /// - /// JSON文本转对象,泛型方法 常用 - /// - /// 类型 - /// JSON文本 - /// 指定类型的对象 - public static T JsonToObject(string jsonText) - { - return JsonConvert.DeserializeObject(jsonText); - } - - /// - /// 将JSON文本转换为数据表数据 - /// - /// JSON文本 - /// 数据表字典 - public static Dictionary>> TablesDataFromJson(string jsonText) - { - return JsonToObject>>>(jsonText); - } - - /// - /// 将JSON文本转换成数据行 - /// - /// JSON文本 - /// 数据行的字典 - public static Dictionary DataRowFromJson(string jsonText) - { - return JsonToObject>(jsonText); - } - } + { + double dMax = dMeasureData.Max(); + double dMin = dMeasureData.Min(); + double dRangeData = dMax - dMin; + strRangeValue = dRangeData.ToString("F1"); + if (dRangeData >= Convert.ToDouble(dtRange.Rows[i]["RangeLower"]) && dRangeData <= Convert.ToDouble(dtRange.Rows[i]["RangeUpper"])) + { + strRangeResult = "OK"; + } + else + { + strRangeResult = "NG"; + } + } + strRangeLowUpp = dtRange.Rows[i]["RangeLower"].ToString() + @"/" + dtRange.Rows[i]["RangeUpper"].ToString(); + dtRangeData.Rows.Add(strVIN, dtRange.Rows[i]["RangeName"].ToString(), strRangeValue, strRangeLowUpp, strRangeResult, dtTime, strRemark); + } + tmdal.InsertTRangeDatabyDataTable(dtRangeData); + MyBase.TraceWriteLine(strVIN + " " + strCarType + "计算极差完成,并插入数据库:============"); + } + } + + public string PostJsonToIOT(string url, string jsonData, int? timeout = null) + { + try + { + HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url); + + if (null != timeout && 0 != timeout) + { + req.Timeout = timeout.Value; + } + Encoding encoding = Encoding.UTF8; + byte[] bs = Encoding.UTF8.GetBytes(jsonData); + string responseData; + req.Method = "POST"; + req.ContentType = "application/json"; + req.ContentLength = bs.Length; + using (Stream reqStream = req.GetRequestStream()) + { + reqStream.Write(bs, 0, bs.Length); + reqStream.Close(); + } + using (HttpWebResponse response = (HttpWebResponse)req.GetResponse()) + { + using (StreamReader reader = new StreamReader(response.GetResponseStream(), encoding)) + { + responseData = reader.ReadToEnd(); + } + } + return responseData; + } + catch (Exception ex) + { + return "Error: " + ex.ToString(); + } + } + + /// 通过给定的文件流,判断文件的编码类型 + /// 文件流 + /// 文件的编码类型 + public static Encoding GetType(FileStream fs) + { + byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; + byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; + byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM + System.Text.Encoding reVal = System.Text.Encoding.Default; + + System.IO.BinaryReader r = new System.IO.BinaryReader(fs, System.Text.Encoding.Default); + int i; + int.TryParse(fs.Length.ToString(), out i); + byte[] ss = r.ReadBytes(i); + if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) + { + reVal = System.Text.Encoding.UTF8; + } + else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) + { + reVal = System.Text.Encoding.BigEndianUnicode; + } + else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) + { + reVal = System.Text.Encoding.Unicode; + } + r.Close(); + return reVal; + } + + /// 判断是否是不带 BOM 的 UTF8 格式 + /// + /// + private static bool IsUTF8Bytes(byte[] data) + { + int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 + byte curByte; //当前分析的字节. + for (int i = 0; i < data.Length; i++) + { + curByte = data[i]; + if (charByteCounter == 1) + { + if (curByte >= 0x80) + { + //判断当前 + while (((curByte <<= 1) & 0x80) != 0) + { + charByteCounter++; + } + //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X  + if (charByteCounter == 1 || charByteCounter > 6) + { + return false; + } + } + } + else + { + //若是UTF-8 此时第一位必须为1 + if ((curByte & 0xC0) != 0x80) + { + return false; + } + charByteCounter--; + } + } + if (charByteCounter > 1) + { + throw new Exception("非预期的byte格式"); + } + return true; + } + + public Encoding GetType(string FileName) + { + FileStream fs = new FileStream(FileName, FileMode.Open, FileAccess.Read); + Encoding er = GetType(fs); + fs.Close(); + return er; + } + + private void testIotUpload() + { + // 修复极差 计算问题 + //LNNBBDEC7SDF49695 + //string strVIN = "LNNBBDEC5SDF49694"; + // string strCarType = "EHY"; + //CalculateRange(strVIN, strCarType); + + //修复IOt上传问题 + string strCarID = "LNNBDDEF4SDF49707"; + DataTable dtAllRangeDate = tmdal.SelectRangeDatabyCarID(strCarID); + string strTargetRate = "97.00%"; + UploadIOTData(strCarID, dtAllRangeDate, strTargetRate); + } + + #endregion 解析Nextsense CSV文件功能 + + #region Home Page + + /// + /// 设置DataGridView各行变色 + /// + /// DataGridView + public void SetdgvRowBgColor(DataGridView dgv) + { + if (dgv.Rows.Count > 0) + { + foreach (DataGridViewRow item in dgv.Rows) + { + if (item.Index % 2 == 0) + { + item.DefaultCellStyle.BackColor = Color.FromArgb(19, 46, 53); + } + else + { + item.DefaultCellStyle.BackColor = Color.FromArgb(27, 60, 68); + } + } + } + } + + //TODO: + + #endregion Home Page + + #region Search Data + + #region datagridview分页功能 + + /// + /// LoadPage方法 + /// + private void LoadPage() + { + if (currentPage < 1) currentPage = 1; + if (currentPage > pageCount) currentPage = pageCount; + + int beginRecord; //开始指针 + int endRecord; //结束指针 + DataTable dtTemp; + dtTemp = PageTable.Clone();//Clone方法只会复制DataTable的结构(列定义),而不会复制数据行的引用。 + + beginRecord = pageSize * (currentPage - 1); + if (currentPage == 1) beginRecord = 0; + endRecord = pageSize * currentPage; + + if (currentPage == pageCount) endRecord = recordCount; + for (int i = beginRecord; i < endRecord; i++) + { + // 使用ImportRow方法将源PageTable的行导入到目标dtTemp + dtTemp.ImportRow(PageTable.Rows[i]); + } + + dgvSelectMeasureData.Rows.Clear(); + + for (int i = 0; i < dtTemp.Rows.Count; i++) + { + dgvSelectMeasureData.Rows.Add(new object[] { dtTemp.Rows[i][0], dtTemp.Rows[i][1], dtTemp.Rows[i][2], dtTemp.Rows[i][3], dtTemp.Rows[i][4], dtTemp.Rows[i][5], dtTemp.Rows[i][6], dtTemp.Rows[i][7], dtTemp.Rows[i][8] }); + } + SetdgvRowBgColor(dgvSelectMeasureData); + for (int i = 0; i < dgvSelectMeasureData.Rows.Count; i++) + { + string strResult = dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Value.ToString(); + if (strResult.ToLower().Contains("ng")) + { + //dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Orange; + dgvSelectMeasureData.Rows[i].DefaultCellStyle.BackColor = Color.Orange; + } + if (strResult.ToLower().Contains("rej")) + { + dgvSelectMeasureData.Rows[i].Cells["MeasureItemResult"].Style.ForeColor = Color.Red; + } + } + labCurrentPage.Text = "当前页:" + currentPage.ToString(); //当前页 + labSumPages.Text = "共 " + pageCount.ToString() + " 页";//总页数 + labSumRecorders.Text = "总共 " + recordCount.ToString() + " 条记录";//总记录数 + } + + private void rbtnFirtstPage_Click(object sender, EventArgs e) + { + if (currentPage == 1) + { return; } + currentPage = 1; + LoadPage(); + } + + private void rbtnPrevPage_Click(object sender, EventArgs e) + { + if (currentPage == 1) + { return; } + currentPage--; + LoadPage(); + } + + private void rbtnNextPage_Click(object sender, EventArgs e) + { + if (currentPage == pageCount) + { return; } + currentPage++; + LoadPage(); + } + + private void rbtnLastPage_Click(object sender, EventArgs e) + { + if (currentPage == pageCount) + { return; } + currentPage = pageCount; + LoadPage(); + } + + private void rddlPageRecorderCount_SelectedIndexChanged(object sender, Telerik.WinControls.UI.Data.PositionChangedEventArgs e) + { + pageSize = int.Parse(rddlPageRecorderCount.Text.Trim()); + //PageSorter(); + } + + #endregion datagridview分页功能 + + private void rbtnSearchMeaserData_Click(object sender, EventArgs e) + { + dgvFPYResult.Visible = false; + chartFPYLine.Visible = false; + rbtnExportCSVReport.Visible = false; + string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; + string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; + string strCarID = rtbPartID.Text.Trim(); + PageTable.Clear(); + PageTable = tmdal.SelectTMeasureDataByCarIDAndTime(strCarID, strStartTime, strEndTime); + if (PageTable.Rows.Count > 0) + { + recordCount = PageTable.Rows.Count; //记录总行数 + pageCount = (recordCount / pageSize); + if ((recordCount % pageSize) > 0) + { + pageCount++; + } + + //默认第一页 + currentPage = 1; + + LoadPage();//调用加载数据的方法 + dgvSelectMeasureData.Visible = true; + rbtnExportCSVReport.Visible = true; + pnlPage.Visible = true; + labSearchResult.Visible = false; + pnlPage.Visible = true; + } + else + { + dgvSelectMeasureData.Visible = false; + labSearchResult.Visible = true; + rbtnExportCSVReport.Visible = false; + pnlPage.Visible = false; + } + } + + private void rbtSelectFPY_Click(object sender, EventArgs e) + { + dgvSelectMeasureData.Visible = false; + rbtnExportCSVReport.Visible = false; + pnlPage.Visible = false; + string strStartTime = rdtpStartTime.Value.ToString("yyyy-MM-dd") + " 00:00:00"; + string strEndTime = rdtpEndTime.Value.ToString("yyyy-MM-dd") + " 23:59:59"; + string strCarID = rtbPartID.Text.Trim(); + DataTable dtFPY = new DataTable(); + dtFPY = tmdal.SelectTMeasureResultByTime(strCarID, strStartTime, strEndTime); + if (dtFPY.Rows.Count > 0) + { + dgvFPYResult.Visible = true; + labSearchResult.Visible = false; + rbtnExportCSVReport.Visible = true; + chartFPYLine.Visible = true; + dgvFPYResult.DataSource = dtFPY; + SetdgvRowBgColor(dgvFPYResult); + for (int i = 0; i < dgvFPYResult.Rows.Count; i++) + { + if (dgvFPYResult.Rows[i].Cells["SMResult"].Value.ToString().ToLower().Contains("不合格")) + { + dgvFPYResult.Rows[i].Cells["SMResult"].Style.ForeColor = Color.Red; + } + } + + #region 合格率折线图 + + //合格率折线图 + string[] strXDate = new string[dtFPY.Rows.Count]; + double[] dFPYResult = new double[dtFPY.Rows.Count]; + for (int i = 0; i < dtFPY.Rows.Count; i++) + { + strXDate[i] = dtFPY.Rows[i]["CarID"].ToString(); + } + for (int i = 0; i < dtFPY.Rows.Count; i++) + { + double dResult = double.Parse(dtFPY.Rows[i]["FPY"].ToString()); + dFPYResult[i] = dResult * 100.00; + } + chartFPYLine.ChartAreas[0].AxisX.LabelStyle.Angle = -50; //X轴标签倾斜角度设置 + chartFPYLine.ChartAreas[0].AxisY.LabelStyle.Format = "{0:F2}" + "%"; //设置Y轴值的格式化 带% + chartFPYLine.Series[0].Label = "#VAL%"; //设置显示Y的值 + chartFPYLine.Series[0].LabelForeColor = Color.White; + chartFPYLine.Series[0].ToolTip = "车身编号 : #VALX \r\n合格率 : #VAL%"; //鼠标移动到对应点显示数值 + chartFPYLine.Series[0].Points.DataBindXY(strXDate, dFPYResult); + + #endregion 合格率折线图 + } + else + { + dgvFPYResult.Visible = false; + labSearchResult.Visible = true; + rbtnExportCSVReport.Visible = false; + chartFPYLine.Visible = false; + } + } + + public static void ExportdgvDataToCsv(DataGridView dataGridView, string filePath) + { + StringBuilder sb = new StringBuilder(); + + // 添加列标题 + foreach (DataGridViewColumn column in dataGridView.Columns) + { + sb.Append(column.HeaderText); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + + // 添加行数据 + foreach (DataGridViewRow row in dataGridView.Rows) + { + foreach (DataGridViewCell cell in row.Cells) + { + sb.Append(cell.Value); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + } + + // 将数据写入CSV文件 + File.WriteAllText(filePath, sb.ToString()); + } + + public static void ExportDataTableDataToCsv(DataTable dt, string filePath) + { + StringBuilder sb = new StringBuilder(); + + // 添加列标题 + foreach (DataColumn column in dt.Columns) + { + sb.Append(column.ColumnName); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + + // 添加行数据 + foreach (DataRow row in dt.Rows) + { + foreach (object item in row.ItemArray) + { + sb.Append(item); + sb.Append(","); + } + sb.Remove(sb.Length - 1, 1); + sb.AppendLine(); + } + + // 将数据写入CSV文件 + File.WriteAllText(filePath, sb.ToString()); + } + + private void rbtnExportCSVReport_Click(object sender, EventArgs e) + { + string strCSVExportPath = ""; + string strExportTime = DateTime.Now.ToString("yyyyMMddHHmmssfff"); + FolderBrowserDialog m_Folder = new FolderBrowserDialog(); + m_Folder.Description = "请选择要导出的CSV文件的路径"; + m_Folder.RootFolder = Environment.SpecialFolder.Desktop; + if (dgvFPYResult.Visible == true && dgvFPYResult.Rows.Count > 0) + { + m_Folder.ShowDialog(); + if (Directory.Exists(m_Folder.SelectedPath)) + { + strCSVExportPath = m_Folder.SelectedPath + "\\合格率" + strExportTime + ".CSV"; + ExportdgvDataToCsv(dgvFPYResult, strCSVExportPath); + } + } + if (dgvSelectMeasureData.Visible == true && dgvSelectMeasureData.Rows.Count > 0) + { + m_Folder.ShowDialog(); + if (Directory.Exists(m_Folder.SelectedPath)) + { + strCSVExportPath = m_Folder.SelectedPath + "\\车身尺寸数据" + strExportTime + ".CSV"; + ExportDataTableDataToCsv(PageTable, strCSVExportPath); + } + } + } + + private void dgvFPYResult_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) + { + e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); + } + + private void dgvSelectMeasureData_RowStateChanged(object sender, DataGridViewRowStateChangedEventArgs e) + { + e.Row.HeaderCell.Value = string.Format("{0}", e.Row.Index + 1); + } + + #endregion Search Data + + #region CP CPK + + private void rbtnSearchCPCPK_Click(object sender, EventArgs e) + { + DataTable dtCPCPK = new DataTable(); + string strMeasureName = rddlMeasurePoint.Text; + string strSizeName = rddlSizeName.Text.Trim().Substring(0, 1); + int iLimitCount = (int)nudMeasureCount.Value; + dtCPCPK = tmdal.SelectMeasureValuebyMeasureNameAndSize(strMeasureName, strSizeName, iLimitCount); + int iSelectRows = dtCPCPK.Rows.Count; + if (iSelectRows < 5) + { + chartCPCPK.Visible = false; + labSearchCPCPKResult.Visible = true; + pnlCPCPK.Visible = false; + } + else + { + double dNormalValue = double.Parse(dtCPCPK.Rows[0]["NormalValue"].ToString()); + double dLowerTolValue = double.Parse(dtCPCPK.Rows[0]["LowerTolVal"].ToString()); + double dUpperTolValue = double.Parse(dtCPCPK.Rows[0]["UpperTolVal"].ToString()); + double dLSL = dNormalValue + dLowerTolValue; + double dUSL = dNormalValue + dUpperTolValue; + + List listMDoubleData = new List(); + List listMStrData = new List(); + listMStrData.Clear(); + listMDoubleData.Clear(); + for (int i = 0; i < iSelectRows; i++) + { + listMDoubleData.Add(double.Parse(dtCPCPK.Rows[i]["MeasureValue"].ToString())); + listMStrData.Add(dtCPCPK.Rows[i]["MeasureValue"].ToString()); + } + + #region 数据赋值 + + labLSL.Text = dLSL.ToString("F2"); + labUSL.Text = dUSL.ToString("F2"); + labTarget.Text = dNormalValue.ToString("F2"); + labSampleSize.Text = iSelectRows.ToString(); + labAverage.Text = CpCpkHelper.GetAverage(listMStrData).ToString("F4"); + labStdDev.Text = CpCpkHelper.GetSigma(listMStrData).ToString("F4"); + List listCpCpk = CpCpkHelper.GetCpList(listMStrData, dUSL, dLSL); + labCp.Text = listCpCpk[0].ToString("F4"); + labCpl.Text = listCpCpk[1].ToString("F4"); + labCpu.Text = listCpCpk[2].ToString("F4"); + labCpk.Text = listCpCpk[3].ToString("F4"); + List listPpPpk = CpCpkHelper.GetPpList(listMStrData, dUSL, dLSL); + labPp.Text = listPpPpk[0].ToString("F4"); + labPpl.Text = listPpPpk[1].ToString("F4"); + labPpu.Text = listPpPpk[2].ToString("F4"); + labPpk.Text = listPpPpk[3].ToString("F4"); + + #endregion 数据赋值 + + #region 画柱状图 + + Dictionary histogramDataDic = new Dictionary(); + histogramDataDic = CpCpkHelper.GetHistogramData(listMDoubleData); + string[] strXValue = new string[histogramDataDic.Count]; + int[] dYValue = new int[histogramDataDic.Count]; + for (int i = 0; i <= histogramDataDic.Count - 1; i++) + { + strXValue[i] = (histogramDataDic.ElementAt(i).Key); + dYValue[i] = int.Parse(histogramDataDic.ElementAt(i).Value); + } + chartCPCPK.Series[0].Label = "#VAL"; //设置显示Y的值 + chartCPCPK.Series[0].LabelForeColor = Color.White; + chartCPCPK.Series[0].ToolTip = "区间范围 : #VALX \r\n数量 : #VAL"; //鼠标移动到对应点显示数值 + chartCPCPK.Series[0].Points.DataBindXY(strXValue, dYValue); + + #endregion 画柱状图 + + chartCPCPK.Visible = true; + labSearchCPCPKResult.Visible = false; + pnlCPCPK.Visible = true; + } + } + + #endregion CP CPK + + #region 软件设置 + + private void lpcSoftwareSetup_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + FSoftwareSetup fss = new FSoftwareSetup(); + fss.ShowDialog(this); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcToleranceSetup_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + FToleranceSetup fts = new FToleranceSetup(); + fts.ShowDialog(this); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcRange_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + FRangeSetup frs = new FRangeSetup(); + frs.ShowDialog(this); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcPLCAddress_Click(object sender, EventArgs e) + { + string strInputPwd = MyBase.InputBox("密码", "请输入密码 : ", "", "确定", "取消"); + if (strInputPwd.Contains("-999.999")) + { + return; + } + else if (strInputPwd == ConfigDfn.strPwd) + { + PlcAddrSetup PLCAS = new PlcAddrSetup(3, ConfigDfn.strConfigFile); + PLCAS.Show(); + } + else + { + MessageBox.Show("密码错误! ", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + } + + private void lpcPLCTest_Click(object sender, EventArgs e) + { + FormDebugSiemensS7 FDS7 = new FormDebugSiemensS7(SiemensPLCS.S1200); + FDS7.Show(); + } + + private void lpcAboutSoftware_Click(object sender, EventArgs e) + { + AboutSoftwareInfo asi = new AboutSoftwareInfo(); + asi.ShowDialog(); + } + + private void lpcShowLog_Click(object sender, EventArgs e) + { + System.Diagnostics.Process.Start("notepad.exe", LogDebugDfn.strDebugFile); + } + + #endregion 软件设置 + + #region RadButton鼠标事件 + + private void btn_MouseHover(object sender, EventArgs e) + { + RadButton btn = sender as RadButton; + btn.BackColor = Color.FromArgb(0, 151, 186); + } + + private void btn_MouseLeave(object sender, EventArgs e) + { + RadButton btn = sender as RadButton; + btn.BackColor = Color.FromArgb(19, 46, 53); + } + + #endregion RadButton鼠标事件 + + #region PLC相关函数 + + #region PLC重连操作 + + private void tmrReadPLCData_Tick(object sender, EventArgs e) + { + tmrReadPLCData.Stop(); + + #region 判断PLC是否正常运行 + + if (ConfigPlc.PlcType == 3 && ConfigPlc.bReConnect && !HslSiemensS7Obj.bConnected) + { + MyBase.TraceWriteLine("PLC断开,重连!"); + tmrHeartBeatConnect.Stop(); + ReConnectPLC(); + return; + } + + byte[] m_Datas = null; + if (!HslSiemensS7Obj.ReadDatas(PlcAddrSetup.S7ReadStartAddr, (ushort)PlcAddrSetup.S7ReadByteCount, ref m_Datas)) + { + tmrReadPLCData.Start(); + return; + } + if (m_Datas == null) + { + tmrReadPLCData.Start(); + MyBase.TraceWriteLine("PLC读取数据对象为空,退出!"); + return; + } + + #endregion 判断PLC是否正常运行 + + try + { + #region 循环读取PLC数据块中的信息 + + if (m_Datas.Length >= PlcAddrSetup.S7ReadByteCount) + { + PLCDfn.bPlcLiveTick = PlcObject.GetS7ByteData(PlcSignalDfn.PlcLive) == 1; + PLCDfn.ReadVINFinishFlag = PlcObject.GetS7ByteData(PlcSignalDfn.ReadVINFinishFlag); + //从PLC获取VIN码后,通过访问IOT接口 获取汽车类型,再反馈给PLC + if (iLastReadVINFinishFlag == 0 && PLCDfn.ReadVINFinishFlag == 10) + { + string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); + //PLCDfn.CarType = PlcObject.GetS7ByteData(PlcSignalDfn.CarType); + MyBase.TraceWriteLine("PLC读码完成信号:0->10;Read PLC VIN is: " + strCarID); + if (strCarID.Length > 10) + { + string strCarColor = ""; + string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); + if (!strCarType.ToUpper().Contains("ERR")) + { + if (strCarType.ToUpper().Contains("EH3")) + { + PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)1); + } + else + { + PlcObject.InsertWriteQueue(PlcSignalDfn.WCarType, (byte)2); + } + PlcObject.InsertWriteQueue(PlcSignalDfn.WCarColor, strCarColor); + MyBase.TraceWriteLine("往PLC写入车型: " + strCarType + " ;车身颜色:" + strCarColor); + tmdal.InsertVIN(strCarID); + MyBase.TraceWriteLine(strCarID + " 插入到数据库表TTempSaveVIN中完成。"); + } + else + { + MyBase.TraceWriteLine("报错:根据VIN从IOT上获取车型信息失败,不发送给PLC车型信息和颜色信息。 "); + } + } + } + PLCDfn.CarPassFlag = PlcObject.GetS7ByteData(PlcSignalDfn.CarPassFlag); + if (iLastCarPassFlag == 0 && PLCDfn.CarPassFlag == 10) + { + string strCarID = PlcObject.GetS7StringData(PlcSignalDfn.PartID); + MyBase.TraceWriteLine("读取PLC CarPassFlag 完成信号:0->10;Read PLC VIN is: " + strCarID); + string strSecondPosCarID = tmdal.SelectMaintenanceStationVINbyStationNo(2); + if (strSecondPosCarID.Length == 21) + { + string strTempCarID = strSecondPosCarID.Substring(0, 17); + string strTempCarType = strSecondPosCarID.Substring(18, 3); + if (tmdal.CheckMRVINExistOrNotByVIN(strTempCarID) == 0) + { + string strTargetRate = Math.Round(ConfigDfn.dFPY2 * 100.00d, 2).ToString("F2") + "%"; + + MyBase.TraceWriteLine(strSecondPosCarID + " ;该VIN码只扫码没有测量,没有测量结果,上传IOT NG消息。"); + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"" + strTempCarID + "\",\"model\":\"" + strTempCarType + "\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"NG\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"targetRate\":\"" + strTargetRate + "\",\"rate\":\"0.00%\",\"GapList\":[]}]}"; + MyBase.TraceWriteLine("Update NG To IOT Data Content: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); + MyBase.TraceWriteLine("NG数据上传IOT完成,结果返回为:" + strPostResult); + } + } + + if (!string.IsNullOrEmpty(strCarID) && strCarID.Length > 10) + { + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); + Thread.Sleep(20); + string strCarColor = ""; + string strCarType = GetCarTypeByIOTAPI(strCarID, out strCarColor); + if (!strCarType.ToUpper().Contains("ERR")) + { + if (strCarType.ToUpper().Contains("EH3")) + { + strCarID = strCarID + "_EH3"; + } + else + { + strCarID = strCarID + "_EHY"; + } + } + tmdal.updateMaintenceInfo(strCarID, 1); + MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为: " + strCarID); + } + else + { + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(6), 7); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(5), 6); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(4), 5); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(3), 4); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(2), 3); + Thread.Sleep(20); + tmdal.updateMaintenceInfo(tmdal.SelectMaintenanceStationVINbyStationNo(1), 2); + Thread.Sleep(20); + tmdal.updateMaintenceInfo("empty", 1); + MyBase.TraceWriteLine("CarPassFlag 0->10 更新到MaintenceInfo数据库位置1中的VIN为:empty "); + } + } + if (ConfigDfn.iRecordEncoderFlag == 1) + { + double dSpeed1 = PlcObject.GetS7Double(PlcSignalDfn.Speed1); + double dSpeed2 = PlcObject.GetS7Double(PlcSignalDfn.Speed2); + double dR01 = PlcObject.GetS7Double(PlcSignalDfn.R01_Pules); + double dR02 = PlcObject.GetS7Double(PlcSignalDfn.R02_Pules); + NLogger.Fatal(dSpeed1 + "," + dSpeed2 + "," + dR01 + "," + dR02); + } + } + iLastCarPassFlag = PLCDfn.CarPassFlag; + iLastReadVINFinishFlag = PLCDfn.ReadVINFinishFlag; + #endregion 循环读取PLC数据块中的信息 + } + catch (Exception ex) + { + MyBase.TraceWriteLine("tmrReadPLCData_Tick exception: " + ex.ToString()); + } + + tmrReadPLCData.Start(); + } + + private void tmrRefreshPLCStatus_Tick(object sender, EventArgs e) + { + if (labelTimeStatus_Tip.Text == "─") { labelTimeStatus_Tip.Text = "╲"; } + else if (labelTimeStatus_Tip.Text == "╲") { labelTimeStatus_Tip.Text = "│"; } + else if (labelTimeStatus_Tip.Text == "│") { labelTimeStatus_Tip.Text = "╱"; } + else if (labelTimeStatus_Tip.Text == "╱") { labelTimeStatus_Tip.Text = "─"; } + + lampPLCHeart.State = PLCDfn.bPlcLiveTick ? LampColor.Green : LampColor.Silver; + rlePLCHeart.ForeColor = PLCDfn.bPlcLiveTick ? Color.Lime : Color.White; + } + + private void tmrHeartBeatConnect_Tick(object sender, EventArgs e) + { + if (bPlcLiveTickLast != PLCDfn.bPlcLiveTick) + { + HeartBeatCount = 0; + } + else + { + HeartBeatCount++; + } + + if (HeartBeatCount >= 600) + { + HeartBeatCount = 0; + if (!bStopPlcNormal) + { + MyBase.TraceWriteLine("PLC心跳检测10分钟内未变化,断开PLC,进行PLC重连!"); + PlcObject.ClosePlc(); + } + } + bPlcLiveTickLast = PLCDfn.bPlcLiveTick; + } + + private void tmrWritePLCLive_Tick(object sender, EventArgs e) + { + bTickt = !bTickt; + PlcObject.InsertWriteQueue(PlcSignalDfn.SoftLive, Convert.ToByte(bTickt ? 1 : 0)); + } + + private void ReConnectPLC() + { + m_ThreadReconnectPLC = null; + m_ThreadReconnectPLC = new Thread(new ThreadStart(ReConnectPlcProcess)); + if (!m_ThreadReconnectPLC.IsAlive) + { + m_ThreadReconnectPLC.Start(); + } + } + + private void ReConnectPlcProcess() + { + while (!PlcObject.IsPlcConnected()) + { + bool bConnectResult = PlcObject.ConnectPlc(); + if (!bConnectResult) + { + m_ReConnectNum++; + MyBase.TraceWriteLine("重连PLC,第" + m_ReConnectNum + "次!"); + } + Thread.Sleep(1000); + } + MyBase.TraceWriteLine("重新连接PLC成功!"); + lampConnectPLCStatus.State = LampColor.Green; + rlePLCStatus.ForeColor = Color.Lime; + this.BeginInvoke((EventHandler)delegate + { + tmrHeartBeatConnect.Start(); + }); + bStopPlcNormal = false; + m_ReConnectNum = 0; + this.Invoke((EventHandler)(delegate + { + tmrReadPLCData.Start(); + tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 + tmrRefreshPLCStatus.Start();//刷新PLC等的状态 + })); + m_ThreadReconnectPLC.Abort(); + } + + #endregion PLC重连操作 + + private void ConnectThread() + { + MyBase.TraceWriteLine("连接PLC...."); + + bool bConnectResult = PlcObject.ConnectPlc(); + this.Invoke((EventHandler)(delegate + { + if (bConnectResult) + { + lampConnectPLCStatus.State = LampColor.Green; + rlePLCStatus.ForeColor = Color.Lime; + MyBase.TraceWriteLine("连接PLC成功"); + } + else + { + lampConnectPLCStatus.State = LampColor.Red; + rlePLCStatus.ForeColor = Color.Red; + tmrReadPLCData.Stop(); + MyBase.TraceWriteLine("连接PLC失败"); + return; + } + + tmrReadPLCData.Start(); //读取PLC数据信息 + tmrWritePLCLive.Start();//启动给PLC写入心跳 1s写一次 0 1 + tmrRefreshPLCStatus.Start();//刷新PLC等的状态 + if (ConfigPlc.bReConnect) + tmrHeartBeatConnect.Start(); //监测来自plc的心跳5分钟内没有变化,重新连接PLC + })); + } + + private void btnConnectPlc_Click(object sender, EventArgs e) + { + try + { + PlcObject.InitWritePlcThread(); + bStopPlcNormal = false; + Thread m_Thread = new Thread(ConnectThread); + m_Thread.Start(); + return; + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + private void btnClosePlc_Click(object sender, EventArgs e) + { + try + { + MyBase.TraceWriteLine("点击了断开PLC按钮,断开PLC!"); + tmrReadPLCData.Stop(); + tmrHeartBeatConnect.Stop(); + tmrWritePLCLive.Stop(); + tmrRefreshPLCStatus.Stop(); + lampConnectPLCStatus.State = LampColor.White; + rlePLCStatus.ForeColor = Color.White; + rlePLCHeart.ForeColor = Color.White; + lampPLCHeart.State = LampColor.White; + bStopPlcNormal = true; + PlcObject.ClosePlc(); + } + catch (Exception ex) + { + MessageBox.Show(ex.Message, "警告", MessageBoxButtons.OK, MessageBoxIcon.Warning); + } + } + + #endregion PLC相关函数 + + private void lpcUploadIOTTest_Click(object sender, EventArgs e) + { + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"requestData\":[{\"vin\":\"test001\",\"model\":\"EHY\",\"equipmentNo\":\"" + ConfigDfn.strEquipNo + "\",\"equipmentName\":\"" + ConfigDfn.strEquipName + "\",\"calibrationResult\":\"OK\",\"detectionTime\":\"" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + "\",\"GapList\":[{\"vin\":\"test001\",\"gfNo\":\"F\",\"pointNumber\":\"L-01\",\"actualValue\":\"-0.30\",\"controlLine\":\"-1.00/1.00\",\"measurementResult\":\"OK\"}]}]}"; + MyBase.TraceWriteLine("Test Post Data: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTAddress, strPostData, 10000); + MessageBox.Show("测试上传数据完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + MyBase.TraceWriteLine("测试上传数据完成,获取到的返回值为: " + strPostResult); + } + + private void lpcTestGetCarTye_Click(object sender, EventArgs e) + { + string strPostData = "{\"serno\":\"312314141\",\"vin\":\"LNNAJDDU9RDA00213\"}"; + MyBase.TraceWriteLine("Test Post Data: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 10000); + MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strPostResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + MyBase.TraceWriteLine("测试从IOT获取车型信息完成,获取到的原返回值为: " + strPostResult); + string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); + MessageBox.Show("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + MyBase.TraceWriteLine("测试从IOT获取车型信息完成,处理后 获取到的返回值为: " + strNewResult); + CheryCarTypeInfo ccti = new CheryCarTypeInfo(); + ccti = JsonConvert.DeserializeObject(strNewResult); + MessageBox.Show("测试从IOT获取车型信息完成,获取到的返回值为: " + strNewResult + "; 解析出的车型:" + ccti.data.model + " ;解析出的物料号为" + ccti.data.material + " ;解析出颜色编号:" + ccti.data.material.Substring(7, 2), "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); + } + + private string GetCarTypeByIOTAPI(string strVIN, out string strMaterialNo) + { + string strPostData = "{\"serno\":\"" + DateTime.Now.ToString("yyyyMMddHHmmssfff") + "\",\"vin\":\"" + strVIN + "\"}"; + MyBase.TraceWriteLine(" Post VIN Data: " + strPostData); + string strPostResult = PostJsonToIOT(ConfigDfn.strIOTCarTypeAddress, strPostData, 5000); + MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return CarType Infomation : " + strPostResult); + string strNewResult = strPostResult.Substring(1, strPostResult.Length - 2).Replace("]", ""); + MyBase.TraceWriteLine("GetCarTypeByIOTAPI IOT Return New CarType Infomation : " + strNewResult); + CheryCarTypeInfo ccti = new CheryCarTypeInfo(); + ccti = JsonConvert.DeserializeObject(strNewResult); + if (ccti.message.Contains("成功")) + { + if (ccti.data.material != null && ccti.data.material.Length > 9) + { + strMaterialNo = ccti.data.material.Substring(7, 2); + MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + "解析出车颜色编号:" + strMaterialNo); + } + else + { + strMaterialNo = "TE"; + MyBase.TraceWriteLine(" IOT Return CarType Infomation : " + strNewResult + "; 解析出的车型:" + ccti.data.model + ";未解析出车颜色编号"); + } + return ccti.data.model; + } + else + { + MyBase.TraceWriteLine(" IOT Return CarType Infomation ERROR : " + strPostResult); + strMaterialNo = "ER"; + return "ERR"; + } + } + + private void lpcShowCarData_Click(object sender, EventArgs e) + { + if (ConfigDfn.strShowCarLR == "L") + { + if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) + { + fLEH3.Show(); + fLEHY.Show(); + fLEHY.Hide(); + } + else + { + fLEH3.Show(); + fLEH3.Hide(); + fLEHY.Show(); + } + } + else + { + if (ConfigDfn.strCarModel.ToUpper().Contains("EH3")) + { + fREH3.Show(); + fREHY.Show(); + fREHY.Hide(); + } + else + { + fREH3.Show(); + fREH3.Hide(); + fREHY.Show(); + } + } + } + + public void ShowCarMeasureDataByCarType(int iCarType) + { + if (ConfigDfn.strShowCarLR == "L") + { + if (iCarType == 1) + { + fLEH3.Show(); + fLEHY.Show(); + fLEHY.Hide(); + MyBase.TraceWriteLine("显示左侧EH3车身数据界面。"); + } + else + { + fLEH3.Show(); + fLEH3.Hide(); + fLEHY.Show(); + MyBase.TraceWriteLine("显示左侧EHY车身数据界面。"); + } + } + else + { + if (iCarType == 1) + { + fREH3.Show(); + fREHY.Show(); + fREHY.Hide(); + MyBase.TraceWriteLine("显示右侧EH3车身数据界面。"); + } + else + { + fREH3.Show(); + fREH3.Hide(); + fREHY.Show(); + MyBase.TraceWriteLine("显示右侧EHY车身数据界面。"); + } + } + } + + private void rbtnTestCOM_Click(object sender, EventArgs e) + { + if (rbtnTestCOM.Text == "打开串口") + { + serialTestPort = new SerialPort(rtbPort.Text.Trim(), 115200, Parity.None, 8, StopBits.One); // 设置串口参数 + serialTestPort.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler); // 注册数据接收事件处理方法 + serialTestPort.Open(); // 打开串口 + if (serialTestPort.IsOpen) + { + rbtnTestCOM.Text = "关闭串口"; + } + } + else + { + serialTestPort.DataReceived -= new SerialDataReceivedEventHandler(DataReceivedHandler); + serialTestPort.Close(); + serialTestPort.Dispose(); + rbtnTestCOM.Text = "打开串口"; + } + } + + private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e) + { + SerialPort sp = (SerialPort)sender; + string indata = sp.ReadExisting(); + MyBase.TraceWriteLine(indata); + rtbCOMContent.Text = indata; + } + + private void tmrMonitorDBToCreateReport_Tick(object sender, EventArgs e) + { + tmrMonitorDBToCreateReport.Stop(); + int iCurrentMeasureCount = tmdal.SelectTMeasureResultCount(); + if (iCurrentMeasureCount > iLastMesureCount && (iCurrentMeasureCount == (iLastMesureCount + 1))) + { + MyBase.TraceWriteLine("监控数据库,开始生成ipn文件:"); + DataTable dtMeaResult = tmdal.SelectNewestTMeasureResult(); + string strVIN = dtMeaResult.Rows[0]["CarID"].ToString(); + DateTime dateMeaDate = Convert.ToDateTime(dtMeaResult.Rows[0]["Remark"].ToString()); + DataTable dtMeaContent = tmdal.SelectTMeasureDataByVIN(strVIN); + string strCarType = dtMeaContent.Rows[0][2].ToString(); + int iMeaCount = dtMeaContent.Rows.Count; + + #region 解析完报告后,重新生成客户模板报告 + + string filePath = ""; + if (strCarType.ToLower().Contains("tava")) + { + filePath = ConfigDfn.strReportPath + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; + } + else + { + filePath = ConfigDfn.strReportPath2 + "\\" + strCarType + "_" + strVIN + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".ipn"; + } + + StringBuilder sb = new StringBuilder(); + + #region 添加表头 + + sb.Append("GAUGE ID"); + sb.Append("\t"); + sb.Append("JSN"); + sb.Append("\t"); + sb.Append("MO"); + sb.Append("\t"); + sb.Append("DAY"); + sb.Append("\t"); + sb.Append("YR"); + sb.Append("\t"); + sb.Append("HR"); + sb.Append("\t"); + sb.Append("MIN"); + sb.Append("\t"); + sb.Append("SEC"); + sb.Append("\t"); + sb.Append("MODEL"); + sb.Append("\t"); + sb.Append("AuxID1"); + sb.Append("\t"); + sb.Append("AuxID2"); + sb.Append("\t"); + sb.Append("QUAL"); + sb.Append("\t"); + sb.Append("SHIFT"); + sb.Append("\t"); + sb.Append("DATA TYPE"); + sb.Append("\t"); + sb.Append("FIXTURE"); + sb.Append("\t"); + for (int i = 0; i < iMeaCount / 2; i++) + { + string strMeaPointName = dtMeaContent.Rows[i * 2]["MeasPointName"].ToString(); + string strMPF = strMeaPointName + " Flush"; + string strMPG = strMeaPointName + " Gap"; + sb.Append("D " + strMPF); + sb.Append("\t"); + sb.Append("D " + strMPG); + sb.Append("\t"); + + sb.Append("B " + strMPF); + sb.Append("\t"); + sb.Append("B " + strMPG); + sb.Append("\t"); + + sb.Append("A " + strMPF); + sb.Append("\t"); + sb.Append("A " + strMPG); + sb.Append("\t"); + + sb.Append("US " + strMPF); + sb.Append("\t"); + sb.Append("LS " + strMPF); + sb.Append("\t"); + sb.Append("US " + strMPG); + sb.Append("\t"); + sb.Append("LS " + strMPG); + sb.Append("\t"); + + sb.Append("UR " + strMPF); + sb.Append("\t"); + sb.Append("LR " + strMPF); + sb.Append("\t"); + sb.Append("UR " + strMPG); + sb.Append("\t"); + sb.Append("LR " + strMPG); + sb.Append("\t"); + + sb.Append("UT " + strMPF); + sb.Append("\t"); + sb.Append("LT " + strMPF); + sb.Append("\t"); + sb.Append("UT " + strMPG); + sb.Append("\t"); + sb.Append("LT " + strMPG); + sb.Append("\t"); + } + + #endregion 添加表头 + + sb.AppendLine(); + + #region 添加内容 + + sb.Append(ConfigDfn.strStationName); + sb.Append("\t"); + sb.Append(strVIN); + sb.Append("\t"); + sb.Append(dateMeaDate.Month.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Day.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Year.ToString().Substring(2)); + sb.Append("\t"); + sb.Append(dateMeaDate.Hour.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Minute.ToString()); + sb.Append("\t"); + sb.Append(dateMeaDate.Second.ToString()); + sb.Append("\t"); + if (strCarType.ToLower().Contains("tava")) + sb.Append(ConfigDfn.strUploadPath); + else + { + sb.Append(ConfigDfn.strUploadPath2); + } + sb.Append("\t"); + sb.Append("Unknow"); + sb.Append("\t"); + sb.Append("Unknow"); + sb.Append("\t"); + sb.Append("2"); + sb.Append("\t"); + sb.Append(""); + sb.Append("\t"); + sb.Append("AUTO"); + sb.Append("\t"); + sb.Append("NONE"); + sb.Append("\t"); + + double dDevFVal = 0; + double dDevGVal = 0; + + double dMeaFVal = 0; + double dMeaGVal = 0; + + double dNorFVal = 0; + double dNorGVal = 0; + + double dFUpper = 0; + double dFLower = 0; + double dGUpper = 0; + double dGLower = 0; + + double dFUpper2 = 0; + double dFLower2 = 0; + double dGUpper2 = 0; + double dGLower2 = 0; + + double dFUpper3 = 0; + double dFLower3 = 0; + double dGUpper3 = 0; + double dGLower3 = 0; + for (int i = 0; i < iMeaCount / 2; i++) + { + string strMeasureFValue = dtMeaContent.Rows[i * 2]["MeasureValue"].ToString(); + string strMeasureGValue = dtMeaContent.Rows[i * 2 + 1]["MeasureValue"].ToString(); + string strNormalFValue = dtMeaContent.Rows[i * 2]["NormalValue"].ToString(); + string strNormalGValue = dtMeaContent.Rows[i * 2 + 1]["NormalValue"].ToString(); + + dNorFVal = double.Parse(strNormalFValue); + dNorGVal = double.Parse(strNormalGValue); + dFUpper = double.Parse(dtMeaContent.Rows[i * 2]["UpperTolVal"].ToString()); + dFLower = double.Parse(dtMeaContent.Rows[i * 2]["LowerTolVal"].ToString()); + dGUpper = double.Parse(dtMeaContent.Rows[i * 2 + 1]["UpperTolVal"].ToString()); + dGLower = double.Parse(dtMeaContent.Rows[i * 2 + 1]["LowerTolVal"].ToString()); + + dFUpper2 = dFUpper * ConfigDfn.dLevel2; + dFLower2 = dFLower * ConfigDfn.dLevel2; + dGUpper2 = dGUpper * ConfigDfn.dLevel2; + dGLower2 = dGLower * ConfigDfn.dLevel2; + + dFUpper3 = dFUpper * ConfigDfn.dLevel3; + dFLower3 = dFLower * ConfigDfn.dLevel3; + dGUpper3 = dGUpper * ConfigDfn.dLevel3; + dGLower3 = dGLower * ConfigDfn.dLevel3; + + if (strMeasureFValue.Contains("inv")) + { + sb.Append("inv"); + sb.Append("\t"); + } + else + { + dMeaFVal = double.Parse(strMeasureFValue); + dDevFVal = dMeaFVal - dNorFVal; + sb.Append(dDevFVal.ToString("F3")); + sb.Append("\t"); + } + if (strMeasureGValue.Contains("inv")) + { + sb.Append("inv"); + sb.Append("\t"); + } + else + { + dMeaGVal = double.Parse(strMeasureGValue); + dDevGVal = dMeaGVal - dNorGVal; + sb.Append(dDevGVal.ToString("F3")); + sb.Append("\t"); + } + + sb.Append(strNormalFValue); + sb.Append("\t"); + sb.Append(strNormalGValue); + sb.Append("\t"); + + sb.Append(strMeasureFValue); + sb.Append("\t"); + sb.Append(strMeasureGValue); + sb.Append("\t"); + + sb.Append(dFUpper.ToString("F3")); + sb.Append("\t"); + sb.Append(dFLower.ToString("F3")); + sb.Append("\t"); + sb.Append(dGUpper.ToString("F3")); + sb.Append("\t"); + sb.Append(dGLower.ToString("F3")); + sb.Append("\t"); + + sb.Append(dFUpper2.ToString("F3")); + sb.Append("\t"); + sb.Append(dFLower2.ToString("F3")); + sb.Append("\t"); + sb.Append(dGUpper2.ToString("F3")); + sb.Append("\t"); + sb.Append(dGLower2.ToString("F3")); + sb.Append("\t"); + + sb.Append(dFUpper3.ToString("F3")); + sb.Append("\t"); + sb.Append(dFLower3.ToString("F3")); + sb.Append("\t"); + sb.Append(dGUpper3.ToString("F3")); + sb.Append("\t"); + sb.Append(dGLower3.ToString("F3")); + sb.Append("\t"); + } + + #endregion 添加内容 + + // 将数据写入CSV文件 + File.WriteAllText(filePath, sb.ToString()); + MyBase.TraceWriteLine("客户定制ipn报告生成完毕,路径为:" + filePath); + + #endregion 解析完报告后,重新生成客户模板报告 + } + iLastMesureCount = iCurrentMeasureCount; + tmrMonitorDBToCreateReport.Start(); + } + + private void CenterControl_Shown(object sender, EventArgs e) + { + rddlSizeName.SelectedIndex = 0; + DataTable dtMPName = tmdal.SelectAllMeasPointName(); + if (dtMPName.Rows.Count > 0) + { + for (int i = 0; i < dtMPName.Rows.Count; i++) + { + rddlMeasurePoint.Items.Add(dtMPName.Rows[i][0].ToString()); + } + rddlMeasurePoint.SelectedIndex = 0; + } + } + + public static void AppendRecord(string id, string filePath) + { + try + { + // 如果文件不存在则创建并写入标题行 + if (!File.Exists(filePath)) + { + File.WriteAllText(filePath, "ID,RecordTime\n"); + } + + // 追加新记录(ID + 当前时间戳) + string record = $"{id},{DateTime.Now:yyyy-MM-dd HH:mm:ss.fff}\n"; + File.AppendAllText(filePath, record); + } + catch (Exception ex) + { + Console.WriteLine($"写入CSV失败: {ex.Message}"); + } + } + } + + public class CheryIOTData + { + /// + /// VIN号 + /// + public string vin { get; set; } + + /// + /// FG + /// + public string gfNo { get; set; } + + /// + /// 测点编号 + /// + public string pointNumber { get; set; } + + /// + /// 实测值 + /// + public string actualValue { get; set; } + + /// + /// 控制线 + /// + public string controlLine { get; set; } + + /// + /// 测量结果 + /// + public string measurementResult { get; set; } + } + + public class CarInfoData + { + public string material { get; set; } + public string model { get; set; } + } + + public class CheryCarTypeInfo + { + /// + /// data + /// + public CarInfoData data { get; set; } + + /// + /// message + /// + public string message { get; set; } + + /// + /// serno + /// + public string serno { get; set; } + + /// + /// success + /// + public string success { get; set; } + } + + public static class JsonHelper + { + /// + /// 对象转成JSON 格式字符串 + /// + /// 对象 + /// JSON格式的字符串 + public static string ObjectToJson(object obj) + { + return JsonConvert.SerializeObject(obj); + } + + /// + /// 解析JSON字符串生成对象实体 + /// + /// 对象类型 + /// json字符串 + /// 对象实体 + public static T DeserializeJsonToObject(string json) where T : class + { + Newtonsoft.Json.JsonSerializer serializer = new Newtonsoft.Json.JsonSerializer(); + StringReader sr = new StringReader(json); + object o = serializer.Deserialize(new JsonTextReader(sr), typeof(T)); + T t = o as T; + return t; + } + + /// + /// 解析JSON数组生成对象实体集合 + /// + /// 对象类型 + /// json数组字符串(eg.[{"ID":"112","Name":"石子儿"}]) + /// 对象实体集合 + public static List DeserializeJsonToList(string json) where T : class + { + Newtonsoft.Json.JsonSerializer serializer = new JsonSerializer(); + StringReader sr = new StringReader(json); + object o = serializer.Deserialize(new JsonTextReader(sr), typeof(List)); + List list = o as List; + return list; + } + + /// + /// 数据表转键值对集合 把DataTable转成 List集合, 存每一行 集合中放的是键值对字典,存每一列 + /// + /// 数据表 + /// 哈希表数组 + public static List> DataTableToList(DataTable dt) + { + List> list = new List>(); + + foreach (DataRow dr in dt.Rows) + { + Dictionary dic = new Dictionary(); + foreach (DataColumn dc in dt.Columns) + { + dic.Add(dc.ColumnName, dr[dc.ColumnName]); + } + list.Add(dic); + } + return list; + } + + /// + /// 数据集转键值对数组字典 + /// + /// 键值对数组字典 + public static Dictionary>> DataSetToDic(DataSet ds) + { + Dictionary>> result = new Dictionary>>(); + + foreach (DataTable dt in ds.Tables) + result.Add(dt.TableName, DataTableToList(dt)); + + return result; + } + + /// + /// 数据表转JSON + /// + /// 数据表 + /// JSON字符串 + public static string DataTableToJson(DataTable dt) + { + return ObjectToJson(DataTableToList(dt)); + } + + /// + /// JSON文本转对象,泛型方法 常用 + /// + /// 类型 + /// JSON文本 + /// 指定类型的对象 + public static T JsonToObject(string jsonText) + { + return JsonConvert.DeserializeObject(jsonText); + } + + /// + /// 将JSON文本转换为数据表数据 + /// + /// JSON文本 + /// 数据表字典 + public static Dictionary>> TablesDataFromJson(string jsonText) + { + return JsonToObject>>>(jsonText); + } + + /// + /// 将JSON文本转换成数据行 + /// + /// JSON文本 + /// 数据行的字典 + public static Dictionary DataRowFromJson(string jsonText) + { + return JsonToObject>(jsonText); + } + } } \ No newline at end of file diff --git a/Analysis/CenterControl.designer.cs b/Analysis/CenterControl.designer.cs index 926e503..ba683a4 100644 --- a/Analysis/CenterControl.designer.cs +++ b/Analysis/CenterControl.designer.cs @@ -582,7 +582,7 @@ this.RPV.ItemSizeMode = ((Telerik.WinControls.UI.PageViewItemSizeMode)((Telerik.WinControls.UI.PageViewItemSizeMode.EqualWidth | Telerik.WinControls.UI.PageViewItemSizeMode.EqualHeight))); this.RPV.Location = new System.Drawing.Point(1, 42); this.RPV.Name = "RPV"; - this.RPV.SelectedPage = this.rpvpSetup; + this.RPV.SelectedPage = this.rpvpAnalysis; this.RPV.Size = new System.Drawing.Size(1918, 1008); this.RPV.TabIndex = 127; this.RPV.ViewMode = Telerik.WinControls.UI.PageViewMode.NavigationView; @@ -665,7 +665,7 @@ ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).BackColor3 = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(135)))), ((int)(((byte)(161))))); ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).BackColor4 = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(135)))), ((int)(((byte)(161))))); ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).HorizontalLineColor = System.Drawing.Color.FromArgb(((int)(((byte)(19)))), ((int)(((byte)(46)))), ((int)(((byte)(53))))); - ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).Text = " 软件设置"; + ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).Text = " 分析主界面"; ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).FocusBorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(45)))), ((int)(((byte)(135)))), ((int)(((byte)(161))))); ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).ForeColor = System.Drawing.Color.White; ((Telerik.WinControls.UI.NavigationViewHeaderElement)(this.RPV.GetChildAt(0).GetChildAt(2))).BackColor = System.Drawing.Color.FromArgb(((int)(((byte)(27)))), ((int)(((byte)(60)))), ((int)(((byte)(68))))); @@ -3301,6 +3301,7 @@ this.Text = "海克斯康间隙面差分析系统"; this.FormClosed += new System.Windows.Forms.FormClosedEventHandler(this.CenterControl_FormClosed); this.Load += new System.EventHandler(this.CenterControl_Load); + this.Shown += new System.EventHandler(this.CenterControl_Shown); ((System.ComponentModel.ISupportInitialize)(this.radTitleBar1)).EndInit(); this.radTitleBar1.ResumeLayout(false); this.radTitleBar1.PerformLayout(); diff --git a/Analysis/Program.cs b/Analysis/Program.cs index 60be98a..2bd635e 100644 --- a/Analysis/Program.cs +++ b/Analysis/Program.cs @@ -91,7 +91,7 @@ namespace NSAnalysis gAuthorizationMode = FileIni.ReadInt(ConfigDfn.strConfigFile, "Chery", "AuthorizationMode", 1); #endregion 创建Log文件 - //Application.Run(new CenterControl()); + if (gAuthorizationMode == 1) { MyBase.TraceWriteLine("Log in using the CLMS authorization."); diff --git a/Analysis/bin/x64/Debug/DAL.dll b/Analysis/bin/x64/Debug/DAL.dll index afd633c0b353984aac001c1514cc6d1e45033530..95759f194517e9504709e4759be1b3edccffb910 100644 GIT binary patch delta 8539 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 delta 8354 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 Gr~d=D+j-&u delta 6799 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开始 -2025-08-28 00:01:33.206--数据库连接 SqlServerName:127.0.0.1 -2025-08-28 00:01:33.207--数据库连接 SqlUserName:sa -2025-08-28 00:01:33.207--数据库连接 SqlPassword:Hexagon123 -2025-08-28 00:01:33.207--数据库连接 SqlDbName:NextSenseStandardDB -2025-08-28 00:01:33.210--加载配置文件——>完成 -2025-08-28 00:01:34.614--数据库连接 SqlServerName:127.0.0.1 -2025-08-28 00:01:34.615--数据库连接 SqlUserName:sa -2025-08-28 00:01:34.616--数据库连接 SqlPassword:Hexagon123 -2025-08-28 00:01:34.617--数据库连接 SqlDbName:NextSenseStandardDB -2025-08-28 00:01:34.618--数据库连接字符串:Data Source=127.0.0.1;initial Catalog=NextSenseStandardDB;User ID=sa;password=Hexagon123; -2025-08-28 00:01:35.112-- 进入显示车身模式!显示车身界面。 -2025-08-28 00:01:35.624--启动PLC写线程! -2025-08-28 00:01:35.627-- 进入解析CSV文件模式,开始解析扫码CSV文件! -2025-08-28 00:01:35.650--连接PLC.... -2025-08-28 00:01:35.652--软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEH3 -2025-08-28 00:01:35.653--软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEHY -2025-08-28 00:01:37.708--PLC S7连接失败。 -2025-08-28 00:01:40.645--连接PLC失败 -2025-08-28 00:01:41.053--Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 -2025-08-28 00:01:41.063--Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 -2025-08-28 00:01:50.246--显示右侧EHY车身数据界面。 -2025-08-28 00:02:31.399---------------海克斯康面隙分析软件程序关闭--------------------- +2025-08-29 22:53:21.911----软件Program Main函数开始执行-- +2025-08-29 22:53:22.122--加载配置文件——>开始 +2025-08-29 22:53:22.436--数据库连接 SqlServerName:127.0.0.1 +2025-08-29 22:53:22.545--数据库连接 SqlUserName:sa +2025-08-29 22:53:22.573--数据库连接 SqlPassword:Hexagon123 +2025-08-29 22:53:22.576--数据库连接 SqlDbName:NextSenseStandardDB +2025-08-29 22:53:22.625--加载配置文件——>完成 +2025-08-29 22:53:22.666--Log in using the original authorization mode. +2025-08-29 22:53:24.548--软件授权成功 +2025-08-29 22:53:27.359--数据库连接 SqlServerName:127.0.0.1 +2025-08-29 22:53:27.361--数据库连接 SqlUserName:sa +2025-08-29 22:53:27.362--数据库连接 SqlPassword:Hexagon123 +2025-08-29 22:53:27.363--数据库连接 SqlDbName:NextSenseStandardDB +2025-08-29 22:53:27.364--数据库连接字符串:Data Source=127.0.0.1;initial Catalog=NextSenseStandardDB;User ID=sa;password=Hexagon123; +2025-08-29 22:53:28.309-- 进入显示车身模式!显示车身界面。 +2025-08-29 22:53:29.581--启动PLC写线程! +2025-08-29 22:53:29.583-- 进入解析CSV文件模式,开始解析扫码CSV文件! +2025-08-29 22:53:29.585--连接PLC.... +2025-08-29 22:53:29.586--软件首次启动, Nextsense EH3 CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEH3 +2025-08-29 22:53:29.588--软件首次启动, Nextsense EHY CSV读取路径存在;不清空,读取NextSense生成 CSV报告路径下的所有文件,路径为:D:\cherytestEHY +2025-08-29 22:53:31.222--Right EH3 UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 +2025-08-29 22:53:31.257--Right EHY UI Refresh tmrRefreshData (strVIN.Length==21):CarType:EHY ;VIN: LNNBBDEC8RDA23997 +2025-08-29 22:53:31.753--PLC S7连接失败。 +2025-08-29 22:53:32.612--显示右侧EHY车身数据界面。 +2025-08-29 22:53:32.619--连接PLC失败 +2025-08-29 22:55:12.952--Test Post Data: {"serno":"312314141","vin":"LNNAJDDU9RDA00213"} +2025-08-29 22:55:24.984--测试从IOT获取车型信息完成,获取到的原返回值为: Error: System.Net.WebException: 操作超时 + 在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) + 在 System.Net.HttpWebRequest.GetRequestStream() + 在 NSAnalysis.CenterControl.PostJsonToIOT(String url, String jsonData, Nullable`1 timeout) 位置 D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\Analysis\CenterControl.cs:行号 1598 +2025-08-29 22:55:25.831--测试从IOT获取车型信息完成,处理后 获取到的返回值为: rror: System.Net.WebException: 操作超时 + 在 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context) + 在 System.Net.HttpWebRequest.GetRequestStream() + 在 NSAnalysis.CenterControl.PostJsonToIOT(String url, String jsonData, Nullable`1 timeout) 位置 D:\HexagonProjects\2024-20-奇瑞间隙面差\奇瑞间隙面差总装代码资料\Code\Analysis\CenterControl.cs:行号 159 diff --git a/Analysis/bin/x64/Debug/File/AnalysisConfig.ini b/Analysis/bin/x64/Debug/File/AnalysisConfig.ini index 7a676df..24669cf 100644 --- a/Analysis/bin/x64/Debug/File/AnalysisConfig.ini +++ b/Analysis/bin/x64/Debug/File/AnalysisConfig.ini @@ -16,14 +16,14 @@ ReportCSVPath=D:\QMLTest CLMSModeID=10 ;1:CLMS授权 -AuthorizationMode=1 +AuthorizationMode=2 ;CarModel 初始化车型 CarModel=EHY EquipmentNo=NS002 EquipmentName=Hexagon ;1:上传IOT;0:不上传IOT -StartIOTFlag=0 +StartIOTFlag=1 IOTAddress=http://10.188.2.56:9337/web/httpServlet/api/saveGfResult IOTCarTypeAddr=http://10.188.2.56:9337/web/httpServlet/api/queryGFModelAndMaterial ;显示车身数据:1:显示;0:不显示 diff --git a/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml b/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml index 3dd0985..ad91ca3 100644 --- a/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml +++ b/Analysis/bin/x64/Debug/File/PlcAddrDfn_S7.xml @@ -13,7 +13,7 @@ - + diff --git a/Analysis/bin/x64/Debug/Key/reg.key b/Analysis/bin/x64/Debug/Key/reg.key index 0b1662f..6b1b574 100644 --- a/Analysis/bin/x64/Debug/Key/reg.key +++ b/Analysis/bin/x64/Debug/Key/reg.key @@ -1 +1 @@ -E0257D210D71798C7D342413B6AE6E827FF7CDF4D9B987590FAE35D6DCCAFB886AA76997CF2A0EB6CE1262B84EAA89847CE6CDC5A6F8D2EED117805EA3C58FC41BAE98458ABC8F6E2F7D3BC1F235ECAA82954257F761B6EDE6B01E9FFEE276B41AAB0B16C34FF9D2865DF53073BE883F9187EB6EB61E90DDAAA99D8CEBD45D79C7B258FDE9888FDC6ACCD540C3DB33F837A1CD9E7A11BB9D832E332CAE39B9F387EB6710AB221145D9A6E1F2A1FA298D40262129F295BA060BED16C420C03178782B354A00BAD77335C105D312852C3ACEA15E3CA3F54D6B16970431D3E78069F9EAD8D82F39E953F2D6B51CAEE05D904F400BAFC3F41FF2152E610D26B4CDCF27B257D642BF1F30BD8A177925C11CCA10126D0A2870F62CEE7FBD251DCC6A5C68D62B656F9ADA143E07B02516F84636148A81409E1D928DFB346CD8050354C82CA074EDB89ADCBE6E31AD2D142B58B04F2577A03F4CE43586150CE1C69370F28D58DAEABCB2C5920A9759C3D210DF7422DFAA2D1CB0D95564D2A07A82B2F4B4A497C47C57CE23CB1294C515FACF9EEF0C4A6CB8300317D90ECBC6B30D2ABA0EBE5698648EB59A1B33F770C4EB0F928970D13FD27DA4B9521F223210E3B43345B22C2583B76CFAF265F453C3835D7ADAF002206BD6F4C338D19D0DCCFC21F76526CAFDDEC710742816AFD59794DA9653452A9EF92504C1D44B9ED41133C75E185B80E331B531F0535705493788E09E4B04CF0AF947157D7C9E1D6F7F55ADFF4CA2786E83F4315A170E4C7F461B43515DA399766454E68E89428308D085AF0CC75182F5F21077D3A1A42E53784A13DA35D174311F41CB0C111672D7AF1E3EA0E62530BFD5AED3055D783C8020517B9BDB734E885A536BE72FC79A53B301F6994EE89E1EC3D195C4A95C8E880A1F058A9C745242797396C1505ADE70F66B51C0028466F38DDBFBDB66351B696404DC767D0886B7E903EA892C6D667723939B66376CBABF1035635CB9 +E0257D210D71798C7D342413B6AE6E827FF7CDF4D9B987590FAE35D6DCCAFB886AA76997CF2A0EB6183A1A07A6254010415BCA8EF7EB824B6AC227D17C067A53EC3C074338CE4489D1526A6745F8326A3CCC88BA268537C2982273D504D3FBD0570E4C172917E3829DA2C9683B7D6556C8F161F85B4111525371DC60C71086CCC0DED32D5E81E9A83608FB23D8A98F0CE9A56F4559B73159E51D63588E1D1B1995354C2A43825755B0D8869373E58D59AF678076388BCAD83C36867FE0FCFB50D6200CA3AF3E09CB8A154F46BDBE1651F20EAB4AE02E0D16267C192E4B8AEB473DBD8EA87CFD59933062F5FC46B4C360507E9ABEA928539EDCA1FDE38757CB5D50CD286312A907C8659BB2CD95C1C5EB5FB3FF894808137E7F01C767C4AFF501FE74A18570277994AC542D7CF811A0AAB4B53BF5083C4EC10DE7EC55E72BCEAE80B364DDBA2515CEA190D585F349A2A704ADFD6F7EA8D23C429EEE440239844CEC4ACA624A34933816E72E71BFF1669EC74486B70E0C7DD1418C983FCBC9D35043CB2523A685435B541C7B59F511B00347D7E16E1044B337CDD4A819E499EDE975FE7A553DE2604235916CAE6FC2C906625DAE32A7C2441969B842242AAE869F95C22AE889BC2388CBECD6BD0B3074A656940CAB067C850C554E112A104F445F4F7AAA5A879F2C476B088120CEFA03CB3597CC695AF681C6A54B61DEC63E8F39B25446DAAB73608AF105A1F1C2631780E4A7A202FB03323B82115B2BFE71A26FA516FDAAA00A1D4887BEBE6DF4C8D9130C57E0DA55DAC33220C891A46CB8B73D8EFA47314D8015A7F3267D2C726ACAB59DAC92E8CD24F4D08F3B030A96489379642E982F8E4A8B25FA3979A230A6A7C6B38EEB71B0B3E65305D38AB9AD3C3433BC7A5555AAA21F3807ED4BFE97093359CB1E80BBC539B97F616E017218773297294742D0EAB299DD2FD178FAD7D01FD2FA200E6974BA95123B01367C62EF6F0ECDF715ECA67BFE83 diff --git a/Analysis/bin/x64/Debug/NSAnalysis.exe b/Analysis/bin/x64/Debug/NSAnalysis.exe index 314bd979e5fb3906a3d5e5bd04d20889edef06be..b4ab58d2eb86e8888368f1852bcc89ee252375a0 100644 GIT binary patch delta 162697 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 PWpPV-jJKp0`q#i;`^xQu delta 162231 zcmeFa2bdhi)h;~MoAdV0?#$+Cgt7m3~@4esu-2eW+^*q`>_139V zr_!nFQ&l}{ACzM4dMVbOmw2J)mSbZ2-=^5`Sd}#)7JK-zA6{AV=<8jvcKP~MC9|?; zh-78`LtU|$1I~xDSBf6-X!c>TQ(}I)IM#THhza0-60y?#e_aw=)gxDaXV{qA7h7Kz zO{%bBrIn?{Yj!P)6_*yR*^M67nk9I|VxJZY1*QO0L-(FL3KhJkqi9QNXKxEb*=wgaWkU8g=MiFGfZ`cK+MPQH zJvxeZIB%mqylfQhOzr307ll$4&U#A!Q4U<`yo>tuMzohka!XY?MI?9u!`WqhiRMtj zRE_g6$+})eX8IC__NhAOzbNwk9D()D5fzkCSu`KJV6jpS&ST}^-aUsq?yMvsr$ykk zQ)1c187rrBar;|q4xrX8UUMKlO4b}ikJ{oj2h+1?%^`T82Qbgp((dd}X0&&W;)F$O z4kZ?A&0+K?Ub9kha%gL5I{WU7RQ916Q?fhG94l_S{rH*78^wpW-@k`bRB?@n6(`44 z4qlUeZ?8|pHMhU9_uL{pM(lT|C9cW7ykaB%-h6<>--QRBFK*0kJg^b;83%P_t%Fu3 zZba&O%ewKQSWG0gT9u`}qhkz7JRsptntS**5 zGZw2XdOCfuh*fsSdODEsYe#1jAyY*xy%KR%J*|kUK4wfu7&Rw0crEfCybgcTUjx(N z_1V3T8CORfE!^cN$C88BX4f4v6)HS(OiwaQTNz6qg%q(^PvhVWYUpt`NWUxH5XU-z3}Z(HGh7mqYp zDr45b2aq!ai+c;Pj6vs*Pbi9gXrWuhVs^~3`fIL2PHP?}6|DZBWRHDd_`dHWuof)E z*1*U3o5o15tZES6pITz8(lZfoXX6ht+_Ih6!N;L%a;vB=?`_8TXvx0zKq6zeLIRtm z*x>Uj9=2wOnAO;r9!}-uHI32j}p*mvPkK@4%Km z2`a{m?c!cA4uFx+Z2yDyyz({`DE9UOm7Yj^C3cBYOQm&zb;kzp3FMU8r6lLul=PnL z$q&Xe!`g`igCV8NF4IytrIKQ$Hj(zs}J&1F}(-z7fx_6!~_nzPdV6(}@iMRNamg7)=!Y)NQ@vGpK&=H2g{b7s}uNYy7G7viV?@H(=*+R(s#i2W!0R^OMJm zy=U`T<0W2Za{;*2`)vWV%&Ta~Qz2gN{g$$OCQ^iWh4)bbB`U3f_0(UkMs<|B*Whm~ z`{cuSXO1txTjhz4{M@R&rUGb<*HZwk^>!|R)_KbaHT7-6z^TtuINR~)g#|ThDAW}3 zc%in4Hx_J+rh<);@bcPX9yCi9Y>Z}A?a`hSZ^>(->@mOpW$8TXh(~9g$J+LuOXSI@ z0qe|{$mr2TVEO%wFaT=BbX!a(vjJFpJ)K|PU5UY;B5++-(%S>k*L5`y{+Pop z-YFbz9VF)Ky4t*RD4aeFMW`J75wP^>5QPb`8leo9UFqLagC^2<(*yeO52c1YHvvZ$v@OR}?JBa798=jh6Qe3uTkf>?mPZZ8j_)idg!2Xq`)jhHDF|oD@ zWwFPSvDj&(AB21fY3^-M$Hk0S8EdQz=iaKazH`7CW2C>A3-0{}WpM8WYh`J=2$Ohn zYcZ6nsp#8}SiJ|Rh};7G_lZ~r^EXda@se0+yfhIno8ARByVNebGF~3Di{1OVa06IN z7P}89dOgt>D|#!@*OPV+5@46R;}F0!sR(XH?``A>;AF(`SWc!NBIb^ZFFTSO+p|;D z$Vr_D&F!TaY0=%Fl|`VrwUq0++Pxm);D%SlF=|S4xep_kZg1yQ)_$k6`Vj=;Rd$tK z+5c#E<~x^*UuBotC}% z>5kctk(?6m$H*Ql8k#;;{&tBw3IXqVM7WD6#c+FgZ(q!N8-TB3Wp>TGV|!_N0Cv5? zqjd^GSj$1#QBIE7?5aOZt_u3)+WWIN|6#azBK!0odg~7aulqeD<5f!f$?RG0#p_SZ z1t&a{5t;0*&vc0Mvrj$KYCY~`5BYnqcrtt8-%qffakBsV`wrQ={@6V7MI=l=1!<_} zhNNc%+Z&p7FniqlW5kB+uxIzSUU#zZzTacL?PQZ5jIp-HvKyXtGDf17sEpP?hRVUN zZN3t%IEe0rVccQYwqALiyOFA(AGW(R-fefIPOvsBje)97Ug=Ku>BN=p4nEy{r8`a0 zoSk0;?|m#1%pBDe(wDvDxxUQnR6{cce_tRm6%PD4AC3M#>CI!(>ly~dm0YuL)epXu-TdJM@pAU&KQ+((8kjI#tTP{jB-Vk3%#Dn; zWL`#IxmJ*f`KNs?4Fw)@j~|G&B-~Gq*WzpZQ(a28m&rHi^9$3j^u%c z&pxubN4%KLJm2jEIoUHJl|4gOcDC;yZJBpaELCH$kS9Zb@6|fADvzjsl&3P@X${aC zyTMMcq4we!Yk=0_4Gj^97Tyi<2viJ+d#0akD)H#nCP~>tU#M+^H7wp*0^1s&WzXun zmdu7VKudDFF?-pTrcBjvJ)pdoi$Ia3@a6G3-A23*P_pz((A%xRAIKq&2+&Nx$LO^* zD9|-Kll^GuO7|5Cc}d7hRbGT?LZsKz5pE-TUJS6LHz#XvX%@R@$84EwSEEMVS5X%U_cf}K*Rv;WX(@YyT4C_P>?K>83$=SZ zWp~1y{e`&fPSsc6Q~|qQsrFYLY&ceh-_l`Qhu_xWxDNkKg&P{Z6;PWExBCuZ8Dzk( zp6@CS)sf$$fW@ZA?sWf-P`7s|B~)f71Ja+NjVZ0%eP5*u2BrG}B{fW{p5gF-3eD3ro z)Zjvz+y2>Ds^xBeCEoW7%7Q1`dG@^CZj><4)Sjy>HRtdT2zSvTV5fTy;mi#|kN>l6 zN#SJNr*twnYhw0XObB!BxkffzX!rqkws)S9+_r67Z1Ab&;|uJPq>Dja8DH4Hg&vFSMc%7arcV&+Mxbhh5vVf)?msohL<0=j zrz0^hYvZFDMtKXsqr6I5u1cMVFP?rmRjplYFLpnLK<~utHLo>i6p2LM8j>z)to;ko z2B*DH)%&jYuDzWsAP{0NL|-@4EDECha;f}d_F~lMVtX;xnV&&Cs&O}aw;2ayP>=Q^ zzl2})^s)tOfNJlyA!8mgVze@PN`|YbsM38td*|zIOK4WZ6613`avQ_mou^66ZQF_M z2x8rTW}P<{W5PZ5jkd+x5$oLuM}}WZVRIsPd(WHehCTj zz3jc>d)s@Xn|KqE$}aI{QsSD4ln2|N*!1@76Mt#W`~Z$f^sx@*uX~;nub6%~KzoHd z72K=wav|ae#MBz`K>NU8jd-A{xXENO03X10g{Gr&=;fl1>g9-DIQl3pUNXeo7ZIVC zL2A8dAL!1YNo6tk)T)t9&q4M7`Oa zEtS$wQc06`A`+?BQCQbk{MD(UKBF}UGWD;Wy|0JMR;qD&LxY06aHaa{L)J4c-@0wv zD+zl=_O{O&Gny&A8+45CgOy!uReWEy)NpsCBGHN@ody*@%s#BQDyCUtJr#J1VeVKe ze(`0z{_`$I8)6X}8ky^rwMAXV-CRv|TZ3JkU0%PLr>)?2JRa5%~oZrl4H*x=Q42bOlZ*OWoX zUT*YbYw%IzZ!dT1N5SbytEn`mfztSX-X6rdpTTPH=bZ*jnY@+u%HFz|w+4XjzBC}N z4uhCv0Q}Yf?6TzknK+!+cIhR@&e`}k%oDNLD;@E}W8R;@W*@EwTsZZ{ULj}2yfe|V z;QSn0S0ywyDr2z(9`uj!{V{qxJRif;#LMHc7@YI5Q}GON^zPW@jc|NGP#I7^0x(va zvDnY>;{S8}?*QEdh#V2mB77Q#A9b*NM+CdzkxwNY5to2dx$}o|L}UU_#Nov2*`xgW zBTq!WBVq!${yQBJ@CI$i6QMfw|C5dg%iAGa|4!=vW=F(0!x4d@GXl-X|KcOn($YH? zZEDvhuH-lN|4A=}b@Hg}ZO^n@1EaDVo@puMrx3?x$G@NakEep(@BYttDjo{PtoJ3z zukuvv{k8usPetxKt%aq-vDu3^wf=w4eL(|9IRpOVzW9&(0=6}c*UrG#^ZzdQ1^3ne z^X`k8X@C9T{r}y4anygO`vRShyutJB`F(fN%bd5bU(wkoUv2-7V*~45-x=~B#|FGK z|JOP;2GFnb9UC|Ly&bPJ|8Z>m$FVWW8``n48GYrtuK$Z18xu$W8;*??U@{yV17T1( zHlzWNV^&k2rQHx5d}A+v3?Aw?$mLEzUCC7MOvq(q4;(0$z(> z!%Og+?@SaejsJpLIL1Z0tEKLr;ZdmaI=*v=*dxhKNE}n7BZ$2n$_ZKI&HT=TVh8d3 zcRmxXnOWo!tFdc}^p10l=}oM`7OwW#8s0=7jd~M(RQva|Gtoz*&cvF)nV2!XiM4iZ z->>Pd+OA=5VtN6JGPX^J@_mavA`!2%>-x^(G)mP1?!{_d3LOTt#O~0M_XcIhMkM0%5zv&*tr_E*R@#T@d&IiU5gclYq800BG+Q>2$b&?iRqm^V`8g{y@~jn?!h8N=foYp$lWUE z6^mxEO&(Az_7^MU?Zsk`*>Dn8#?kVs55>_1;OVUN0@rkpNK&`&?TYc1VYTw|7Te`^ z)s>zr=az`(k>Pn3^vuGX7s@kB#IlT_+-$odZ4uFc{?f1_9&d<;XGyB&+m+>iE z?=}>MkFcbRkY-v}Zu}#W_^n0orBhdIv>SsSRP6Vl##QlRxNmvyAdoK)D;19Q$QXHc zshB2&ysH!fHpsV1#e}+IWZ7NhscLma(C>GDgC zJ<%mAdtaUi~#_8ZV2Xyf%Vm z{g29`aujrqoLMdoFI|iq2k8cReYqGhV;82uRGq#U5^5}d^v8k3i!Ha2o@EVX=_U{; zWCD+F?Aw*N$tx-;6!m%?r zw@a&_xBPCUXwT&Pjd40n9Uh0@cxU*sVuOSXJEYY!&JlTP03|W6P=1IL1~{=onknd92bzPOtI*cds>K}fdwE*5m^wY`nzie&`4t`PaWXDVIO^8S zgZ(->^M(O0|5`1&?KP;wcq0#`^O?+E{l_+Oq?}$OcCXlg%HutMc}b1vI~H}xXSR^u zKeT1r*vPewZE*nRNhv#eQmRIul&YnZQb{{GV>0%sFvF>nQq`)*d*6{0YDID~AMbgD zhRkg0`KUWSlrV_1YW$+wY&Z9vPrD(J7uDuWq%&-97rsU9y|>z}=H7d&xtZGP8GG-o zdY`n_Gxpx2?C6f;F`h_;+`V_5x;fs~b1Lndx9N>{Ik!&eo%g3vSnn_R6ZY!QDMXuV z+^ZwI>#czhy^pJNh}msuls3Cf@2)3TV1K>C?wGNfw%3C~_=Vx;G2QtQ=KgxLl;-|= zPK>d??yD2-uVZ^%&Z!qU`|D8&b}G8vT`)G-Uq>GDNA+TKuR0acf>O|0P48gW^kRN) zG3H#}pBpPbuNPgSUkMmAiC$Bo$AMOYM+`9ShEo zwD?hNsadJ{I!a!4zSSqY8^l7My9<#tfT1e$=E+y18wNL#<5x4 zMVbBdEjtJVJ(asRX8K}xm1-l#NYjM$?paS{lb*iS{<(H+sQM4ZQA=up?Q|(ck(0W8! zrtt6%twBao;r(i{s|p|9@smD)7FCW?zMQW*;1J0Ri6cA`xmk7NX32{f2ys4=j96t(I|$?4-?|t3{`H@ z*M+hV0@KaFI8!krCe|}mw@^?ZVhw~u3PkBNTWm~xLTPMy5w@StK}+Py7%G{%7sr(n zFK#IQs#?k6DNrr)wMO#_}6!JTKdCvff zMF@{+9Hiqj!h8tsBkHNq5#Wxx{MF*6e4=p?4G7#R<1YMF0`j|cIl4703i6g`w1|Dg z@$#t_F}uEGEb{ywjXE}hPs;XIF(pHVadD*;Cl|Z%*Tp5(N;i!^si)l0c<3H#vW)Rr zyc!bOV{nB>AiWNX>n#|kj`oeExQrSA#@R`4G$kBYFroW8)VE8M7h|nT;6e6~#t7vtrpZ6a0kITY*;5|3;b-SxSN-J4EZQ^ghp5 zI(kO>$0$nCH6vP*#=-nVXHzEqv9#39)B4&Dyfu9xpX?BGrUY-|RsEBpTy?p3C^h30 z(6RD_y8}J-V3-QJw~2b^+)goK;WPx*ol$bcbYlu7#LFOgnRh<^@@p+@9W`%h8nX;7 z__fXUWnrG~6piwCouaNY6o}b16qr>4<-47tW7KqH!Kd}T>j4+L9Hv=5x&KAKKrN?V zpxS>%j!TKQ*%N7qkOhS`o#4}KO%q8z)DELsPk0{{Wd{D#D2G#7d4)Suek&zXyEGv_ z=$kts5Eu}83Gln)^tWkiMZK&h)Vna1pju>4^Y24ZJQb&x){2nxVeFF?egWX^kV<`eR%-E}~ zf#uMup~9=8vtLhf3X~tUz8B$@`S?DBqci66A3(Uec;KIE-xCm=4|6QKXGC6{@Tf8` z<*k9GieoMnqyPh6bMOk5o=4HB=_SNnlW=z$g54U}l{u1m92u$!Rj$R%(wxT!dkK7kSIi60JP)UqK!HFlINQo8WDc(g4Ma zgGGlJ@uD{N7HfbyxM{_IhH>Sa|C~6({0HgK6zb@__g|DyoBy1I%KX;{=HJ%lUr7l@ z6b-LntkLk&G5VrkS?mN1vh&E=dv7B%?|uBK=C@yO8-+{ct0ROn9M0lmKKF=wgAK9% zJ79QfDlB(blpUWyXo`7Na@a^QtSON3l_GGzt&oVewhN-le5Ihl0)p(W?dj4nW@hQ2 zS)ydDW$+f1u)iOpyQacDn@vGbEONTzQlyC0<9QLOm+aq7{;EriscIRA3-~{x%2^`c z=@Q2skIA!GeF0$b8jvlM?ZF%H?5!N!7ebXw43{NG!pDxJzJqc~kjhG@$f!@3Fzk($ z>D^JmgG=$}>4sQ(4?H1(o4^{FB=6}KEg8=6LQ>dU5J;SkZ;0R@W-Ct2_Z#Um1by$7 z0QQa~#@i5&UF@~*BX92%A6biA6S#WyEEdXRs|G1R*Z#<(h#9F5OARFd9x?wC$>XJ- z__5q?l$dM1H%@+Ulo*@&2yw}aAltuX(-X%BPyjZYpjR@U{lV)YB<8hHpu!ukuw2J2 z{CRs)H?vESSy_pYCkczez*FjK_Kd6FGz%K~qfxZuEZZQf{I4{x>O=36vt?smAn)G{*EH&INVo!VAh)a1f#4Eha{4I5k33Nz*IjXns*cTxJm_hsKW zc;w%g$Bq-bH%%m2+^^I3Dtlpp8<&)k=emYKEXrD#+nHzw! zch@o&6uEgdJ{884jVcvyA*d_wvi)Gb`aPl46l zS2`0!(`dXk;wxI#nxp9RN8T?2>7~i^J*Us#a~N+O(Z&_l}%G@f~cXD6wIrI=y=-Qhl$$dtryzs#3$`D~nX>)Z=KpaUr3~ z`(g+A!$~4(;koA|(K&wPRBUw@NRCy0F_Pz`K385f39gSjU;L=x9}`vYv<4OL%po%KNDlQ$*^Z+(I@? zMGwku2kax34qB$IE(PA3p&{nNjv) zZ($!Y@!rF_1sr(&AA_RC@zReG6FZz%fP+tM5BSFNxY!`pw8iS`6Yg5e><;2! z@sQlSgE&PzA&;Ia=87fqrm13*I8MGeRm>9S$>wPY{YdUM4V!>xP-1$s_8vs$zSI-R zlXkiv@GG&_K(=3T4 zYhp1;)nyHwLuI&3SrwYM-9zMA)5XYU@i7MQc6hg1$-2j!Y8UA3$ zjHAjtjvNLSvAsN4!jKH~afeV0ML`rU z#ly+^jc6F5&JaYC%GYP(bVn3}8OFdx!XwOt&3w^*s637|S%+deY6zxGXy%aX(L-XYbpu8XPB=Ue2QuTpQ2j9r>Hi3 z>F06(PIi2ZJ%&D8P@$k`|H)7XiuFv!w}F(tblj$P1wQpy0f+c>6k9pUqp3KNJ<7J;f8uIv%MlhL3_LU zfuZ567~8ltLU&W9diorK0_<+<`DADp&46R?q&{lw{Fk4mpx0?Uf^dC!xthoO;dX)4Z zPmj|66X;Rae(rxOJ#6)8P>;BJG^+GXDt$s_ zm{hWx)uYAg7gUZ{>FuC@UzB0ZYa#hMlP5vJHE)2-Sp6>1e_@!(HRLvkKw2p=BDq(ymr z#7cafa;Bp=RzK(5!3<2+FgZXBbmGVAXL3u(`w5e062m`3^3#y~jLFk7#8J!AxS{E2 zk8ZH9hvYy=o*9yBLK2%xelk@eZt}GudR9oD%_Qg6PTQF}yCXu5BSZ42kUTmhj|s_R zL-M$gJf2BzP*^Nv!40}Iqg=!A(*Qlw!mHVugES5D;E<$!RN?@7XhU5|Xr)Tl6!WRmWUYSIy^cv9R1-nMrZSCP zLq89=fI+UIimzvqd%PVoG=yk8L>rmpCf~$OK1dSQG0NnnA$bauq)%qeYNmOtoysID ze_Du=S4odRa_Q)Dq(gLcNW!t?GjuY^<0}=CPDl=mIk4^3sRrfDwod6-^{eh`T~%K*gZ^5#A8-ba&< zpNeTS6$54}26TQj(fBE89`R|KNc?PRCh=*SN_-xgOPHoFD$#7>N6>WQ(>oe8O$@sOF)W!pCW7mm%H zxR*F#S28m`PIe|j>$GHae4LDqPm|U0>3Shk%S1v}>@BM0g1vE=o-B%AIx-kOC(~Lo zSq~p4o8i-BG<=$@MugUB$%Obg*$|&5BLaGV9u*wW3CJ|~OkD=uZO~*LG*4P5dlltK z)wpH;Fq5xuu$m?i>Q2Gp*BYSJuUqa%2QaOKLs;IryXA;iv-kcuF^$qDll?~^wRkO8~VySfhQ6%8#P(Z>(5A>xaTr{U2@X9J7 zdbVbj$L%ZHpv%Oyqxi3r-EdPGsIzpqG5fo<71paUIbjd08~BH7M^R|43e7o-LmO4- zQWbLcWX@MrXq5_$Kf9xiDktezo(il`YP^Yi$9=_jX`VR1aw?%i&_IGGSRBOn2v1-Yk*#&uFG`c+fMWj zg}n!BfZm|+={IYD-k)$>qrw`X*C$Zu&-C^L3h%V^?gR?wF3)ADDI5d*hN5uv?wg9j zci`x~34HiiGrcxl=bjsuGU>GAkX!!|8I;cN>|FXI$bqFhI{}HdM4}(_d!_r0FtzIG zt&zGX=G36y)j6q)MNj2wENnz5<(r|D1mfkz`-%#=eyb>v>)VTLD3FIkWEsr{p_eP#Pf&+OfaG_FwI-6HLE4MrZ2ML&G9Pun{R0Sd= zP~ar_`a!q^eiBKVpC^gnKoavD#gddD0s=wQ%@giLN-+v}$K{DrJi4M);9^dY;ZYJ) ztcucwq*3F2J5LtDfojb2Q$sZZ0@W0&u4Ec}UJG2l!(*`tdhDlV?O~!c!%=tVYT0CPs7B=955~G-LY`cT59BhlS$+Znxr$ZGCG!=Op90?EJlTpz_Xr9c z6_j5^MP%vnlQs0bJXr(>dNR+qjq(!^==lxR>&cjUKgttCa3F|z%mNb-2qGiwJ)9?j z;6Q>3Xx+(Hdz(}OWe>=NDjOc8V5ZvHVdD`HA+{;42 zG(%wq!x#|F?&SsX)Cf0QFv7V4>l63e1>;f^-0x5XuK!S;Mm9+E`R>8FvnQuTc{f6+E`2;dWxU9ke_|niIlC~t#}S3N<3Aos`qkj)4rVm3 zSvx<;Pl$eIa{TlwIezvP98Hz(&+}PS?f#-b#IR#Udw#{nZz;e^Ej0et{0NjGa-J~K zOqYFRC1!+3!i6uaay48=k#gtt8=p@#Gc`m*z7URV$!m^iT56Oj`Duq%I!J!p(V}BX z!IY^93AGZwEw?uO#8f_?>6bo}9QKN6lJ6ZQ5*0y#LrhXBtq)=$QV|p_#3Yp`$`y30 zfU6_IAjf0yM39Q0Cj?0n6*m`9Gw22(pPX})A#Kso!Zx~mQZ?^LD!y@DJSeSi`G(-j zvkOD;Ma=}5VQK;2Ul$jMp9i@8lOW zc%Ht8B7IfZ8IyAG7}3sc5kWhT!?$bjf zN+g<1xKU%#NHXL@MYiO%LNqNI^`X+TX&*8&$F4-g=G&D>G>=20>YL?U^oW_i%I$D| zBGj}u-&lBsZRB$(Q%9rAFjsygk`G~HeGZvpXrW$ z?tkf2@~~B+Ti)u5GVy_;UkT~*MzlFrksQ-n+3Nnnv15=j8>0fa^}gRPSK7${$vsN>8no`t(wlRUswt9EKjsu;o;X}a=11Fj&8Yes~_7f*M5iTy44~fMsxd?-|6RL zf_D`He_IH=I|rmjpGGU_r29J+MS=7^pxxuu>mIMK)e4@s6!hZz!BsIzrMo_iN=;0Sh%CcNmUpVL4F6EpS6HnX#@7+9 zJ)fjV(!EcKqClH_e;9!O=?LiVd#Nbi`=KF~i?J5`+V4x-{=S1ZH;&E$%o{3_P6kBc zc%MYo)iyJZi!qjDJI54bk^g|9tp6@SS|nZV?))Mq=hPOpNc$(4@ozX)*auLw_pgfZ z6@>r?uivp$Q^c*t_$~A*QL8!@r@Y6gJt|Y^2>((pyHODtpof_p#AD1SH)*hiQ`T^AsretFhdy`;VxC%7?1Oa$Sq^>NC*bT!H23umZ~?6yd3Rc=(hP6j3r@R|WI$Lk@Gbl(UA3HL8y zK)wCHsQ~IK{By%vdWJiXH_H$ovS{%H1mY77l0PE0_Mm;%l{)LC?u(-`(H zG14<|6|R{0=?MtZQy|hEwqer+(f6rZrkN#}?ji#|7UsvlV(j!vizB^17~A>&$yh)dA+EFU%~4~yikm9L#55(nfe zCWa6~GH~o=$jpoK;^f@H0`g1p_)xQYDN(weIBY!Uh`DO(GjXzDvzewh);T?qGn zW%MutQe#uik%b6>&i#hXY-kunvY96DJxe4T2=@}iuSe)KRW!n#dkw+N*lh|1M_4o(N96d@21Si6NFw)K*Gi0EegaC2=2uLk;Y;=uC&nMj5WaM5X?Qe?4X2P92jQp4} zHcuXVEc;1zR?J{TY&eX-Hzm=Zvxt5SE1|{9vF}az~Lf&J#`DsxU2) zOo`dsr6KHsm2%ky=z@ehw;7o-vX|iJQNoh!5|+ z$MN`;-@hxu+#GmcLCx+5ipYJr`%uAZWNlJ`gu7WYPoW$$oTXi&c>Y0A)&S@K5olZ( z|2TwNqE${@-h2|G>xO`YyTwRwaVNV1(!WFH-N1A*{f~fd#wS+sdczU!CzK2yG2(jo zrwXKO_frk)oo)YR_+JWET94H{T%gZ%;PBk~d=>fPV@aP=yeguDm;X^QXR!q%a};?* zz6j%j#UYo{+e!ZGA~9^mmn^(YWxG`cymNz`>@x3i3TzAIxUnK+TjmNpkSz?Ff8=sH zH8KVh!*a0PN@R>!KIQAjhKaBY2@{1dpVZCg=0m#%Tg72rDPQ<0W$P)TMy!|V zQ-ovPy_4Ma6fq|A2TGx>HLE-YHDwLVG88f3zQXW~!Z06q*7_Mj_~f&On+<%nDMh-M zh{Sj!cCHyqv{H1Q3Cr1+isTeZH7KG zL_;kVz1g)?gU*uoU8;Wn!<@kEa_<9@Uqno}Bl>X|sPsMy167{2v(KjM^q164%iUrv zp0sDEA|I*@ARHUiY*hg!Ph2OGdy=wVC1s+^$_)qOq<=KMMs>gdO}ZsU&dhfl4UJO2 zxalK3)UJ)%#HBc~SnLi3qnzPNZ5@$u`zmrE+6QQKu>o1;4Y= zN=n*{ibD8CD%VB8LfbPD7DI;IaD}MCXBle^otp@RWbEXG$(YejIB#I?OpQs6N!L-4 zTEnbVqPc&uauQ+N_KI9VNqib9406H$g3}Ev@SGaU$gN_A$mjai!*^IwMAo!TJ93l|r6J zX|&Df=*qcnQp=RDe;1#M>62HLSoE;Jhqo)@(WCrTO!!J!-K}%t;9PGGwKEc7t%M`= zWOZ{=w79JWai!%#7$yx4rOR7~rC~AgQOt1ev_BKPhTH-ai%m?Zp3nJUpp5G|d z5;Ro>Eips2#0=FEzd%d0r#BfbLCjFRO({4-zJ8@h9!p?eTM+1-ZnOm_&20+?7x`_$ zX)ZU~f}`vGrkEjDejiOSLp8+=)fB{H)T+`}H$_ey6xU6W8&U5!MNUM}6gjxZO8QMP z!)OXkb5n%0ZVC->Qz$yx6tp}DnqsDEikaLL8H!S?FibhrX&CsY(KH04c8QJ>!tz>% zK<~Ro%W%rwaz+V*3;dRGIMFYSrs4Qtl+2VHu0qqyR82EeH4U+tO~cyirpbv5M@eo( zFiLVFf~LvAJyz0hnwdt^XnN!KF>L(tq8mm>IX}=*R{9=!)Rp4Mgf>95KnuJ5j&j4* zm@_}UQq&%(Ee|nxcNulcDRS$S!G(UEa+*IHRm#ypZ{JZay#}+%>E9O%M3vn1ebGcJ zG;0bymZ&7`B}El^f81F*KM)T&yq&LyHmx6n{zL)1UCO$v@Q&`BhIfEeP2|;&7`(q2 zuYLriR-_su)|0{A{4#Kwmy9xCaS~=pf#8Lf0{;7&-1U069$vgu)Zy!n6ybbI4!x*8 zoZxRpoz9V)uM>@v2~X|nYrtIP^F#Yh%i^HW6re({xmrx!$AJ?tHxpv;97?X2iv*;W zc??@kICoXNxkkE)pB*5E9YIYmCbfh{W-JH2zFiK5;Q&)zru{_e# z2}ikVLs?3=UMHj}UYobwun&$aIqPeBM6qRE-eau%|A4FV2i@X#fU0>zwuqCZm ztip>0A4>X&f^@r3d?bH%6JAYbKPvXgD4$eUq-y^~H8#n0R7Mo?J~k?v0B1c_Qd^{= z2~YaX?E~Ss(kBg(KIdn zr7=mOI*Xm%OQ1q~M03Ku@&%z8=#abrR3xVn-s!8xOv8yucL4(M5{Q>Z^(|Ky14U`U zi^UF}2K$K1oCd!nee^V#6X&sXUD^&~?$R_bD?(b&UK-$Kg`%&pikfR96;q=srbbmv z;sUCe_l$}mW@kbvw~gr!B-|TkR7{OL^yeZupYWh!m}$9DF$5&cAI?E7VH`zksYWdp zYE&($Bz&WSm(;ABuBDtfkF(OXRAbbVrn#0vTGx^WxRw;nwe&G}KHYsjCd1M|P{go& zEXUrARX^d*+b|UE$prrO52G(l5(6+o(nY z!VFt=jw8bibhp}r4`kLTVO)iK2s*_pP@c6-a??Yi!6)x9$tpSiPP`##t~;>ISo0FTK@|m+K$qtb9@W7-b;JKSdb;@`Et#x<~x9 za@}1%NgBxwcljA0*f1k3vOe3oCv1l4G1d-?d_HxmJ0H(Uug??b^GQ0T&0R$`f}g*n z)7ORY*M3tNhqo(XG#%u~>bpf7=0thfomxQVf+>a$IHDsU$kWTTj9QJEm z*;&00S#<8kQyO_rXM`-f{!jUgOfZso8(A_YA z;wpNypMJuFff5of4__golk%1asY}U;ci?BgcKmhd+qBh*&KYI1BBdAvoIeGQN9DVhjqSrri{ITTF9cr1SLVA=)_Yr1y?+Q}sp}}dm zOttj!i(qEl!YeVcg)AKYu969{MXvlU%o?$URwioJD9*dWFl)?Qz^oCDqjY+)M4`Z} zu?*9!v5dfu=9o2=R2ea4)=Wg1H59@(Ynmjp7LeMk8DTbSTYM|#o3#K?W-SPoYqJ&r zlFb?im01g7{H6*4-C6;l8cd~Sv!+QhYatVxH9y!eBP_CSR&vaeHf#BO%BBImU!mOzX!>lPFFl%9avl0@RwJm`S3(Q&w#lZ}#H(F;b*{o?)lNDOTXR|;9N+{ zvgoH+2=DOC7pMBOu@L)2Zi6)IlbHNr30_z6g8D;T(IU2?7WO%D9!t}c9>lCHvU*6| z#Gm1g%yB=)_a-W?#4HTtEJE%gWS4epg#73iV)jvZp^BxtBQGrUu{-Y#qhJK24$1lC z34aJZizr)j1%vtx3% z$HY#_)Iq7}8za5ddn4tK9}``p+x>J5&QR(2eG0Qmad?=ZmR@BVGxWozm>K!^7?s9d zv@q7NLb?sa9fg2`)46cM9c@Bm3Ul_Da3;vg?KSZLR#}bJa>o=_mEfqV%$Tog04KGo znQE7@d|eri=*l`VoUbau5mn9AvpTC$9XYE(je)ZoILCmh=EEB5XDXdP(|&R$(o2cg zTNv~jyQak*#}!gz9(w@#DYU>3`l!=m;}uJ)!kwU~W_O}a6&`Xhe;gCPgRM_FP=?Mv z@NGIJ_@lfG`j7*6qTT&I#+rGwG0pGt_<1IM-~yhs5m-*T>f}SMs+z5=UafiZAyXSU z`ats3(T7_9=mSB)OK=+p^c5Ht&{tq65O!`38Mj&V6&RJ`F;YYQx??h>?!e$D$@L`| zP)53sC3agjPHi%@cs>*s@ zm2%@o?0oV46T9B5#QJC@*86u~C_8=k#kTV^vHkw%ANWz(*?x9=J}r`?)pZyC&1c*8 zue*?7zV4Fh@^7-V$#qZTj0VL-?qLxCPYf2j)89zpf5oX5L{xQ03Z1EFF_2Dz{~*MxX=hWjTwdM?%S7sQfUli5_0fA@=DA9D0 zg8F>qmJ9<6DY33u29_Gq2neK6AW)RXjekpq+l_&94Pgviq=jLIQe!QUM$v&Z8hjpK ziqQpSz`QoY!2O151O&n;5D23I?ETj0K>#w*do;}QsUeMkKpF)i_h`rxcolTMQLD#* zd9fzs(0!7CK;YSQktcP!-y_=*7hFM90d0RN5ZYf38Fp0LUzI}JUkd0eh;~C@IT~^Y zwH)y*2B8|q4W7p`4qCM*w02d?XVvz(+CBf@$(- zreJ`NVFCvDSSDbAk7EJ`_;@0GyG!x|yUSS*Wp_EUBggI%=#5*9mcyER2kL}`1UC;= zfNvh!@u2qNk=m21o(m?gxLI}a!dC$8xLJ$wXf4Kl6HGb#Cb%(@AKUrH921;T7e?_D zh$Cr1pk~j;!V0J|+Ks+ZrmS*|vMTo!WpOFM2k;#1%II~9K7+?mbf-7?@(>}xLV^OY z;rLEu)P_?Jh}dujOdHO?VrmyXUI+-r3kCRUsXt++;{3 zAdpCbz(7zSV#BF_daoJM8L)Nt1fq3fU-a=y4x-xKrA&r5r8^Q<( zgi#+QhpiM%*zV=$ar~{?avE&b0DbeT)Vqi@O96>|OMv3Ak6Gwj z0u+_^Edc_(pOdIcEu1gm&t-f);d;XkX9WFYvh#`5x)|^R6P8O~#AOeP_1-X~?<~I# zJVSWocs~KbI3@Yvt~lp51-qEmz(I)cGdAFZ3&V#Lh7ZMu_nvxDR5TkB4l`NhhcAl6 zLL>HYGnQzj&DRRU3r$!$kTu?rwb+aeW$j|Za@|WJVXC)VB=(-1*xe(s6JJLCQie%) z2W2oR;C)Pu(5;%7fK#W%YKw*zBai|9ZJOii-S_#@!D)aRKBc3#E#}K*e-}>q zbS*}1{#>+|_eDbb@W6a|-`~Yp!H;gas@5t?h1wXq`3ZN1pZv1-aYBecr!rqM{ox(7 zuTR^242-bmi|o@&oLa8i9>2_4dtsVl?1d>g_5&PM0DbMk(Uf(a)o%3_$sIotJIi}s z!=4s(Xs_F-@q^^kZ;8fM!tqXm*I*j&%r%9$;0!wV1F^Gk|OI1mWSn1anXdv_Z$4_BHI zj;|8xMq#ds7Wo3C$T!~<@x93&c#j(C2uO|3(S^alugGa$p)`7kko5@siVG!;=4Qgw zLaIV_2m+iR#pL?e@H?s$@ZK`AUC8Qo6P_C8tIJ%v4{@hjglJ?W$Gj}Mw5vu-UnJ|^ z!tGmP@IE%=F5-3_OL!`9R5DlPlCS_|;DQ1y<^s$nEK&dhP=HvBxA`NrPf=ci1nLQC zv8sK-!{RX4#SL=OU&SIh?``b$uKTMfnL5%)MzO7${F6Z^jb&IHYv5J~`cM zS7KOb2;EgFLwKkRbD@*2d`m1Ekvbtq1{rT}A4A4&lI}$`5gyhfa~-opeg+v=yn|-N z(V}8+wUKOz%9`+$<2NgFp%<=uTP(_?PRr@ZG&6W>4H*Pr2@pL)#9$zi(|nuK=pISa zdN>>NB(LVb0}$cQ#stfT_eA_)gJEe7gPu3{C=BEHK}4M9US`5_?z@;7jV$(##GZs$ zQ-OWWSfZ8Un4Svdv|nL(e-oCkBMY&ByY+sgM=;A$!21E!Teljd1f)_qhozY7M@EYf z5S?Nd$eZ62tt%pkvY`P#an=XjVraGi&(*z%Co7a!`YO95!M1Vn{plM*%T1Xru@*eDQKEak+q&p?JZ)by_`1Gl;hw} z#F$VQ_0}8JO+czEX8IrxnN!H{2TPSd=vDc0pztC=?KWv zhrvm{6izc~ce%$qV$m|C&*QoJ&fvK`39sGr%rRO zmlHROroKxIA!I((RqCioBs>)?nJDDlu)92SvsgTa)JqLS+7U-{aDv?sOF*h!Zr&^! z>w|+G%=Ognvgsda$F7e>d^VXU?~g`00@P91s5*p)ODRtF?(XvDe~3j(xhYe7M)V>3 z=6zwvB_OY^7z|F+ahgiG@FOU<_ZDIANY>D+UmA8!0@UsKsB(m-g2fdl>y|HlBzD=I zt19~8Gcu;$EJG>*Dfs^)r&<{dR$829FL}zxVwcSM=odNPQd>bHmm4Ap;ICcfNF_WK zth_kc36xBm)143<93Q7ZaD1EsYHLr8r>A2z@-nW8bPFzvH|hP|ro#KX3RWvIwZE$wb2m*5 z*x%pPQ0|_oh9i5Xw7;wI+)YyjD-G2CZj;)JO=Gh}!D=g7!BJIt8#Z6n01ozdwak27 znKhy-tIBY`ssu+=&EMZ`itO)FW9a?eCVzjI8>lmXolCfv*ux)RcEa4&O?ZdX{_4AG z2Z_bLidBG}@HcA-a(;tdW9R$1o3%|MjxMp(??0Rm?xer`FVT9q+L=wNLaCkEq`5Pj z^m<97ZAQK^ybjw*e`A)U1%8@31j3aehic@Q3q{8yYk)#}xiyi(NR;tsvT6F1URvj(KTKU2Q3Q2Tr(Di9@^zXR zUv^M(I;z5p4muO_oTzJue!y~LZA%A|8=oS;@+-)LJO)ak+<1>ro zx*J4S4PN0ZUEKf^<*=L9;#6f#N|+=ZW@OE*E44k`zwQ#6&X zc05uC@8IKAu^t_3;cF-{nsK62GBJC%8XAt5%Y@a~N_go0VXg;>3+|tnekPV=oR_fu zl5@1G9%))H#s?rpSHjtb52yXGe-`YAyQA`{nbB=JYIYdqZ8WqX-qh*1fOHgnQb2F; zFsK#=W8oMx<)zkWfpe5V8|i~Ou+LkYiNM)YbcuTYm_x0 zUv~L?E~a)n1Jr!!h_NFEuY6B5vi7|+a90>bc<8ENu6E+mwk@vY3Yihsl1$_*Aw@ZF z(&?t?89c(hw2>15DL3Urnw!AjWFaS6oRclK^H5{v<(MLCAg*r5#MSK>N@v#gm(n$}ZfB;lL z^mo@7O!-EE(;RNp0RQlc@@cF?a(|LF;7bd`r(_D_s|&;F!Z2o+LV5NVhA%VW@z{3K z%Y#)W9>Q(}mg}$;Ho+*^*hq9B41NPcCH3iTN>%EuqI$y{Np!o6;)d8Rqo};?G6KDI zMzd|=?Xm{O`NQ*iOsrEDXPvxxEG!PSPQ>C6(CmN7ajxo&gn2iR?0F%O{*=1wP9fk- zq8HHUQBX>mcUPUo-OQ@OH$(dfgy2%`zL7CTpz|1H`n`+*3@datb68mem#Pw7s!Bv1 zD^el?f^Spm5)tODH%i2*-ZDx=fO9xmqG*X&TJAS0Slm-wA~Zjhh>+CDIVED5zc)&B zsjRKS2PjTa1vrHZAWvH>nkMHq!6~HhCPQHY(why1PmxzcR)+Ar8t2qsuzpHC0#eI! z)FaS&)KHHARCsf4h0|aRm)ATr)mT4ORENEMwUD=#Sxw`O_|uWlw*>}#h6&4S9jhZn zv4IDZ0$#&1^gr#vTrKabwvr+B0?VvI5rb{P)$)sKtMw#`a2_#=7K+rvf`H)t zK?Uj|X!UO9c3_BaZ#!^xz5{c0#DTdw;=t4)y|PBpXgiP}+JPD7YAkw#?ZDNB15?wX z1CxOf)@tRzL(+lt6E}p&WB9&GB{+7*ULq9Yx7>hoQb~o;NyP z?zs&gcA8b?SJZx0R#PT*OwKQrQ8I6pkv+@VE9Z@Zz=-YRWNUM>H!F(c^a6pHRh+Es zw5lZ4SRD(oj%w@oUL-*FK~l$&!6Fs zAFK_iGI@=TXrgu4j_c1!mHK$Cxmi$qdB?W|9Klb<}3sOcLNci_zs= zhZc^E0_MHhXkP-N+dZ86OiE3k^o&f+9CeR~tqA63mdAPP;X#0I?uZEu@$H$=biN5q zM@(osVnTIDo6xi}q5RM$G|aV-3B?c01Scvq9hy)EMp$WOLb-_AgaRTH%8!(M^4X$V zp)4qJh6PRN;~vzS;lLZM=K9h4-8YR7CgL|vV>w2O(s+*=&BH=YN{x&(1A)%(4C~3s z-k@Z<6$rp!9FaR1HQq|Nys5;h#?RC6N3bZu9HlHwkJ6mDV3g+INmmcjJX{ab9GnIz zPaD8xQK!{Z6`SkogEOPa zDMWp9OVj)|71H``N(1~hrDz((bu=o&<{hJ&cZ_P@{YImCC+4&*CGa*GZOamJ+m^sc z+j6qny~4I70Bt)ww{11fZ96{}lRqo5D)1pdZeEHro0sM3=FN!X2?;4h=&wqRktGb@QsQ*}Mu-&8ul{-jLSKs{w9aMN{+E)2n1? zq&tP&crgw?;<@%l(X^0XG?mdF21b8vYrtrpLNG>T2w&k?iDn~Bml-L?<;0GP#PVvH z(gxE21-w@3D0&*`lrKA&x*6{#yi)ai&anz~uv#X>DQxmN%Ct2sjA+r3kne12$?AF5NxGO{WqAT>F4YGghpP<<9>iLz$|m*WiTaCjxrMtJ;D+QeIsXCJ%jIiclRv9<|xen(l>E)Du zHWYBOM$?c@2;ON%TrtWTCjU6nYC71#h|gUh5U=-BBRc|8iBz3mE}q*6biSLDg*R++ zIEjqpb)?L8SxpC|_R6Vm?1>b6e=ss3Ahml~d7KG>&bN(BIN9GQnYIjFDwBP?t;CAG zQl~}Qlx&^%4O61DSSae>e1>ZWjbF5V-_iC~7U7Ee5?DxyVK|nzI zbz>0p%KC9u@<_t-YMWD+?-LGa0`gp%1UmN{su6(7PUcqjSXJ3$l?(Rg?Qq@Xb{BH& zdt)d^J!lC?e`4rMfU_XKatY5X0E?Sy6o3Gu0B!2?cr5ciqXYzGH$C1cdX&mNs()aC z673%Zg*>c|~Ax2XGOf6}?OmVw6D@fn}~YiqInunP4Rs zC%~L^m#W1J1)RTOsJRy?Q3Rl+@IgjBEUs2Kny%PEGX{)F`8!CPiQR`NP5=b71x>95 zOeV&U4FQv7-9!kOLb#~`0T9rUD`1CQ#vSBJ2xvGb7e7Z{Fwt6rACqmJWVKhM)qBFL zF*)xDYnLML)P3X`ldP`H9;kry|Df#41EVO?w`Z!uM0a)Z0KD&eSJxA~byZMz*IoDLitByh_dah`S5?m> zyMFUWPt{Xz)m!)RbXE1ioC~ClKESKe+c-|8mtMpcWp}gYRCc_zWG5)|M~)Ca;Tw8T zpYzoo@D*0$8{abJPsQa5p)gdIIg2KeQ4t*(xEhD;j#7HNu7WnM1_?uEK!u#sv13RF z4YToFOW7Kxr;B6$k1GUA82D%sGQMF69VkalNV|q+oai1CTF5-sF;jGm2iy!AMnl~a zsw2)0x*TwsWhm6c@m%hhzj9<~rqbDXpo?Oz-bwV%@vW#jCn_9|RFjQtgJZ^tIFnvj z!u0M%LdIdD;{)cXgO2}E*#k9P_?%-Ogg43=MuJnlKwh z>@Yz-FiOzkZD-L}9x_UtO2-N}?I_aIy1J6Egozm81UK9<4|B}j9CM{(u9Aay5q%E8 zJ5Un~yiEyH2y@gy=fe_52yA-j;dJSb7U^O|CytjRMvEQ?HurP{U^XGLgATE;Bh=3^ zV}==qJ|N!K@?>pp4AnyPJ=u%VxCgEzEBZ2J70u{=LNod@Ek+k@Tt&8ly@l7p1_Ihb zfDHs(9Rh41V0j3zfq-k`@(-iM*?T7`ue;E+cJElMGA0_QQ2$gmD3%zQr0ZLDC7jkr zm9eHn0E?zW>92F5xM?c=Z|WM0b#J5=T$Vjd{%%*%ryuPp>Oi!cBl_8{qWh@pSacdf zjfpJr&SlwmC=)slT3VbPMYcslX$Mc2SkvJoQBD#!u!I~xM${)qQb$!n-}=FSb_My$ z9wAQ|Lmd5dxqOT`bmvtZ_6!|19mWpB&gifQA?!p+_DB*bX{6UriR@9b$5^p{J< z(1WvpQXl5d_42H-B3-u{L5oJ(mNQ6alFGar1VqT5I`-AK8a zXua8@4TptjYI~drE)(*>>@XPOYX}`UQ=~W@A~TzA;ih4-v4Qe4HtUF2I@7FR;O`rcru+_mOFkOMQ6R0qhwSx`y~UVrmECp|wYh6a zD9nMI$((BBDBVMHIt$)IFq|)U0lX6rm{ibgRT=n$5xg5R8}LvreW&Rll%IR8OKwkc zN~v7C&%#qJdcQ^IhQYKxYQd`v_?QJBGT`GD#Bp*?NaIUXm0O>NOHM`b(@DH~lk~RrlQJOXSSZ<_K%JzQExNA}eZ_*u8gP>Z z&okg=NB@QpRVDDMm47bk@|tzo8oIQ;Zo!`n_=W}Rr<*ua=NG1A%=B0;Ov<|!o@s^u zV$oKMzGu;O7JZ-4U=!KH=43k*nyD8BZ#zzZ4ZY z2)R+W)_u5$)zSof4Z6Nqa1@C(R#6Rzaq%`TrCy*cF}PQ(k!B!?SmP1=oJ0Aahy{y` zaBNU{EV#s4m#w4F8|RZ}>byD^5ALjhECKzO-R`(`DIqrol-nO1xAIbQV?epx;kYFa zE2=CaXU3E>x{Xj}vQuRza%D)l-sZX{Dih?&5WB`c=#ear1*>Psul5i-=eQHR3#s8w zkfXrZBL?I2G4`CnI6TJQGZ-h0vDlGecpT?E485W1d~1)y7{Q9s#VBxp;~7a(J@Q6l zLZ_-Q^q6Jw;GVM2j{N(0LMu8)DGVapQbHEvD2x?r3qYRjK#_tsa+*vbnV-fyf->Hib|a>9a{D|d05-8Hdw;; zx@Fs7AJMNqSjj;5WnZvBLvSbCdo248+j|CA(#XBG@mLzP%7SN(ls)#QCGOiK6LvHo zky(wjw{z*)r$nD0z^O>^wGBjR{=#xuIK{* zx5*Fp7OB~YkIFj^`g%-35Q@U!lc!`}Y%FErjg*B=Lx@=`izP(kOq#;9oaoU+D6u^; zl+dPQ2x%;(31R1A(O5?R>FK8)**HrcIZ2$7<0i5_UY6MP778jRf_EtzAzS_(RJy>= z0KRb~egaT-wDs~MfZh)91Asjp;ClcwG{BdLl?X!SJ0e6A(l=infS6F)17v{Mz^6o0 zGnH%0mlT+&ZuuI2jh|BgN=ax8P>)38sr=`)d_|6wUDVeX#fUG9(GC=vA~$a*ID5cu z%Jl_eu>M$>qK4sLloP9 z1Qw(+yEitW=O2AD@o^NWjPECsa{j)e_=v5ALJLR;QW4cb=RTCh`%ow}pd^bci=iW-Pb!j~V;|J_j|EF+ z%7y!hT6%YW(SFnc#oCc9SCZEj=zPBy=_I8nuS9W{cC(fxD=I6HjE4$@M-wj*YdW4} z%1aa3+4LVPEzX|6|0UTu{4a9N?L;+86`zDDafOk~o}}H1BW~G~8EzaynVald)it=h zC$)8IS7q6`aM6)2&7MNG{;?0nCcDLgzt4<$3o5(G-EJ3kJClXXS*l`XPJ8~KS0Ikb zFCfv3%2-{UZI$2cFLsKbDu)~(>XN9w)!V&6@f1xqDoEqk@wSC6X}RD4;pe^~N6~Z` zh2HY5HKJ*XrZZ`Q*@6b8jc9Dzh=!<*Xr$VR1}vJ+fH%~CZA8V_Mr535^3b->=tNVF z&1jK25}q{{Sz{+Qa=<7T9U8J)Yepm2A(UDHRCA4Xwz6GdY(~PforY6XC`Z_mP-Y}J z+ew*`;?RsFXFJK22Z|Yoa^=u6T;SS_XoT|I#xxF<8gJBUpfY1VHS|qfe)tOQA?AoE z{uIR#?z3=U6pex9`rn9N@o(hj--y&M5K5;bFC75|yW-VDnUm1YWKL(hXhim$EV>Jd zz{X7?wJ&^_ujwjFSL-#Xr%D(0-^#Tcxh|r2*m32i_t<(EJ4g&5-EG@i`;#rFZM&ZZ+bi031=}(QE6J^F%WB*3-!?QLqs%c6WtmR( znTqw>c-vWz)eiucS)BPXk~IK>W+!XDm6cOOt@t)BZ+uN8cTfRUsI()~jS6MaD!z-i zJ+`hc2`uu~>btm%-z{p`A-K>{Lk=Te7s+h5&0QyMVJoHPV8CBoJ;0F~0V38OAsQ3Sr z9|ORVQ%pbT7{DQ8ugZqla3==rY+`^0XJYUp$3V7Dq2oIr-y@PqxJGVP`BCX;ghQr# z`2L*5#yC3I89L-AQ^a1qGbcpyj%OV1QM{j2r~}}TsSiVCvHhJ;*_lF>mmDG{)?~&- z0_AzlWciOnMB^@XVGsfd(WoG!M4TOXFN);@61JmUEz324dWPF*EcT%I{wsH7H#errZ9EZeI6NhLP z!dGyn69@9aaezZ@n0#0|io-8X957^}{Op#-Pcir~RrDI4 zYj8be0oU>0g5H;PQ19CbjW;fPO&9&-rWJHk8k+~p;%Q-G22TqUv(Gfjz_rswbrsKv zpK%f+RAPWr_UmqtrCx=U-tfW$_x42AL~f{xw8je(qw#{o0Cy9^Iw&#nv1wG@dDr<< z(;~ahLu-W$O?uZkS$WsF{B)YAqG3+=p`Ps3BI?IudJ(xX0)T%oO&@)Fg&6He;S{{> zKDfK%|Plj8~1aDkh?7nY71Zh{+bS4_!le2P_kia9=MxJBXvz+Wv7 zK9_FNgE{!gi9j(&U=RmrZnc4}qZkx(3@R`YG-FqZ{O}=BKL%JtGk|(ONtG{B2!JDB zt0<9Mr;2nVaC;n_rMew!+af#jz}AyGJ6rQhRi(qUI8p~n`j$doFh8PC&-5^KVDSP$LK1K zr%ge7ky)OI$6q+QT#UzhJYJ)Rpip|u7QJQn*@TqhF=4jo++FXaz_dtD`87gw zoi~oB72Y>;_u1me+%k$$qspE%9qGpW&7DosZj1S04;}8dz~nuA9jhkt<5kzq4il6a zGr~}aBe9#pF^39qn)%3YW{W8!&@Mv|EhIFfUWR5~6X`&@$c5*N?(+T<#PNkZ(N#8& zo2w{*zy;C(T%ITez~zZ*0JuC+H2{|1v!Ez!h7X4peyhb&9(3|s2Q%!#HSTyZ=&L(Z<4^?2>Z>LBm9mY zL0bbgg3o2Ra#&Eul9AMZ++GOYG3mlU%h^{uP;?@ ztU5_FjHNsS=Z3trgc{`{a>)Wjxgi5AK$KgpeC5xy=p%Zq{A8l3>SX+RVyzxJTJ8aB zU&VBdUnh#kw?n4UE&vo^G|(uShL<5A)8xjJMO~aWjDwu};N5ayllmPmOiXjE%KDUdC{vR|3{~?DcFRXF| zq@e1LPL=PTDt1qzuZoa@T?LbZ6Xy{r*o_=DZ&qoI=!Z4khTc;f(X(nJdR=WqkF1U8 ztu5%wC zu$K7iCbzyKQo~u7;{A~0A;IUs$bAdT4Zjh-=qB2pxTR(nNaYcKfFi^nhZG_Hy2&fg z^18>n$qk!mk1E^^9i=Rq_v4_-W>L?s7k$dr@_y{5dB1KlKEfM7fzqGf_R6irWSnA< zYJ7;BVl9UsB>E%vMEk+os;$KP!MaIXiTH!nKUfJ9^9Sn!Z3Xp*yfVC;vgq|*r2zFu zA7-8P8ZB?(6e0U6uep-Cz)HD>TpN`~y~ag8n;?}%2U#UI@95Q!0T!9Y1Msh>ez9j{ z8V@+a{8h=}uZ!xzz)eoGkej)vXlCA;K zk#gh7q)P#&IMe~aEd$6>E(6HU6skOSk(elVeoJ&s@H}<0d}NW!`!VS9egG`*hc41C zm*_@o@Ljcv@7ifGE)ZKo*^t>S5@mRb(0;XQ-3;8Yez1hgvV7LBR;`=SDO=@rN;%Dm zK(@V0%H^wXQXbJ0`&L`M(nhl%Xlq$Q+LEUewZ~G1 z+Jh}Z?bR#YzzwwrOGmovm2M0)R(E&#~Wu`vIVJ*y-UqETsK3zR2L3_S1Ni!8Pp%T&FEU`^ojEg-qGqr)dW4FQ;kB zFW$hdR(4-X6)3Z`Fj2hJap}JXl_=npO}cAjsgyGk@DRN{vD8FT(|;N-NR-A45(V5% z6zc%}ch%A`QP-eW*h?ouYlRF=n*JlJqW>OS>e7Eb6bXWfM1*SSAwPegND$x=s;`G4 zL4ey24zN^6g4{us(~>MbRrr{lM8c;H;6yuC0go_yJvscbz%8%FQZBEC8IG-`uo>wXm5&?xSiIut*{Ik(s}edf*Z2u8%5E4$<5P%~D~leLE+PlqdXFq!O40 z6Loh`D^Yib-vSuskG!N+Opz;u=vsw&awG!%_EllI^7>LJY zJOVt9#p4`2ZpGsoJj8kQ*ap)F^yr6KPLx%{EF_B5$UmGbcBVOOuioDN@|g2PC3U3> z&lAaCMcn2Oe;b&W(wLYx11+- zQ!5Vb2~|53>@D{=pV-9a^TnyT0ff^gc5q2VQSE>~Ls6Ya(T*unswg&x`V0OEMMN#2 z^=3flb{6!e&SZ~N(?4+B;3awxy)cA=X?~DeA*KE7Fzw-x#*PnZ$6TIkb#)^zL`f@{ zu=7bHF24&aUCBvbc@`VgkSEKo>8vlyFBBu=-R15VikfjWAeGe~O^ga{lkFZW$!;T6?$y&@ zlAX4?)rC&ZHy6K@S6(P4%pk^&64f-1qEMC)+5IWN{>bU>!#lH?uNBV{Ba2VNw4R*$4%xUrFtE+xAX{S}Kf1f%6q z7m0>_3?Hb%bqK_EXpdx(&iTrs>>^T5TafxDJH>+ev*hC!iHx{tmfU)gs2RZziIrw5RK8acvAscpJvLW{%9i|`#rZTpPQX=>) zO;e1rwyfzS%CFA+?847-(G(|#mVp$KUeXV;#=&e{OnzFBdeI~xJA#e8!Duua&w#*4 zHu8q2+>RDTJ<|d2Y*Exkjqbw6#gs=a!>n;Q8U6umo$JX{&Oz1O~g&bQ3)r-G~Fag8zIbFa|0DgAqkw4AcY$ zB?klsS((5fD+mm-GJ!!>5Ex`-0)wm|Fv!XT23bL1AoC2{pe&kg7{mm|Kwv(-UytQ& zUjiOsGzKxFF-S2QDkME^M@bkR%A$1)W=5k5SY&!LSe|tyE#`qo7>vQpVB~I+f8SeP!rM?``HA@HDph7oSZK8&(?b?`#e70ZUTD&PQ~GeSc~0z z3b~Ii4o9%z`pf7%fEBCM(w=AX?0nC**!d7^vH1=w;#M4f%$6)U%udYb*KEoRK9uBjpXJ$5T1}!gq<2hb56bED1kl3sw44wxtCcO2ZOsa7(PzDY4QHzG7R) z*-{#Q#THulE4JBf@~o>xvOC9EkEQQZI;j*t(4{EXUoGm7gpW*RI1`19rZ?wc0<)AV zX7+SjI|=_SaQ8dp=vwUsT5L1hJ4eXY<+vdYQBu7ohM}-~bYP4~?Z7+>DnWG>&5kri zs&=Hg6EBqBr92`o{YKG{L1^YiEm$HSWEdgi*U*hxjJx;Gavab*n;W%&_@B|+q0G!k zx6C*lr!)65aafxsS~?kkUUMAa-a%{e9{=q+tr2ozXD|9q$`SIzuZYgsmJ(&*hbc95 zY=tPYcjiSweZy7=rs@4(Xs!@x&L|bl_O96)A@}Iw>2FoCc?fw11jd_;Pj>PA3YE2k zbTI=`N-*w-aA#m~DtmvK6`WeS^v`CV1mvu0GK%Lq%v?P zr5fE{MDJ(xJv9Id)*+C z2Lg$(g8=-qP$D&v&W`avJL=fyPtMeH6sJ!vyj~2KH@)Xo9*({`=yIGLlmWDt6vo|- z6hKEw8KshfH4Bo`eYF^sqf5XVBDD^#L0?BTfPw-97`aiLy}2(iupHubVfbZr0Eu8H zgq)$yPJJCaM_;?Z@Ws*r+&)x;F97oeZg#yHu4h{D%#iT2?pSUGSo(&l03?F@qN=ne z7XB*KG@Nt;F{;?P|M6B80IO;U_qk$-kn4xg27@8w7^#W?@~<5N7K}!a;mt|#^%3=* z;dN(_pxf)ByS4!q+&RQyO+;9jtxc!cv)`t?TecXi3g;}awMWS)21IWrhs8AVT~&p= z<_6)H&&6`8R1HtN$}Tt2T@#QE&cJA`=Zw1w`T5N>*Mmdker%Rp>5S_DOuNRMIAH!^ ziz;;sY|RIBy?}%%ELc+6zZp@QgAWZW1*X|*bCeF7fg_N0I&3SU!v(CfD&It`bF5rzRIyfLEI9RxI2t&lAKbStyhRDDICqxE#%aslgfC&(mNPx6> z$Q1<}oe;5{2#%d#Q_KKw$I>AJFd@Q{nG(hiOOW7MCo~35azbN(w`u9nCgj}U;B14# zLMGtdSzAu{&(dq)q(cT^ zLT1+uaMhg)09%i+-imZC020Ad?P=PBS7*UTjw(nSRUFngjw%2~m1rK#r1paNt}=6r z7+SBlb@Gx$P24py5X|!dxsut18$6vgH#K>~vxW>bNRE&XR)mLUpxI%9YUQj@6Udlv zhaS}2TYDHGhLMZ*fhk!ig$YGy#=shyNBy^*o$i6(eaTbg1n_SFxH~%!1mN!MJOF^Z zvvYp{?#|Br07Q0n9s$JN*?90EDHs2e6hBm*PI&`8dFXTV3 zWgMe>**hEXBTNS}QnVc=PP1_R>iU71d5dl~U+MYO>_aoL{ zTX>N7L<*Neup1QXeX1kTtzV;QYDGfRln{;tw|8Fm7n-k#=7a6lL>$^(zmAqa)8w=3 zL}t{qNUYSM-O_L`VZP4y=~ajd4+nm82e;!_ANXzO7;kUo7nz89vI}-l zPAW{@SEQ(E8Oh)rZw}K1I>+0}|0UV8_@Ahfc4D9XEjv=83uBi(Te}?|am${=u-c_p zURCbw(mNL}l!J(MY4$v_@j2d#SkO9K?s~iEv2!cMy|TjY)>EhV=?L$tf<%dC)F#@k z_pH45b}=D|iWgzd_g2igtc%6y)+l1mcOcy^b3Tu{$<9r9cF~;qBnm?l)B9K>+MeE_ zhZduaXieIPmZptph1!S~N;~w3di z;iAZNU?>Hx8Le0}oess*og~cw+zcS3ve~RTZX_+lk+#r`#L>RJ>N~}ZNnArTSI(ub z%}^N1bIXkK;!tCG@kxpoXWfe7L0*UCi~}RzEv$I)Ns1STR30x5D8h?#ND*FqlG?{N zN$ulfMa>%mEi2IoJYY4Ayk24_Uk;FB~BPO%3KPFAMD z$qE{rtW1NG6*M?mnFc2-XmGMJ4Ng|j;K(aOQ7en4sP|zSd;qY5BfJ139QZ!Wf$yU@ za21T^z>(`lfwE`?`zj6`SY&>`?=^Q51r9huf$ys}@c}p4%tCI?qSl!`1pDzGf-%4% z3INpme?ceap56r<*~GUW?ptsp>!st)V3LF5o+sPm9EzcE=67&LHW!_v$5V8*()2sl>7u{==M^EU&Q-nS_NGS(yHt@mHk@AC-a`g08`N2v#O(dW^eIFI}9S_h3 zK9({Y_+X1{;5%6925vU+!P1fLgITw{>b`Jq+Z0v1UcHYf-?a}?o8`%zyF+h^+RO&r z9?WGacZVJiR@)Po8m3ckX4Ciu2G`7}#?LpnW=4VQ$VYbQ@xk0F&cR$Z50;DX4-e+9 zyg%H3c<=p`d)*$Uoy$B`b$8|+q7nm~@?LjuEae`|<>7XF;t~@%ofwT5Bu3)}i2?2= zCOnwSi8;hc%pr;uJw&mh^aoay1qRC_9&oqf9jbP&VHObCQv^Vr#C<=%OM+8`fIC!e zp95}B;z_VE|{qCZrV{!QTYMyceDKUt= z<4LNVa0u?9r9;TcP3K%106b&1I>M%Ni5B>A^Zn}S^2r~mY4V>hH*KdI0;bE#pTv&p zZ!o>7q>s9t_PE<*XQT70rj(oqe6;%TLo@ z)6!?C_6(s%{BSw+89G3FJb?4@Sd7OCJRZg4HayaQq(>(_zJzs$KZ?#Fm4fMro@Q$* z4m6>m<9)5oQ1V(Co3~J923D z1OP6zG8=$PtsD=)rB;pu;8H8I07R&j1wdSCWi9~s(Coey%R<5P| zruFPq{O7eCMUJ3S@(#_;fuBLmaBc2Qm(l4%vuvmLcO4y?JrUl1l`rSetbFV_kr?=E zRJmtn=l^O|?wQ$>ezh<6%xv~o`?6AZBV|1R!Q= z4j-ItkC|FQd$TA6X0GDCY(O0rj3qb zph`Mqp#DH!DF(<)$J5@_lSYon=DE{bb8|#CkD8KWUl5&lHktJ6s*pbO+WZ3D;byY) z*Ll^o565LsHW~lxysA1#NpViL(yQY#Y|!jn*?I6V$`~}fLV8V|qXnIoEUzs8b=un5 zQ0kncJs+c7Wx3|&D$6xFS6QyvIcUi%S#^$<={dNzQ$&iNgCnZFEnh{@RhBD;uA-_U zpP^Ift}M@9K+)oDu3clnS77G4T4qij^Ac_G?j{$$L?4nxn+Fr8x};NO+e<{qp}UF@ zaz`^E*Xddiax(rheNSax0RuOaJZbXl7;8iqt+_39tlEf9R~ykGYa=>qZA3?|*)i@1 z)v;IZ+t`?E;ci47s73Fq894OJIufT?oWHJ)H! zGbmTfxUrjN+-54qjsJXR+-54qjS7J&YtxnSdx2I`Y z%4O-;nL?G~jqo%rPhcm@nQyq<9D^=52f%W3=pgNKc#c{Q&ruB3n{RY*niifS+}s?s z6b5d%IaoScgw9d)7`kMu{6wXk=0%{#&U}*y9-OAFf>eZzJ5gx^Zpb)TI?{Hc(uPjo zYCB13qe&LDW!@4syYRu`LcW>(8F~)32t9X_iVbi>&%x4BY)(?K!MI~%b29IxiJz=0 z;Ja^yhigaW69BweaH+eK72CzZnZva#rZBJbuZ@{ayM-pvKOH@E?F1zVD^8BXgI zMGF9n&;qBZL$$yotlcS03)FLnhD2j2O$*3_-gOVvp333(z!W7CJ^*#b^@Et)_%7WK z_OWw+*{Mnkge*}8TX;X1eC#i-mU$`_nEgbw%#&lb5ZeMgLd4BeL>zF-NwJheZt%p` zX4`z#9BCOu&9Ms8oyZU{U;YcKfJe^H&R2~OxZ&Vn>8SC|SB(!-D62cGbZ3=rxJ7hl z<>sxV8+e3z%d+l49F`%KVCzUZea4Y4&8)yA(F{2YxM@@YizrW%+2^|nw^Z~UjIw+76oZRx>g8eG6t zRX)Cz&Opy~HtPlIJTPPoh+7BeJRoHNIx zKK|;kI}8aq%&9|~OwF$~A;%7ykmKlR5{@IH&6vD|o@vS<|M_e`YTp{CF-wK{gtV|&U#D9BBWW}8o$^Ym#~p)e_0C>BATeGm9;Fz zZbiKYy~GM%%Er?naTyzlh%alooQ-Dyy@HK=eDg{+@|n%6EZW9K4&iDxvbW_{_L|U` zD{GOVxvb?{E4+e@ta+tHuVW)?Ud2Y%e7!|ivynC5z(&@*#>(Dkjcdu6(|L816~5U@ zoXJMcD+)5q*A|OX=pnkyqRke~v61R+SxYM$soIvcoMnu;mfy0OYH(T0*#>So#~RPI z0_R!ud~3YG3S4N>i>&ct7@JWu!X-YNK?Begk_9c4$Uvhh`LaXhvy< zW|U!=NR(V?ZWeO;r=qMkN=VCwM{JQ%me^RNhz-s?MQosrg$#xRqrF*J5gUsXu>q+( zVgpcw*x-;N#Ks~fHui>tzrFB?EpW5`Ru;{4z!DsaTkiGVB8tY96YArOnADK_d@L&4 z9=|os2ASPVBMd`b|4=R#X-P%O?d->D2g2%KPu*nZhsX{a;1Nn=F;g0g6{W#}gp+dQu%R@RMN=9})V3jD zk(tdBIc1wj9SS@`VF1W1%liyFK$D^D`VnwhK3( zCO4DbB=@_`+|H;`@sJ`Xd?9+xfnumiqd3@Kp99HMPu3SZ@sT*^9{y-`LG_^uHy?OrK1j z#-A}`qu!*Qkd;s}lT<>tw=eVyh2%dGK9p#eNQ`!+;#s8f`jUu4h^rM&qR>rV`6cb2 znfjTiln;C)a=W(d`V}=}^3Y8l`;{oJ=|d&#e@2nZG-MjW zWFU+hc9+ZN#Jh=0J%w!hN_3Xbea6QB@;gX?%>#*;A-8QDx(n zt_BGnP<3zMz?f%+gMxp#dJNyQX=ifJKB1lDhu;z#2H(M(PA{}nZb^If3jYqc9$+p}l+q>g${(oP zLE0nTFaZA`8p3>KqOQ?5!5w!WfV@-N{rj zTf~mKLR{i(jk-j!E0-vCh5o>gSPI}m9e-kSF>n~Hwdj3<(`u=EH_Idzr zXR6)u#8$Vs%jNKIMQWJiiuF#|!W@`qy~fk(pG4|t$8~x8o@n@OFDx2;+k>xlVOjaJ zNQuj7`bC!piGcpoha*Rw&U(>X2EwS+I(lh=c#!76H!KUFg~8B z`ZYLZa$(zJpR9u0-X5YEh%So*s1r?RcTqLL;{WZ=fXfT-47gm~8K5r+(1*Z75O)ED zX1WW2%=WZDn}=wKPy1i4Py2I(2kAUfr~Q?aI_7}90$-$& z6Mv#f16g}ipmv+??<(&8s(?AY41Migws!T>hXRkVTL3aM^7=UjPYq+pepWj%M7uE= z(Z(6Ed`EA%9Nx{VJ{*q0IwubR6yyPeOF|9o=ZQQGZXP@_XZaIehQDDGZ&M>dn;Hq| z4b>c1ImBJy)yayk2Edh zZG~5>PLTgpCm3I@D*AF&(f1Kvjl3f1(WeN7*QvbQiB|n`RnyUtWfq6(Ve6=-FIVg{ zx;RszuHgzLzY<>R_&xKkT!0|mK4>)pD5y;gE(rCrpMi*_uJ7nMjW(&OFR)1UmGb9m zs=mO3=bVumK!HLA7ljJh&nQPB`edWH_D^vlkPz5xwmQz^PK?#m^f?J^q2zaI`3=X!A3TTCTH-U+y9R^p* z2{f+M^6XNLhRnR^fo-LnNuyzWrQBHRMTD4!F+y9&b*2*p$hUCFbYKv1?ZDvV+JTwT z303G}4}qCs50)T6j_6?zKqj3x=CRZ=C*J`0?T>jJz_Kte*(ZmuE8EKP27lIh`LNms^mCl&Q<{=v5F>j?F^EkqK%wuc^lEURTYRpq+9`mkK zHSIc8(`J=;HOr5uiUt-g_{y0iT&F4;a69I~)=@>fPW1$+NT#P>rG~tZOS}sJxtEyYR7Xe`B%47q!oe1}BOCxX*-y-o zpOoul%P-358YFv9b7-w_9M;@Ma{zMSdz#}na6PC%lQ!#(8&st@qQdKXd}XOS1eUo& zVCTpX$ejWYfwWdovq1}$6+)d2q=rBU2OFHcxj_wq!0iwSn@)UW2)scp0{BlY0_5K+ zyl&F}N%S?Q9=y3ezD8C3HJr*S@W_$cutr{*q#+r2@Uj!1HL4{5w__q~9kqltswJR5 zG*$3MHE4A2*3Os+!Qk(XMgRr%k3lmgvLAO$L^o@+tyS9YtMt0kRCBEw2_X?2=!}E_ z3e+%YMnd-Ej)ds8jhdU3n&xDCBOxS%l+&tiQX?U7I});#I}+Zk3h8E56{l2(BOwNc z;2S5CZdSzt+>V5>byO@jt718mL`(|KR6PT*NL@HnK2h)0?*u&9=A;2YDsSowEYlK> zAE(P-h!BpS&aBLk(-H7?dN&zTF#vkEPsNw&3-1WiI( zR6>A764Js6*&TRfPY8g_k$EX$(4>U@j8qC`w=aahQzDoIYXQG>1_jnZqRvo>f<&;$ zNz@rCQH(RArxUe|1WlrrsYC&bBx;#T6!6GtF#wr)d5L1sB#Ql9qZ5_=R`|t@zi{!$ z$G;Wz@h9ZFgo!&(l0SVb1{QD9g3qM96ROHy`HUT_wrnU@IIe!f(j7 z@>tLlU@H4t#k#=~-nZBd_btj{wH~dz&nD+g=Sx=-ch@f^n$IFJzR{Ark%4ZsBmpwe zjh5%Ifo`X2`=#EZkV{WA0gb-Xtu6CE|cYs0l!3I=p0 z;*<7s9}#&Fnay%MXM7dS-H9r{-9t?DDIRtTGq4ztfJ@4-#dayexJ zp?K>+{YXn#f@T$9C^3o05M3jZrL7z@H025Cos^fXCkUt(1ugjq}29Fd(5wHoCW#%}+0x-cU zQ5`Jmv`IcJ!J7qPD;bsiT(h$2^eamwES-L|ks!8PepUiD@no6akkQEpVB)Dnb=YWW zK^?trACmEEbHfY5g}Vuth28W6FySgu9WENKNk1&Xz6D_`8S;j5g(a8D>hvq8NLV`k zgweoO5Eft)PnM||Z_^LJ#8ZjV6Kc_!1ho*QY#9dxZBgMSJQf=2ga^Qc2Mg6zc||Yp zRBEnWdwUJ?`@hn@ra`^EJ>n@jueaB0_{#iUNQ=ls@_QJW!fd$(#_E<^)!!fRXO0Qpid|O1Yq|CQ)qTCweA_U1cDNb#R~ z6yHdI{||Z%l)Xr07J%%-{Q(IHfC9C>3Jk z4e_?e7W+BGGfP(mpp>AsG@J|}Ev4DZ$R$bNwm+GU7ZnAskpI#~+Ot)rZvLSc7yFVW zIC%htyAPR?ohmyGJ`~?AVDG^mP=y|kof&Z;e|EE_yER9ji{zxDDNvRe4)P&wj3 zKgw6ysa6ylL__&}b;^+Q{>pfgGYtvN()9#oGzGXtw6&ZzAjzedm)G~7)@z4IO2`{! zpDtbmLN?CrPC+;MVWXGX(IyXHBsht3gbP|{E)_>%?zX+MrmpXQO_69uJ*;iJV(AY3 z3*w^-Kar`bP+cKXS>jo`h#`qLj`c~mle}%uzr!*C~&jsM_KePDp-Oc=Kfxl5qcH* zCQZeao1O%$Q|HC_&*$@E>(qHMM$~z+b$V|VB?o(}$jW=G$cnvHWaYh8WX0Ypvhv<4 zvSM!)S$S_2S!r(-UFL={vRI{1S@ce*+xWcLAYlF}*fjQIWaW7^sA+Jx0#2>gl^8j0LxTB!m(UA63uceMe zT?S6$C~7cTG2N7-OM5*p94i2(vNYbXgxogItBKzJhidmDg%L)(@| zYI1N3ep6#3&w)?N92JQG%GS(Z>^A9NM z3sfwhgr1E_0%*$!3hYTac{DMz-Nt#H#KTFM9_I~=kC%In^Ue^>Rr0ZMo-caU$gShN z5#xp-dODmZ5YAWtIvfE0UprCNn;l6Q3+`Pb58lli*lV|tgaV4o9Lln1t7vFIUbmZf zrs#HxtQ$`eFLo3@4uxGEg^$Ze$9VO{jMvr33&&H$$H{xfd#mCP$|)1Pk>j7Ow()%o z-d_Wt;|suFLvs?|2^xtq%f2t4oZt2%rF(j{d~y$O#P}1P;2%NoO-}Ft z{8fnfFVs;*BF?fca>$+(@zHYnp57VpX8HP_Uaw>l0i36@`eB5)yh@hr<@r5pPqBH# z4*NK&9+o#wAi|mPDZq6%^RT?~cuFDg%t(3JUf!WHy*J%?-z+EW?e!ALYI)q=R9||* zi>@yZLFo`DYykdkMO0s+?~Pp=|4m+|k+g z02IHFl<)21`D2DV*~ShZJ535e4}b4`u8QS8lVkR!(itk}?CTwxyN4vzK&7|sF|dXb z7GAdvAb8qIKLc+18F&K{I-(3L2S69mB8M2@OZ}-sH^7#v*hG_8Eb-bZck>x7HQrVILAgoNt_!3ZSi|k^25En{lt+;Id~$K<_S(| z-j9r!=j8JJa^v1!bur_oCFP2VR9^88L)XD3IzX(zJjsO$+GK zyjP$!bC|YAGJpX$0{}!afB`oH7`W8Q00!I)V8G1)258jlWio(~jZXar;J-jK+kNTX zGP^$PRO-7`HUPIbd%+gT1`FtHuz=2nyO9kwZM|2VC@qxDiw_{+i37aOCHhXP_4336yq)9gf@F*r6Ot^4{G_$q>!UbsK zMoxO;2K*_)g<=T8B@#nLxV(KzM}!O165;Yc^;*KEL*1Q9ia3rE`!F8iO_wrq_{a)gA7DpHgwJhzidCS3k&ibOLiq9R-h;?oY{ z^3tgt5H69pl(rWa5H7zaE)l|oTTAmRk_eXv+rC>h?(QXLctWgK#0&iq@sdOviV!b< z;)9v;o@rjU1ROUFVfJOlvt-un%X8NFXKO@BX@Qqv6wUCi*cX(tXksR1lQnKuMp=8f zxAa7&W?p23shJn7@p%}V5rL3dVRJ%_)({MFNNRJ)xIomdg`QQ63;S1$3lbAjD-Mi= zSy(YH&nm_RQhAIEpa|o_Aw?LMXVtkiIJC#O05{8eWzmcaEWvGQYW$i}q-dOaYkmA# zMXvCl&*aLpid|WtW2(u732z8nOq?&$Q9(1 zVLFsW6ARBNas^m>*=sjG?h$i{yp{bZ%Hc=f-B0 z8?VA=U&`q4oEHObZUBhn1_N$xFwm)%N=(-e2Hf0Wz|9Q?lC`nDOl~leK_I$<0I2il z;Jk**Yq8u8kki%URh1#YE#(PYBttBqGsFTqLtf4Lp>%|eZa^g%{FOG#CU4vgk zKJ4X0@HIL7I4@Pq_-|_E#+kHU>@VM&>8%pWYvmcocq95AJkR=n9sW;n`~&b0^klaa zX~n>+4K%JeMa1_sN$ zW)X?CTyCA^jU0O;gms$Ugzq~X-vIpKSe+gp$#oXIUmkcIQw>XxBL-{sJo(jeo}YZf zSxLQx@RrPz1CA#q=sYKy>`+-pnsw>ECCg4EmN0ibv4q|0*^ztdkM% z%Jp-J`eJ-b57036 zFDj<~MP}-gaEdVXFN(ImJW`hf9%1P@;G;6LB7`)9nQ;7r&9L;a&_b1NIf;H(6f;OO zuEP>x=>cSp^WQ9B>ERGz>0e-$eiz_|rDxwgLzW&k!_s52YG{fFD z?4Y>-R;_n~Jg>NbseyM??soNV{%ZQ=bAT@atS2D2YASs(Y9&3eAA+ui)dBwt0)KLR)FI5r9pImkc-8?v0q~py z&{6oJWq)>n?;-J$18fKIiUY*xOleW>O+q5c><09$e3U*)TeR$tj_+!Sy$7)~ojghb zeLspWdztL%?eVh2;7Vd@f1-G#vsch2^&D{sT{V(oBoFp7R~RIhv0(4b$;`S-Nr_WZI_b4(3|_wh8|n?A}Ll|Q?N&Z z<;qJr#wC=fboMHx7aofpVA(q=!bw`}vve6dB7Hh}08H}U)zaAXl0$Y>{23bSDQY^gf&FPq$o*_e4)0kMYo&hr4zvO{ z$L3CpEfCFL%gsw@7J!PYbMh+2KP$i=V!V#79E-|#8iH`XD3Je@Uv?TUJl|SldjNG);OS>@}L!X|Yvh0rb!G5SAMEzV);O7G6Cx^z8y_(|24WdUR zc55joc-K$k0P6p6PdQqWl177QM;audkw#16_$1LDqA{wcEJ}B-l5Z~cD&4fy(+46b zEjctR<+r%9c<>I9c#Tnh46qHn!ucBIXvWr^TD%$#?^M$<(08w#m^BD)LO z8fkl58THlGRF)V<36+mGdo{a6Jp1$ir)P|s?R%d6zdd6NhUd;_dJQ>K(e-!}88y&* z0|*BSMI5)2-q!!E6{EDu1vNuZ+bQL!14OqZy50!;`GI0Tx1Q?V3C*q6_@Om^ z#Ktoye_Jr=(6WDJ<8msa7Nk+5f48zom`49$QOq4Q`Y9XL_X{!U(D46RVHAT#|IJ2^ z*5NImTjMq>i&>JE{f|X4+tKJ(7De6A=r`EWqp!sK)*8RF!kD^f;UCz@X+~!xn%Iab zgckUjjht1O;Ar$0i^iywG#Y2)8Kl3g1yx4FbiSO7oKQMCM@9|}jZF*Coj7E?1{sh3 zN*mGev_L5vIcn&lG}@Vs92jP28ZGy7FtafFBn{K8H)LdCv{{W-vXNym&}%elWiboW zXpKcN3)5)Y8f&!x9d~F!-PLKXhp`!TG9`>R*VXeuZY#s?dz86q-?iLNlsO zXhyx!=K0O2IiUmUOK3(d3C*Y)p&4}}G^28aW|VknMmdLO6mDoPk_WeX>6s{j5aLd; zlS&^lFvO81prz31pry`0)VXi0)VV| z0f4+RY`n5)HhwF=0ElmuGtZ$tEpUqP{ag9!x~=N!I^|Il{K#h$q_XHBKV*V`EU*Z{ z55T8YTdZe__&*eFoA*p+fSa6VAvbeBl3%Q*YlYE`N0fXdFF)5yCxHh~VSv%g z?vI3Af0LIQ0SEv8C=wydz>=>*QWqNly5XH#A`0qbbxiYPRyQ6^HKGoHPnXuk`~~@x zC7gm!ohW=P>Fd4eq3q>fP7DBabe8jDKFb;ZE322^oa50I;3NHPzAlVg!4HnEzseEk zd+A+(`=2_xSgQwzYRR;>l6%cIWqM&*1uS{C!a%hv^&pdLZ!tOY>#LqxZ_0`&js zXl8H29nApJ;U-L2h~A+Exu$odCo9kMcJ80);eVeW1B}PPC?^JgmzQ7QrAGkw|KaFl z!AXuz05-LssIvV;XYP4)1h>b9bX!Q~e7Y^fq$&vq|L;z)EO~(wZ2&gf|5VZbr;7H}3%r^gR28K8 zXp}X_2okJyRQ^*{LE!%19E|`vO2|J|75r4GE4dI=@G$>{d|jCM1dlknK9y%(Ooam6 z|Er^m1z&Vh2f(K8Uz|F5*M*dCT`!?N2}57-wiEEbR3d=;A2&koU}jNUw)M zJSbUUThV8#jsf?#I_dy)l&a5E(fnKK`hj%y$#lsC5k;6|MovWkTh6=8OHTmqZ*df{ zU|+;YcZ2|Jx-iqQOz`LG;)k0r@rLL874+u7|1y6gG&}_3ofHD_FQQdXW>|#vWt?a( zlf&$Dh7%J2)H^(6dWWHE$YngYJ#n9L80I)^Puy$p;TG4K$v0}S5Jx?q&`77nC%oR`<|WY8!1zO{)bMPvbPJIG6g_oN}O<%(APK@X>KCT zma@7`wL?Lf0(Z(SU?sXt^W03C=HaGH^Y8{!rg;u1Q~BAY^eSsZQY6G^ZP{8+mVI5z zey(MIZF!>2E0_Pd)T^O*@2W5|H7L_H!mAWJ#8v1ER(Z9Mbgw)Ktrd;~UwMKM$#-r1 z3)KaEp}K{gFEazgL@JO-VPcgKT;&wz7piXs?h_?qnk0aZdZ8~=FZ3U!?kiH)Dbt%a z{mRPAz3OuJzK{RNHP_IPfTgTY+>Z$zK(NNC8~|+B^Q9URcD;&j*BK_gR23F9!Cg+Y zzvO5)0{4k}F#!W;C)#r8)s&^XSJ5f_bC=VI@TH^?0ZZw~jaC5EH=3eXT{2FbzR|)y zpK+oOz()UTRUBWd{5jzoGa~E}DGRL3g4dlyeXT|W;QnilIsok?iu<0gRatzabk#|( zCYLGA>=jY;4HS)Yt|kNE|AdY?no!1Hbu_cjZB9Y~*o0y|Y5NhjB{TBb(?vJ=w8TKc z-N|l|$UrJ6TWH5Y_LkqB0QBh%kjZlP=5{9ls5^NizdO-5x|5vRBcr<$?NHF20Pm=VBIpl81PcuA3VOhf{@A{DRbY!B7u8M;;0a5)N)bvJyQmjnyE&!tx(6|6oI4-axj|(K}jtil+LWZVd$>Rb-$n;u#?jUzgMFGaDSWA>Hu`q^L(#*o*z`;$(2|pjPg&;KfUq;bh)2X z`awQ^Bdt_{`=2|ySa5$tN>4`t*uF-+SDY>nyx!YIPF(Ayjsg-K;iLjU!MYTn|AnK6 zy)AO|05I!P^(J+?T)oEIRd21Oniv0_SAFC!2z-`vSQ0>ct1!mDaf zbQcqoo8R{8X&;SpbtRa#0mwKt8aA0O7 zga%0c$USSGC+A=0rFMq{^G0FVEIHbVHUJxKyb`eUh9XaXcmx$)k;=3szxQfNc;?_g z6_Z!|p58Ma;-rWD=1&&@`ad}N20$$gbY}v91`T2(qpJ_#Iv03>=q@Hgx9PgGH={=A zU>1UUg;;>=Q6mpGqkoaS@-45vM6V8un+}>zSQcY{RO45 zC|KZ>5Q(EX$=oeor!l`cg~F12n}#kF0B#jzH{F~%IaToWTf7nd#`{!bqpI-|DRRGM zLVkEVjV-|a?T%&^yv(VO0Bn6!drzjzD{l36iQg~%JH47JV8P8!vWn$pcX;WE!2O?{ zuvzd$Cu|kkEow=QH(F*>xUyX3$ql!8V`bkvy~;U&f)5-u0Q~DPH;?kGjQ`~5Re@cr zN}YpAG})d?x#~!is+RTp+r5-`v_C{Xe!Evw?%rTnD!1L~r3d1joByMu13*yg1PcK9 zCVSuEO_Yn*d#T;ynkkbKQX^`lta~d&fS#da{WdxJsP+#98E0P>ZApLO^e#n zG(9H&vYxgB?s%7%J{VANwUY_}1sM;JFV7D%p1ryA5CE8m$jdi?fA8)u%5P_Qks9

eE)|0l;Y)Zu-ds7vyunq@xc9rqnZW(cX!YVH*B?*B1gBi>;LS2!sJP>@o9ez~I`Ku0M}IVtUPAI-&2M(Gu#6*~=rX;W-k z)11~p!2K?cE*8AUNh<(OtK52@H>zK~e|`QuA6plKmz`AA$|(=hAOPI2aKdK651g<8 zAZ&T&{oZ7`^+6izx8Cn{s`!r+Se@!od*GeF-_;2XK$t7C&ja4LE_NnZuV;ewsz{bR zKup6zDh(#(B8wDk9|&p}+l&E_$)6Si^t(CA*_+EE0ibE&6Zz9Zjo(L~_|x-6%_3=s z0`dX4PFBG@GSAISBlB=WKDc;4_eF#2K)9Jl)<@=%^^tj`w&{7Kw(YNG4a%nGk!*J6 zk;bm)k;?AQBNd|Nk@cw01LFLr=aKbl9%=m1M;spYP9%}59-~9+^B$v9?9b98o|f+d zxEDaz$LaA7OgqB#Gfan*Dc)7Cd7Omy272k^v^oB1m_C8&WO@i%n%G!LC6VD zklQdkPQ&9+JT82~8zpO=B3JJzvhMnn*STJAqQ~p_=$84v$~&L%?v_nYlK2}?B%h?M z_*?K@*#mN;sn+FxQr6k1K(*bF3{ZfZgZv$?;J9VRFTj)oS(d*;vsUe$(X zdgFPBvEW5v=zw=tp&73(LNjRm(9FAnv;y80q|M*T@lVrzMc{fuQ7r94GuFJJ8EeMS zj73do#za0e^R6HrG{)l)N5>zU(KUuaYTc7qiQSDgxH(Eq@euhpGbSDRqYN7gv zjn_T!XEt8bCVW2n&sPG@p{|X8qPaH$TR^otyoA`_Bh^H2)623isqG!TNT8VtsEo?# z`LLYA&%3iDy>w*9T%K!nbt9b?Fc%I;(nyC=v4NZ;+B^`dcfp7847f}q#5+b`l1=t^3JiF5;iT9yVYXjW*(uT64Y(S|>jqF^MZGvHY(V%#mQk95} z_DK?(levIsc|)>Ik~Y`(tQk2=pA6_yvg=I{Y6zw+mPcPCy6?lngz12@l;369-_ax3 zgtr;Q9+qWq0Y>qmz0tZT=yrjXq`iOagTBd5vEY)$^6`sAM%=nsZoNoUkLE(8t40~zC~B!j2eEN6WmQWbYwXL$We6C}LCd0QiKZn$hg#z> zW6ZS-H|CZR);Q7{ceKWxtZ`>HawJAs<1R2ZBWuF_f^63NC%Ibay@tpVlIh9Z2V1ld zGAQ)iUta!aFWrY*sPY%?IYh8_&tXrRf4m}UhO;uY=@4ZS?k;p-l#hjZ(_y@)-1v7d zH5yWRn+^d*HXU+EkxhrBIx|_+9}5?r#nZ7e>etLog22t@IA!UIrmJ!(n0zR;2fZv% zuHDFW5pP3eH@yhzDR2CQh@N4aMKQ&f%mdV)FLMg|;uEijpvVkANc5+F-iSz6-iSz6 zY(yk0Z$u<3HX@RhHzJZ18xhIM8xhHhjfluUvujXU^r|T1wVm}?{UBhxzb)^YN8pj2 zi5XAEuM}xP|2MuSk~^rt^yWmAhf$*}T8;0uJ+`iHEU?H%J^=m->Xo9K69GpyC;FZo z@w!On;9v@XrQAG6l}u%yrS_rwxK#EzYe{F9P%G0e_6xl5)Q~;RadLX!KU?pq?DIn1 zrw$+K>3ZE*i?Zm$Gi8_3MVEY|KY9he(I0&R-{_AHfp7Fjcd)h}-RO_b zfN%6iSHL&=qa)xO{m~8ZjsEBa)Q$e=1J-8WfXb3gw+fZmlE&*OyRu)(jcxQ5dQMk~ zldcjcT_sMsN^0G7m1I}hJWplcw5g&C9`B_Q$bXI=Y7l(OaZLFu2)FByy>vbWchX1_ zvR|r*-nQP-*>_+m4a=+4{rvHl^2tr~%AONa>LjEzxA|=uMwXb?OFity~_n*-QJZOjQCJP2aO2XWu7tcAGrw zYLRTvQ!1pGajGF7grai8)uJv3r%YwYJi$iOF4{?$Xj+P5Jlz%p;dIh6(L{BmEKBtR zbr9XT{j?X`%ELQExvN)QH23r+|Btpefvc)`|Ho(MoO|wNznA5*?;s$Hf+*mUfS{tF zps2Wm;ED=d#3IuJX{lu;XzVm*bXP$Y^%$%7ybIv^%k50>?|ClvQi>Ym6bO&>sB3p;<4q{rawR*AVzY9MQ z)5wgY(;` zSQJ2y#igY7jEVkyqArIoGNYi24ppEN&L*pH{4K#_iZ4jqz z8_-9H-5elH+NMEUE+5fF-=^zAZK>j7R~xDvv`&G75O{cmUGsa4D7Sswp{dDm1&pWH z>`;>Ytq!e?g4P|XYk&U~-u%&am)8|XlD2z0Q52sC$~wgtCD|X|D6HEY_uQIZS~4sY*l(RvL;YbD@7)u{x~4}VBl3s7OZZF2imgo2Rk95Kn^;B9q?n9v9dPhj|j$ zc!Awo6bcmE3)d}*jDP7+6bjmkB5jw__M%YGUJ_m_;=Y3Y>mu$ZLSgqe9_D|PcIvAr z@Cojt)nvLBGsJm3-m65g0^-- zVy%F$*XVg+;hxai9dK=KTZQj;)qRto2&+r?-EN`#MnRizB*7)E-f)3$dkQyVbZ;cs zi<|PgHx#IviS7<1ZSIiJ2+`^huM}(#TG~C5;GGU0+bwj5C}?wtq&+^o+^~&TL)zVu zq!@1<=>cjcXra49L7O`y!3C|s;YEvWP6ux!n9;#oyM^uz1!|i+WbN+o(#Q65hqfTW zq7H4*ZlSwFL7O)u!5OW=;q{ZPAh7*VNpJ#cPHjEbb`#wl3fkNuY3nvf+UpT7$vTZ! zC{S!mFx0<|S7h9XD!mjHC2hr!`U`AOeZWFNdk4j9zE0y63KZM^>lQ`EUvwx61#Kmf z_Lmyw+g21x+KLhj;_Q3Al&W~Vz3_~b;IH2cplcazov%w^KO>_|aKO)A9rF}x4E@lnVYnsg%tg@G!?1um*cXzHG{T<)-y!nxzhR*NVw2zwZg?p zYZ|BV)^u0gNDp*R1yTF1`Edx)-hHUBdZ4`1HfAbqW7ei{kKmCcX)x)))`RTIs-~uXFzf53@B}#0mZE|ptN-c6t~W>s@nFn zG@?&Ny|t|~l!f$wrN%W|XDIKqb=F(oI)hKzI@6r#TW47HZN+FrFQ$*Sb%wG|lQ;@O zCPKNLx6V-9Y3mH~!}of9P~KM6WYh&trHY&E=}Sbu-S=B50FN9`GRf9`zI|?(6cT&% z+EWQzrL}Ks&843iY4&%%h1Kx4%tfL(0qc&5AK+fHXEqCqvJqV z*B2tvUO@%#2U06-%i2}_Kvn%c7)3t{4%s5)@UkWshqP~?)|hQuTLHG;AX&W`tnk$? z(eT|11%JB>?$^+Znj@I);w`Pg*n(@}^&(3Ftifh@;0i)beHQ#h!}lcAwrtK8=Qzl= z3e2=)usPiNw`>a`+af%G;~t9D!|1NK8>2tyP_~Q3C9XTOt%RJK6L%#VuHfOm3rhMz z(bvRbAN{@L$v?E0e=h}cPy4a&;UVq4-%D;p2e1}-U8L+s6%II6MF0Ikv)Rq?){|c%TX{k)M2G`?INNBpes{2DK7%f7 z%LA8-P+9SeecVrypS6Q-;th1=H_+X21Kp|{=pMg;?)4k!j^9A{$qjU8Z=kzy1Ks5t z=$zDluFv2b=;Cjn8-D}coEzwBZlL=bu0Z~&-J5TqTY3YZn{J?c{sy|&Z=iec2DIS-s8|aqaK=;56bXz*;zWGD)OWRH3L3Z1CAflhe z5v=RzYIqh^iGB{qJXlwYIy8ZYAn-L~2{2B)Wbb!T>Z86)!$l)ZYw$eE5HN9cND|>40Z8@j^dpVF#X_Ye0E3ii<%g2 z%Eu>kl)u?#?hRtQ*Pl|9+FtbWPTIDJaE7Kb@W~8(qn(LGKMw~Eqb~kDDIFK?b)ci@ z7eGNXw3Aqn3jz%*`okby@gi28ZkG**Pmg)15t@k&)&-UA*%d3?A}h{_ZopMwtfyvU z>?GA)XM*c{XNDXzG6vHU&ce}92$l`MbB-TWxX<{Cbet%3(Jl;yhzA&Cpr$K5%9IDq z@rpg~k`(4V4DuQqO5PnIFB)!Na7pUcV-QH9-C-WCLtO|wUc&ByXHIzJv4L%x;gCXC z5`(YOv;WvnU6LZXhh6$hiiz8U-9dX&$LbUd6O1r6MEhb#!iAKh(f^7JDb;7+m32wj(Ao&%qU(AMhc z<0Qb|UUO9%0P*j>3a==B&3^W(bThX+Fj4m5o)65Id-2yF*e*u~pM{WB3vKCN96q z->{bm`GC)x?RiA7`HBn+O;^wx|7@K7K zo<6(UTIe&(_A7n**)G=E`^j=tzqiTtWst&>{v@`7O{!;=K9qK{xj;II($0!YEOY3Z zi9ec?4{a>ug$4FavTRjHAhRwUseKe`AEWStntI{r_T-rMWKnx^EGD&eOxHJ{Q;tKv zU_9XjLRfLj(JS#(Xw^;vNyTpL#qnClg_R+D2Mv^ zcyKZLdl{5)ij;KljdC!zH!HG-8+m7`3>>3V`|AdI%D>8~QckT{lXp?YQmEG8Zu$~A z27KwoKw+(FT$)EO13T@QKsohmoxZgR*EGi8~!KOWg`5 z@eO=+bfp~^OD)&3V6C>s9~=gUhfDizt-i1*7-X-lU0X0V1I0uK$x;LVRRCC){j4Ip zb*|j8TIKeG((#G`p7Cfq&Q68L`skYL)aELvfYzx0b8Q86YAh_weqNECoVC6YI~wv$ zwpW^DpAan929Hd1I=I;Iw*1tm;Q4mwv9VAd9=u8GA~Y6Vk@1S6_kDj|y{bowGl^DF z+TbL!OsJ`&*u|}msbN~JO|d&W$a9RP*toNpJ=7@s2Psr1F78r?4i!63EFhy->>)-u zAo#jAy>*)iPL8f`1Sg?)5j=;vV2VA#QI1rnLeX%IkpeX_4U!8WFxYGvscrw0-v5TN!Sx^;HIfC)=FAMT@Ij+;a3YKYe$KwhN$wU3j#&bn!SIX= z&Yyz4PgbKu#2(7BvJW8b$Ig#Q zPP4N54Aj0m6!D>HDF3KDIZa`Afggpv(+v;i_DSgfI7trXr&YSMwS^5{e(Zy=4FscikQ?U4#h zg)5@_R!B>15$ zceZivFQp3W4K?b{`X*p{1K3#Ea;P&`CQo`C>T(YFx3W*DtO^w>#L7OOh)(VD*WLR@94SWNn(Gu+8&+ zmE76y-JTo)S|~taa|#NfL%opeG1!kin3tU9&b+$GneJ>{cf?=fcMWo6_dpL<*nVg9 z`N=HAXR{Eku86}@5tl?_h(E_2QnSk0=Ws;=T`Z?pg_ZdyU_cv3km)qUPZADg^=9Q+ zZ%=Y(fkD3&S(%8!I{S7A_6a^aIn9sRqY$S}#r|Q3^TnOD%#t&$thN|!y7feP&smr& zs|fw4)nKC(LLI19)*p`|y9h22|(MaB$A%#smbp&q_&4yHFmB6=kuj+u8T%a8Re zeW90?<>cU5lbnNR%JYNK+wUN;vV)KgVrNOd8QMFDH4HxBb$~sV!`SPDZ>lU12t*BM zygMt%!%A+T_WL9ai%BaylywuE5piG`>`yzQq=C?}7}LQSILLf94+o{2x+3}x!fxmQ zeynT^^{pv@z1XE(Y|v&n7$6WeW+sdv+^P;TN8s3cHURp+JKF?jEmRAguiJ`o$b5%deYNRORsx$n7*DyKlMv-Dh`+)~ z*hjDeoEI`O4rO&=84!e(ZHBWviQPRXe5gBHRr7NR3{xeDqetM#kw9nsZ&Y)OaUW^(Tv;`o&93Zgm>B%nhVsZtS2ivLC7VJK%Vr{OACLGb*(VfZdi*TJF=SIf zHmfMt#n`T0yI~VVLQBI57K&(uexAVgPyapDk3~XnfJ*L#^;AbS*VGNu@5Lc*0ZDIm zstYz&_=v~7TvZlDQQIiG4F#P=iDA)%acZ zBKEABtx;GZft%x`G_eV+o|{>7IOts))5-XQu*HnIZt zCS|;*FEW+AMQmXKvc>FeVqaU)>7DEYVn%OdkFsWBM+YF=!@eix4VKyLe%>9v!((Qj z5L?Up5nGkJP6g$9p2_ie^G2fSLwqPHJ$*D*NbDSi_81>e>@#9bd?K-J#6IIC#GWMf z11}}^F0l)IDwXiXWc2wnpGmrv;p--;CxOl)`Z~~)%!R&fWM)~zkVT2xNH-w}*#NPW z*d=1)#Y$p6Hq=#%b;N$Bn%N>YYC5W!{i2CjKKVQ)o+lQDOlAJk0iq%9=q6Qqhu1+} zWMpBaeWiCvR~U@!CJAo$K_!kK`}z26Hb6QBeb&rAocQ_pc##c18wT~w+?^TAW&?mwrWwSiViCDJ*$kcqvm8czdl(Jbqe5b_;GCGzpXxn@#TsT2S zyDREOz_&-yDP96(vvE=+vHip*OHstWCpJZjA@&imsZuPl1;nOH@xlwjs)zfQAFvsz zQa7ScIuZqz$X+OT$*VVgiGmfrH2kgbpxpz}W*S#6I-!Qr^;>8DiWH+wv z2TQ-?!+xBdDtQy|GjR;?H+dO6)wVejacb@dAbBAH)BAG~?@B`agydG`W6V2$ zWLPTVD-nogJrKuDL5wa!G*3em!x2aOBG&mM9xXxqnrto)!}N&0h-a%250Jb$alb(w zUFS@N)uf~1dr!piUWl^^-QzI5el(*0JVY!c|KO*v zhm#Ob_St4s*tfCUjL>l1TKp1OjL#2H;j1S72@Tt$i?5|y>YldP(XT@q;R#+wZqVYK1ZIjsa!`#6^nd;iZ{@4+(YS! z6vSyV9YyIrbR73l)IBIIDBQaz`h$nX6N3SVmSe@{SrN6+&-bQE?)e@xhtV1ia>*+W z(7`Ja@H3^C3Lj^b-hf?ZW1Hn`t%WC^Jp5N z$`T|TUi@OmfM|bL#DU&8XyiCdfOLsKEOspcT*Wc{t(XR=4Jm#T%E4Vxc_m2hHlV!E zH0-K*j)+Cm5x=A1XlYkW&z2CC*@%%0QMC|x$BER`&vBgM%oI@r?t*FjDviZ-n1X>$ zn0+gxa~Osw8!@0V;5CscnVfTV$d>Fb;Cu|_x zKO0@#Olj=|ySEta506Lm2}8Uz6>)+YJ^bQ`fwnjx-kOe~^jF}k_nh5Ug~X4J@B9Ev zA9O-oo`<;Agm@3x9HZm@Bn&0tB>&os=}bpNV;SN)%6ppRX0n+;O=BmUami>igUY%a zf`I;?PZ<_d0VPzxj}!za`2!S$C#BCgt%A()4Dm6JI8Q%Ra=r;{9&H>K_ zgM#Np8J#aHs5w%+u~DMppl)FKLX%_CFcjV9gq1Tm4b%O~vCmJZ&bVg|rhli7*4Kcp z*9gQIN(WNGub5D>&jIly1yMrbzD%L?n2XK2$B3brDU?qsxc;H8n87y&@yB#TB?IwK zN-s>p^c@L^{^ZCZ8G~CIjyQSP68qUuxu?1o$YU_?!r{Zj2Q5dqeK?LswSZRk3(QDx zZQ{P)U}c}qL43;_aZl-cAfFJ7cpJ?3Ru&DDrj@ES zmg=AfjNw+6O7{J!n0H`yw=$CfU3(c3{rjNg6v=-Wj*`C!mr>{|(B~NDMvlIs0=|dA z-O8TPurH6}bTIakEJRXMb@J}lW?QGLVPVLmzh9zzMOp3#f?%x%$Xe8qO zY6cEGsnqw&1r8_LV57|dWrb+8FC9^vE41PJR18YqrFq~mo%z~?{ND$s;(+mw(fuES z)56k1#NZT`osTEXH8rQg5o-%^#{o-V;@C46Cys?;GoaaksEryj9kEt7S_NvgwL1fA zqL9XswP{$F+H8>IgD3UIIK-dn^w$P~rG+S2FcR?~3<5AhcAJXD^zVk)T8&MRz9!PP zK>zDDzELfz?C)*t6@ycc*3$of2c-U+PS-J@>(>h0xRG!jG)UkI=s6kj8wJ-v>rIH- zGUe}Oy`%nrvJ8VW$cSyPt$J=w!1~ixUSDwRAA1C9wHh5~!1MwG+Uyi+`-!Bjl1|ZD z=_F-SgK@&rmS^`@5TJ)Z^bMnbKl9i-#aPOz^mm{&Us5(}^}ZDhZe2-QTdcnku2#y^bVZ6o9VVhG3a|NlCM!v#nz zj^`Z*^6U2xxb}4223Mdjg&>ZEX&rv%cswlCENp^pm%oK=?~C|3rL(eMhV;Vty@36L z5Bc}t38psyH!6tposR-mI2^@EtMGlmmtmhoVbh&Y_!rdqS+*GySyA6l{S(=bLq7#= z99-hUjjwRD`4X0kfUxpVRQ3&iu$C~yMp$$xY!>04GcmmzR)h+Bulht=F^2-)1Iunb z4?}aLSD{uz&8DNgqvS(a+9~Y5Nha{KI&Fjh;1JkugH2yGFsKpsIL7Go-n2&8-kzqj z^1Mda-mcNv$)Sz#g!K}g-Bi@b3~ZIoiZU8u)A|u&cly*8!Q~3uO02<0ElL4~e|2n4 z$l2u6{zkTobZc0Yy((VzSDoV<;ZcWUp=h**MNVjh&FU3l8jB15+TWS=4cFMP0T=w; z*lL}9Sote7PHKdv8|!@8-;*`!Y)Nb*^M?DNn(ozVCBTQ}Mro|D+7b|qNeHPSq(Bt= z+g%dmD7D{&(15O;4kMnyJ#6?}!#)gb^o(Z*b@nK*1X#^$x>e>z&u(n6&Lm5tXLmM3 zXCJvWdM0-AnS`0BGFD|r2eh-F)rf?EWVTGtc#GdR9B&wCLEe_qBcN9so08H$0Jdv& zo$vHP0qN{mYw=UQ;aSWK->t#0SEmdQ$Yvor>pOi+Kn~liv!@~^2jsEnc+E0+fI2;( zfIX+vF)3T%s@x|*Q(C511QfAkojn?HbHD`Fs58$2YCv(PBP?S_NT)S^89Sj{UaW3p zWy}h1_QKG<2R4=Y>g?&f##Aw_lbabVLRUsOE)AH$pjIiP18WGF%~J8+3b@HAU1vYv z4SLZd0X3bn&u7j(G?Om#ngZstRGsY#+Zk{(o1n9C6L$yP!d}r?Hn3Xe1J44Z>({GZ z4Y-xb)Cz0ZnX1D93s@Gl!W!08eLUbcwziF(R09^W?{wPT)*P^?Q!sT5o-HD$xAeMf zs_UeyXRA{+-8tJg0rkw3rZKmH-vr#wZqr$W^~Zq4>`WW`J>U*j2H%IlK>sZB4^Wq} zm3T`DXtvEi;4Zd{dI&172CQJ8>MYxKH30VL`)QVOk*2`a>_?pqNwEa3Wv{?fzUbwv zq=3MOSaEtQ3lDslEo);jfsJfi8|xMb&%Phi>3c~%10P}YGPI2ECG`z_lx=8ZnSqy&BNO)K_#m*E%k6J1ZQZna;IN z3EaUB>a3gf_kd@ZPnM=zZJinTJUfH8-r#r>oJ@f)v$qCnEZAvY;H&IAyb%XFto#Ek zA0DJYb{mv%i0#l>1o%7*ciQ1O15{#LyvYiOXbhX;ZFbwxR^8QrqpVS9*c9)vgF3^e z_=xSu)hvgk%nbab)6qAxCBrnGJn@l$X0}adsS_6le!F}Yr37l&auh@jcqMz2t3aY>g;l0L*Tc}bA+ZF^u!Vg$0&WH3(ck0P82B^u9I0iz)p1MUFRZW5(&Z-ue`S?Ai}MD=uaZv1v3$?SgaEwJrJ0uX+-l-n zE<}#g(vd*U-zRpEPfGA&GQUFXD`2pd#hpi?WdrlbKNbj!O!z~emLVSm!nbpEmSy-d z(3Q_1%QftB+!kixOOUB>^q1o_gwx|`d&eG}-#eMV!}HEcz<%O+p`NC+}*j`ZV$ zNv92ye%z-Bb!*s_@}C0z_zay5uKFu5i0^9ERT_iB`CmHA2i8URscKGRc)zjeMspg& zbBML-N{H3N8z0<)V)!ymXL1=-!(#ako&7ox*$Le;Jl!oQmTwz}KI_@2LbsrJenMyc zdbkC3gWXfq9SmVurHMS1Xg&LS7H3HuewPdW*03)b=CHU6xfZdnX=V1zf(7w&wslYjkFfO zR@bq^&F7x?p{3Rv=JUS9)|i5WYlG(VZJl%nHO5ks7J;q^rVPjjPofOtY(8JD)7YfN zp!`&4<=!XR%^bh$fi3Rjvpnc#K9QIf+O52j7#6?Meow0GJNWhia4pVztimky?0z4& zpap!M&LaD}1uf)-4`@22pIea1SHPpmX!-n#{RA~PpRrXUSr)~&Z%yS<^ z=|Sp_ckm^|wC;E(KfN1u6hP3OJozPJtPi{jbSXbfte#;^OZlTOqpqI40x>P+XLN=! zE$7Gnqv2n(UvOwJ&w3_!luhC>UiZy)Y zw;DU^w=HN55BW}GsSx*CzEo!)_jL-JF*mK+j&roB& zDZpOfH|Z?T@4KK~e1gurLH82>3m(iy%L`DWuc*8@4e1*8T-7f@d-&nr8hfznub{o0 z_0>$9p$qNj9{n`-m#-Xru#Fu6_8QO9b+3cd!~Crb&GHe*_Xf|()Yx6X-r}$5YzGAM z4p*_wF`BnQd5k}&vrE9<<;QgPDww{{ztx!px)0%ooR$wq_Y*u$XE?fl%nNn)6ZDc# zdD&3Sav+5E886G#*koX*`59HG;XuFOK6#qb*#-8Pc$v;pOOU0)D1w2`^g&jqvn&Yh z3_q>2Bw%0h#^Jgbn1;^r%6yG|2fA2;fb zbk;N94D3~%J)2a+uJYG)b|A?N?3m70#ll=FP5^`Q?=(FcYX;h^E6+}=VO*To*`;Y_ zU>#=!A%4dv@zd9>>#GioF1Ky*F${KN#{IH^P*~QPEXXG zMxxV>73Cp3C!_BAPN$aqv+lu8y3NGau#H9Q6%P?NMK4dKqv%}VIa0P3=vk_nmJOQX z>>(x)(-xJUVwuix*s+QoIx7u_yX|6L8Ro;9xh>d7Xd4Li>}Hq^eZ>=`t7k9uQ{966 zMF_knoQ4({*#bozG3{&)7G=5)m!=_N$L*RWj(Q>DQ=MV)VM1Q4>9F_+ahRA^e1!N* z*J1II;)y#n%a{7OsXvp8$BI;9+F%kVmTYb>K2Ge=85W-)J|d>|gziG# zqFMUGqP@Ggh1i|U6Amy*IO7Xj^a)Q*7Om5Yub&*;Q|u*WJ-Zc5Q^aYV<)<$WP80c0 zw1?J5EF-3c)>q^oY7ecixJ_pm+D&4!&ah_E#f;aecxafrgVR;9j;Pi$8Dg8xplX5! zbgG$bu>;=A+*&h(#5rPG@q@*RFWZYBEOzM(iytCR>kNy}6`Rkr7oRKC6GXM*^Td*` zG&flM@J_`Sh+W^b7e7+`NK7lfP^^|EtWr28*gqHBh}E+!sQf}w`F&@!$J8Y4Dnj24$gqC32F1G^(UC z%Aiv5hsG$-GO=Qo<`e@h6VuBz_AUfkCZ5n420BeFo1^J4&>3QHg@om6OY>PGt5Q>9 zq~&5omBujAa)=ZR!SXo>bhfChMx9orbHx+Hv_LCF?tNN5JVh(SEjq)VP$e35Rtf8c zYEgZ^MDriDTD4dM6pQE%tyV1>b+#MguIbbhZWeKCHOpS0s};BCtN_>oaZqPl;0PBA z^E%CP4fs?=zRo^`)keM8fK1hoVzGE%SK>gkM99rrMm&loqPx!UDDD(vh-sZ|nOLIh z@JwGO{?K%Err#wte1TrHrR|DNC;B}i|4Y=V+L?Zzs3cm?@Jw$Ir_Z2LtKe0_=d2bC zhPGPVE@X5{wYIu#V7&ucd$rg=IxXKC@jfxFVeEMFusYbzj~sY^a2r!YVk@?q*0w3% zi|xqv`K=3X*F7+3Q}B9m!i2>)Fzdh+wo$BbLbiq-HzP}R)^sO(Z8dEan~AMqJ@QcZ zNC+6}VQ&;;n{_;!UE9>6kW(6U0`T@(Z>GZxkVJXu8TYHGU_s6rEMYzX&W{ zXGQX!;DsR#X5V^jBKUOCc7istFs?S z_oL1(lP<)fIW3-xmiaofP-t~J%L_x@4xNqkSCO99skI!L**X7^%EinZE(snM zgMG*;^Kv{Iys4AvX0eHMn$ykVgl_3N_eIlY5$&txJDPGbc#F7AXM4SO2RtTz)R`&u z8~(VM?T3~P?CZeKgP(x;Pp3cGUJy@;CH|Tl$E35t+r%$A>zDF<@Y5nSpjG#4@H3)J zXXg@M5YLIzI?JBkV0b}15vW;ur~VbZOMKVHc*t&%6{P9XQXND7BOXyhAQ=6u+$%Qd z$|~n$fqTV-V9hkz{aD~W5fY-YUp$Wm?iXitX6tn<@PH@|)pYf)ZyFAEs^@=6n{i&`No6p%}%|DSPE34UApIk@2@vACXSKQ0=vxi?}H z+_VvFH%KJ*X;xUJ2e_74G1QIB z+%p*5bsh<6g{`0(>S&`@f?B?gLd&dW&|D)5DnMdbfXu>sv=-bh$D{u*ria5d>7%9~JP+V{DSYrsya~$>1`S9IU{KEvGue zqcpG!Gg13y0OH+N#O`o!44$qc)OwPJcU7T$P$1$9&>P_S^=erEz{4lh9p0IUqWkg? zf20nmAv%ROD-B0^ds<>=NV1Xo^DuJPG2PJ;wX$x1tz5mH;>>Vtl)1szD^g}ZWntf* z8;pH>OB~t+LQVYlNa3nXi@jr9cx3WF$UD|S$8>9b{N0Zh?v^+V_wR?KYK8q>aeeu} zDH5JF`uB~Z{;ggAskN>jkapayjneTbT^+GeGH7rs2ZW)Cx+JH*GLy!bp{daS;cF_X zhzp?u3f-t<+6+UoV1Lr^BEe82*yo{WzhY8*`Ukin%h`<)p9&GoAMO=PtQyV&nJID5 z{|&4uAIGNKC^}0dg+l2Ia4rZo8?wQ53Y|916zHEcs>hE+?H1^y5}QHp#<=1M`5GJs ze7huu!4ot`lHqkL?Cojjvjil9v=Y0Ix^_Po82>vLfFgL(9p(FNbuiDHmLs)d&i^c z76w`lj;52}2VnYLD|V%D>ca=%oYsa__-Y%?<#w7(|4nc=wo(6n zvRwt&LSGTJ(0He)9{#aUsDE2s{Jj88qFuK1 zgte7mf6!?j3@4jl=c{p|w7{g+dLBu1vR!pTt?Z2QoB|v!O6kJt5}l%&&3oR||2tk6 zVHz%Fi!s~v(-JG3j#_P99Sm1u5?ew`#OvF`m#S&p)_iJnu$C7jgCH|r`OC~ZsNE@= zYI68$DID?ja5r6*#X-RW_9ZI`C4@5py;v2cYYE}W5XcqE(Q}hjTja+s0&*5A*A|7c7(n=Ly$T;u zu&ossWCpx94Y3?<2{*8lLlJKR7Y(ck?olrXcd#6m8w(QHO!k8K2;IXwmN&9oG@k7{Ti zn^o-v>01e}bjjrV*vTO|;3u_@0ScZ`W?(JgIUginma7x_Map)Zbpyq5b~O+2(yTI2 zzmn|5PLlQ{vkspHVU2)F0N=bqCv*IV+}<$y#-ok zi{*0q)FLs{fX!V+mQUHz-wU2C;ljE4N=2?6Agw* zxr$UkHMh<%tCv;E;W0e|qym+Xn%9LCDIoI6>L)Fi9}FB0I4X6NG?p^VBrM?#lPjf7 zhMcVVQkoQ2Rl{cTFQd(DEXWs1O@>9ji=~~0fZ10-a=Yy=sf52dWu>$m?AJ&!(hHL| zO8X%FsFWd%P5OXU@ex^1f`9eRDLbSikog5L#mu!-Seo=e=6mGyq*Tk@CY+W|g3VV_ zJ#U`$o77B}&EW1YX*o!^e4ZrdNzwokXSv0IUAP5uxyzfV4{c%t^18@e=?_73ko&P8)h0^U~h`BEmO8A z?gKMrUnMQFTn<$#5^R8@<}CxcN8lQ{){qvtL0(Rcg@`BNTUqc6M@p6B`;e=AqI!lt zz5%?$@hYX=48F=s5yb}V8Pfq%WnTl^AB35jb zf~Vq4B?*SF^I+4U)G9ZL^?+OD_3%1pJViIrGtez;tM_IFeqIEhlE*qN0d#MaYV5WgHjYj=~1PLaJTZL;V|FbLn$@Fhw_!_FyE&<5%QsOT=^a<=eTk!p&PnT zqA6WL=_8}eSd${pG8m7uqMMun6M7&HECl3O%5nZz zum_~+aNtMk;CLL2Fss4)%iowB0@xfJW!%X(L#R9X3K(klu`4jv?PKc)CK&gzb3V?- z&}hb)BA}u&Kw>U6KzfmH zo`VJaz^w!^X7Y507*VZy&2>l=UCOSoMDcqbVgiiZiDDv1j}Xs1xo2wfml z93(uE4yzThVkF`jNxl{0#V;>^6IqHlNd&`LY7uf*C&wnyJjvpS!TlvQ z85jA&SuJmmD|f_c$mWa(?dZj+?}|_+@|%mCGC(u(X5~ z9z=bG;kAcac%LS(@3CF1x_CxpqUM1lOg)4zyoziFsPUAfAPfW*h=VS^fnT^OY zLK-_DYF(Who}x+&W~ub0|!kQvlruPI1N=Znm>UghPF_ z7~fA=>D-t7nRJr%WuHy8LwanI-MPi+U15L~&C5>Th!$hlKr?GGJ`YFSVibKhfHpj9 zle0yd-|cZo=O#Sue9@?6shga+DP`U}&Y`g2pY3Fk-sux7EG8VGW*Vj?oB(;k#Lu1A z@i#(onY0Hml$xfQn&Z6DRE?{cw_}|g$MRcjFTk4R#mEaz$JyNxUTmfqn>5$OA~tnh z0Eg5wc7am~UlY6*n(1)S-7dLUE2=}SbkTFYOQ?x;X>^G(`9vC6tu)1JJ*2yqnpvW0 z9$Zi)nsT9f6HV{H<;G3}_JcHzE4(!RbB{ePGx_^4h33!|OOE6Q7b7{6Yr(fJuzrs? z3F*AvHSlJz8MdEX8X%w)*9=qm)PAlO(KR{CRV}1`UPwK>koshf>8r3p*BsMBUWixc zPI4`z_RBFjR7`T6K=wJNeb$>HjcpmK_?9kpEn~OLvpbhTLp<(^i|prJXF@=qyW;xj zTi1(x>hSf-MZOYVk%D8gznev@z;i?up}D_8<-7%Co%kgIjviL3v2I-a41?=fQ#Cy1 zngPAN+^x!l!*GTO^}huq_h!S2S1f~Tm<*9b6775mnuE`}R!(zrtTnLMJy6Uh%Vwu$ zmI@ay&8!(3tC?LKhWKg`qIxP3KTLsFSQS-ZEnz+3a>53}b%Z%|;;o}PD4_IM!VAX2O@y_CGexZmgJ>0z2Et8*>j>+GO?a8>#bw#ce4Ncr_c!Ojco$}F zFg1ino7XA0h-lIgS2Q`IM@o0|I`&8&E)YCZU~y`iQUz(#%JNimlj&B#vG52&f54oO zfq)l6RV1rJ^UOy~PlXl&J^+_iM@*TpC^%v&0z7GYY$#kLnF5Q)n@^f@W=#Pc6gty< z(R44!FPd%-sf2W0F9W2}se=P9D;ykl!@9-6!3HZP2Zvu_#pK{{g5)2Qd=<&94u@4x z;Off30T)*e4!F2-aJWRKO9_KuDdpghO6ivsj5iWHNMqHKdG1t;~zR3Zz<fixaXJzn0>WYJ2jPz{=N-_pNwL)gT0$LZQ7jLG3U6U|;U&DXDJsH(mlbNPCDAc_NHUOH zh8}<}lM3!K94CXj3C;htEIA}OP91HZ;?gtIvQNpa z83aBb@jk$3I)?W(z!+0olxvwOo=g}6i1j*ClqQW)EiopXMng>o!ZQDfmL^9`H#zQ$ zEVYE1?oXcuXajkuX)~pejsD!T)RsgOO zHQ-^LSO?e5zT#mxcP^?F?>_dS-{Y3Crqa@y=RDeApD{&7k$*p^7>CYj=xMK6kpoBI>4k zdmN!sjz}sliH=BCXpbY(Q{{;B3I|z^NHazv;#%kk{FD%`h29Mh^w>w&^Hl=d{)m*| z^CC=Ll^`$SX|N))h=w8eI-Ha;V4688B?4MRQ}}$R<5XA)e`+$Gx^AJ2p11I^ubGT*B^_Cb`4;Y7wiZ-tEy$*_tH`v01thgZL8!+AJ-G5Syi&A;e}1u~`ps zXwdzTOAD(vq)(b`v%d7WXgW3M8xIGE71$8+{6W}c*uk3=_bU6DDmhxk<$DX2c3#@y z3yXLOuYoP18Wyk?F)L`kQ?0{JxJW4B5irVFoR&>UVHT%XrVjJO3wJYffI(xV=SlgY z;&GlOPK$htJuOb34V~_ZOF=jq(85)SJUrOjqsr-lt~H*x%ZQg<%S?@)wN9tiky|`{ z<$LBm325wbO7WG=J)VJd-Mn3ZII*vjpPP5YGZ7pe1>914#&aw=t#=ye|C476yNGL0 z`Pta@%1*gzjsdpzJm8Xbr@RjO8|TZQM zhBI%#0Okjx5Ecv=0bj5;!Qwv#usfM1vjj+|lD03&(@CC1lEEa&B}pE;-Ot4G$-a>F zfLui^)#?tvLxP?skYzDhma%>+h-R=%z}ajN1Tlv#h0K*;3%Hpr0(^ok2HeJ$0q$V;06xd=2i(Q%fUmF(fP2{{z=P~Dz{6}S z;9G156c){&2aMx;0K4TDfa&~KtBcAq_>+FF@P$9&?aBso z55QdB1u&ndc*86A`3BGy@*yB8;?n^q@Fjr7{87L%z6Wpy{{(P0KjUp;bEvRNegP!& z_-}x>@T-8gac3VFc=i&@s^h*s@cSe@3{YLhyTQi_-q**(?xD;pc@9Wc^KpP{`5eFv z{C2=b{wUyPz6X;|{=z2!{=qB!1e++H1*`%z zu^NHh>MS7KJR-?L3Dflw*~lCGoLPE)1iW)Bc!NvZN6%M2}5 z9;NhRz{QG&53(hpk5c-8CNZL1eUv^95PnH0nNShphVIe{iwWxp8wvMn7>Smr30W7) zMVL-lOjt+QNVu2qG$D&3dzC)Y35y9E3HK77CS=iQnod|uSV!1MxR>xWA&ViW8ph)R zWF(;^Bk69I7Ft5-5=z%ox;{xo#U>(~NU@L7`zYN^>1Imv9_WboK>JWihf+F&(ixO4 zp>zqQ>nUAN=}na0MCsGLSD_!cAIRWd9k;8u$lt2oj<-7A@3_|SAxAIgK<9qWRnE^l zpLPD(`KoiK%W#)6mui>CTwZfIrbu`Zr$B_x!vS8z-@@z zBsbOVPPc<@&ssjP{A$T?U+jL5`-|>xx_{(;)jh(apGTI*5RW2{8jp1zTRdLzXz{q@ zVf1wM^z;n#Oz!PD$FtV+F3(pzKk_`~`JLw_Pv+&~<>?jR72%cOmEzUkE61zAYmCQ;D9lVy;12xAuqBGyjv2OJn2j7SpKT$HEfBfg%5 z_;@Vh)oF;S8HmxDh#S2l0As>2y(kZ{dkNwP!(#v+CY)0c59vGNdjL+5(*U=s5`Mfu zSlSEI{Q?m);t-!QBbK@&{zPf+f$6fjh+gEPAPm!E{1N@i5wl40o*SkYQ2H%O=a7dG z$~BDefv{0%^hr444kyHF6XI)>VE|=Fb41DO6ruxVJ4fj?-YCD>7x6+WqC5cc+|>T| zO$*>9O5Nc^hnsDH0^Z)?0_h%r0_GDpNcRL3tQWUHIt5U`4C4XmG(f?6bJ(h7eEelWHt0-ohP0KbBlX$kfKm2Z@a;ikOSDlhXVe@^8kP5!vTNc z1%SWuk$}JPQGmbmF@S&Yv49u(c)&mTM8HdYGT>jl1n@F11-!zi0$%0Q0hyQy$VE9m zLMOx=KuJ^p%AyL;AgbBS%=ww0NE0#-n(xW1&)hG+WEf{maQMk#n9~lY*PR+%@?0xi zA9nr3eARr|^1UU(J<+|={d0E)4Rbb`!!rP}te_abm5{+!!G;clL;N`cKL@efQebd^ z1Dpb%@IcK_<~v=2*5drbk?>e6m$+tV;Cn_Iz|hFcdg7;rTZSm`>A|z$C3H+|ks=2g z;q!4RwgNw!r1xU+bE~w^4?nj{4-A6OFC*diC)k-tHb`P;BiUfd1ehbqbqubNP4LEO z*7~;&p2?M434DI!^&C7nh>yj#|DE<4kcR9FBRumi!P9i`cizhnz5;)3-b3)9?X|MZ z$=AwafAUHuhn)*P;Dv@zT^;_m+nX23Q85>bQP$D?l2`O#l);0yZGW;g+@7ey56Wzs zgR;)yz6}T3*~Ld*UE@(^fN>idP5+A@)SALb_KkzVj2`f3>~?reEZ-k`5Xj$x^eyl` zBuqa9Hr=zd^oa3{%~1Q`>Brb)P&AI#(u*K{qDo7}g+AFMEm9WFlPquzyl7|IB;5 zc=UF8l>du~56NEzyg1}#`66cMZ->Om!7!5l)m&8{C2tDXi5Mex#t1o5Cl54A|qqS9kQ1;JuO za}cy>51xFpFYfZ&AM@Uy$1pJKY&6fL<)1j*&B)CG_-sU@T)TR2bM(cXD<$z|A7o=O zu7$?#Ul>$)_Id}vf^)pR7xX7262CCWTyW1Z39XtMBe!mWXBRn3C zvZ<<_Hw?qV*EE1@SWw^cS}xov>@xIAUWSe)dFTe5HN@gAIB6XSab35)tjc+ZMdmgn zOXI4>+&$DfLz*C6BIQYwqyot$&5^34XQTzvOC{zmgi$HxHlnYn`G!z^du1`ndPpBI6&r^#|#J@}{IuXABYF9MU%TT^3<}1*n`|@1{lJT3h zSwKQa7%`CuvIU7EEl3QpkgbTy+XzFpA={Azl0;gOHl!WtKsu2wB!#4rZiFKlWCzlN z?3A@x=UQ*y$KEFw@n!}8gD$*dwRK0UEj!v+ZaDY*X?l9*;r!9c)ZTBWhnG%C@3j-r X<%1QcXb8UISF}%+!?!&wNq%-9s@CJ^ADIU%!6t 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 delta 74818 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 diff --git a/DAL/SQLHelper.cs b/DAL/SQLHelper.cs index 7575c7b..0297432 100644 --- a/DAL/SQLHelper.cs +++ b/DAL/SQLHelper.cs @@ -112,9 +112,9 @@ namespace DAL DataTable dt = new DataTable(); cmd = new SqlCommand(cmdText, GetConn()); cmd.CommandType = ct; - cmd.CommandTimeout = 60; + //cmd.CommandTimeout = 60; - using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) + using (sdr = cmd.ExecuteReader(CommandBehavior.CloseConnection)) { dt.Load(sdr); } diff --git a/DAL/bin/Debug/DAL.dll b/DAL/bin/Debug/DAL.dll index afd633c0b353984aac001c1514cc6d1e45033530..95759f194517e9504709e4759be1b3edccffb910 100644 GIT binary patch delta 8539 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 delta 8354 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 Gr~d=D+j-&u delta 6799 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