using System; using System.Collections.Generic; using System.Windows.Forms; using StandardLibrary; using UserSettings; using System.Drawing; using System.Diagnostics; using System.Threading; using static StandardLibrary.UserAccount; using System.IO; using HslCommunication.LogNet; using System.Data; using MainForm.FaForm; using MainForm.ClassFile; using System.Threading.Tasks; using Newtonsoft.Json; using SqlSugar.Extensions; namespace MainForm { public partial class Form_Main : Form { #region 变量 /// /// 窗体字典与窗体 /// Dictionary m_dicForm = new Dictionary(); // 窗体字典 Form m_currentForm = null; // 当前窗体 public static Form_Home formHome; private Form_Order formOrder; // 订单维护窗体 public static Form_DevAlarm formDevAlarm; // 设备运行情况窗体 private Form_Alarm formAlarm; // 数据及报警查询窗体 public static Form_PLCDB formPLCDB; // PLC点位维护窗体 private Form_MESTest formMESTest; // MES手动调试窗体 private Form_Other formOther; // 测试窗体 private Form_SystemSet formSystemSet; // 设置页窗体 /// /// 记录用户正在触发的按钮 /// Button m_currentButton = null; /// /// 当前用户信息 /// private UserAccount userAccount = new UserAccount(); /// /// 当前用户角色 /// string currentRole = "SuperAdmin"; /// /// 是否可正常上传数据到MES(有2小时前的数据未上传则为2;正常为1) /// public static int IsNormal_MESServer = 0; /// /// 用于记录"运行日志" /// ILogNet logNet = new LogNetDateTime(GlobalContext.WorkLogDir, GenerateMode.ByEveryHour); #endregion 变量 #region 窗体基础事件 public Form_Main() { InitializeComponent(); // 需要权限的按钮绑定权限控制事件 this.btnOrder.Click += new System.EventHandler(this.SwitchWnd); this.Btn_DevAlarm.Click += new System.EventHandler(this.SwitchWnd); this.button_Alarm.Click += new System.EventHandler(this.SwitchWnd); this.btnPLCDB.Click += new System.EventHandler(this.SwitchWnd); this.btnMES.Click += new System.EventHandler(this.SwitchWnd); this.button_SystemSet.Click += new System.EventHandler(this.SwitchWnd); this.button_Other.Click += new System.EventHandler(this.SwitchWnd); this.button_Home.Click += new System.EventHandler(this.SwitchWnd); //this.button_Other.Click += new System.EventHandler(this.SwitchWnd); } /// /// 窗体加载事件 /// /// /// private void Form_Main_Load(object sender, EventArgs e) { try { #region 尝试关联启动“气密设备软件”(进程名QIMITest.exe)与“电测设备软件”(进程名MainForm.exe)。 Task.Run(() => { try { if (!ProcessHelper.CheckProcessActivityByProcessName("QIMITest")) // 进程名QIMITest.exe { string pathStr1 = @"D:\MES\QIMIAPP\QIMITest.exe"; if (FileIOHelper.ISExists_File(pathStr1)) ProcessHelper.StartProcess(pathStr1); } } catch { } try { if (!ProcessHelper.CheckProcessActivityByProcessName("MainForm")) // 进程名MainForm.exe { // 电测使用 ProcessHelper.StartProcess启动时页面UI异常,所以使用bat启动 string pathStr2 = Application.StartupPath + @"\启动电测.bat"; string pathStr3 = @"D:\MES\DianCeAPP\MainForm.exe"; if (FileIOHelper.ISExists_File(pathStr2) && FileIOHelper.ISExists_File(pathStr3)) ProcessHelper.StartProcess(pathStr2); } } catch { } }); #endregion 尝试关联启动“气密设备软件”与“电测设备软件” //初始化目录 if (!Directory.Exists(GlobalContext.DBDir)) Directory.CreateDirectory(GlobalContext.DBDir); // 判断路径是否存在,不存在则创建路径 if (!Directory.Exists(GlobalContext.ProcessDataDir)) Directory.CreateDirectory(GlobalContext.ProcessDataDir); // 判断路径是否存在,不存在则创建路径 if (!Directory.Exists(GlobalContext.OneCheckDataDir)) Directory.CreateDirectory(GlobalContext.OneCheckDataDir); // 判断路径是否存在,不存在则创建路径 GlobalContext.UpdateData(); //创建窗体及事件 formOrder = new Form_Order(); // 订单维护窗体 formDevAlarm = new Form_DevAlarm(); // 设备运行情况窗体 formAlarm = new Form_Alarm(); // 数据及报警查询窗体 formPLCDB = new Form_PLCDB(); // PLC点位维护窗体 formMESTest = new Form_MESTest(); // MES手动调试窗体 formOther = new Form_Other(); // 测试窗体 formSystemSet = new Form_SystemSet(); // 设置页窗体 formHome = new Form_Home(); // 首页窗体 userAccount.UserChangedEvent += new UserChangedHandler(ForUserChangeToUpdate); // 改变用户时更新页面信息 userAccount.UserChangedEvent += new UserChangedHandler(formOrder.ForUserChangeToUpdate); // 改变用户时更新页面信息 userAccount.UserChangedEvent += new UserChangedHandler(formPLCDB.ForUserChangeToUpdate); // 改变用户时更新页面信息 userAccount.UserChangedEvent += new UserChangedHandler(formSystemSet.ForUserChangeToUpdate); // 改变用户时更新页面信息 formHome.MessageEvent += new HomeMessageHandler(WriteWorkLog); // 写入工作日志 formOrder.MessageEvent += new OrderMessageHandler(WriteWorkLog); // 写入工作日志 formSystemSet.MessageEvent += new SystemSetMessageHandler(WriteWorkLog); // 写入工作日志 formDevAlarm.MessageEvent += new AlarmMessageHandler(formHome.AddMessage); formAlarm.MessageEvent += new AlarmMessageHandler(formHome.AddMessage); formPLCDB.MessageEvent += new AlarmMessageHandler(formHome.AddMessage); formMESTest.MessageEvent += new AlarmMessageHandler(formHome.AddMessage); //formAlarm.SaveProcessDataEvent += new HomeSaveProcessDataHandler(formHome.SaveProcessDataByDB); // 保存加工数据的事件 //formAlarm.SaveOneCheckDataEvent += new HomeSaveOneCheckDataHandler(formHome.SaveOneCheckDataByDB); // 保存点检数据的事件 //formAlarm.SaveAlarmDataEvent += new HomeSaveAlarmDataHandler(formHome.SaveAlarmDataByDB); // 保存报警数据的事件 this.Text += " - V" + Application.ProductVersion; // 显示版本信息 // Btn_DevAlarm m_dicForm.Add(btnOrder, formOrder); // 将按钮与事件存到字典中 m_dicForm.Add(Btn_DevAlarm, formDevAlarm); // 将按钮与事件存到字典中 m_dicForm.Add(button_Alarm, formAlarm); // 将按钮与事件存到字典中 m_dicForm.Add(btnPLCDB, formPLCDB); // 将按钮与事件存到字典中 m_dicForm.Add(btnMES, formMESTest); // 将按钮与事件存到字典中 m_dicForm.Add(button_SystemSet, formSystemSet); // 将按钮与事件存到字典中 m_dicForm.Add(button_Home, formHome); // 将按钮与事件存到字典中 m_dicForm.Add(button_Other, formOther); // 将按钮与事件存到字典中 foreach (KeyValuePair kp in m_dicForm) // 设置窗体属性(无边框、嵌套、停靠) { kp.Value.TopLevel = false; kp.Value.FormBorderStyle = FormBorderStyle.None; kp.Value.Parent = this.panelMain; kp.Value.Dock = DockStyle.Fill; } GlobalContext.UpdateData(); SQLHelper.DBInitWork(); // 初始化数据库 SQLHelper.CreateDataBase_DBMain(); // 初始化主数据库 button_Home.PerformClick(); // 模拟点击button_Home按钮 currentRole = ""; // 重置当前用户的角色 OnModeChanged(); // 模式更改事件 #region 定时任务 ////timer1.Interval = 60000; // 间隔一分钟 //timer1.Interval = 1800000; // 间隔半小时 //timer1.Enabled = true; // 开启 #endregion 定时任务 } catch (Exception ex) { string str = ex.StackTrace; logNet.WriteError("主窗体初始化出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString()); MessageBox.Show("主窗体初始化出错!异常信息:" + ex.Message.ToString()); } } /// /// 窗体关闭事件 /// private void Form_Main_FormClosing(object sender, FormClosingEventArgs e) { formHome.Closed2(); if (GlobalContext.Save != null) GlobalContext.Save(); } /// /// 定时任务 /// private void timer1_Tick(object sender, EventArgs e) { try { DateTime dtNow = DateTime.Now; #region 检测2h前是否有漏传的数据,有就报警 // 检测2h前是否有漏传的数据,有就报警 ProcessData processData0 = new ProcessData(); string QuerySQL0 = processData0.ToStringQueryCount(dtNow.AddHours(-2).ToString("yyyy-MM-dd HH:mm:ss"), "未上传"); DataSet ds1 = SQLHelper_New.Query(QuerySQL0, null); if (ds1 != null && ds1.Tables.Count > 0 && ds1.Tables[0].Rows.Count > 0) { int count = ds1.Tables[0].Rows[0][0].ObjToInt(); IsNormal_MESServer = count < 1 ? 1 : 2; } #endregion 检测2h前是否有漏传的数据,有就报警 #region 检查48h内(正常就2h内的数据)是否有漏传的数据,有就重新上传 // 检查MES地址是否可以ping通 bool mesret = HttpUitls.PingIP(GlobalContext.ServerHost); if (!mesret) return; // 查询所有未上传的值-6h ProcessData processData = new ProcessData(); string QuerySQL = processData.ToStringQuery2(dtNow.AddHours(-48).ToString("yyyy-MM-dd HH:mm:ss"), dtNow.ToString("yyyy-MM-dd HH:mm:ss"), "未上传"); DataSet ds = SQLHelper_New.Query(QuerySQL, null); if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0) { for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { var idStr = ds.Tables[0].Rows[i][0].ToString().Trim(); // 上传 var processData1 = new List(){ new ProcessData() { Equipment_code = ds.Tables[0].Rows[i][1].ToString().Trim(), Workorder_code = ds.Tables[0].Rows[i][2].ToString().Trim(), //Batch_number = ds.Tables[0].Rows[i][3].ToString().Trim(), Sn = ds.Tables[0].Rows[i][4].ToString().Trim(), Testitem = ds.Tables[0].Rows[i][5].ToString().Trim(), Parameter_values = JsonConvert.DeserializeObject>(ds.Tables[0].Rows[i][6].ToString().Trim()), Write_user = ds.Tables[0].Rows[i][7].ToString().Trim(), Test_time = ds.Tables[0].Rows[i][8].ToString().Trim(), } }; var jsonstr = JsonConvert.SerializeObject(processData1); if (GlobalContext.IsSendProcessData) // 上传mes { string url = @"HTTP://" + GlobalContext.ServerHost + ":" + @"/api/ProductionLine/ProcessData"; string mesRet = HttpUitls.SubmitDataToMES(url, jsonstr); int upload = 0; //本地数据 if (mesRet == "成功") { upload = 1; SQLHelper_New.ExecuteSQL(ProcessData.ToStringUpdateStatusByID(upload,0, idStr), null); } else { upload = 0; } logNet.WriteInfo("定时任务上传加工数据【Id:" + idStr + "】到MES服务器---" + mesRet); } // 定时任务运行超过30分钟,则停止运行 var dtLong = (DateTime.Now - dtNow).TotalMinutes; if (dtLong > 30) { break; } } } #endregion 检查48h内是否有流传的数据,有就重新上传 } catch (Exception ex) { string str = ex.StackTrace; logNet.WriteError("定时检查加工数据漏传的任务执行出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString()); } } #endregion 窗体基础事件 #region 菜单栏按钮 /// /// 登录按钮事件 /// private void button_Login_Click(object sender, EventArgs e) { Form formOpen = Application.OpenForms["Form_UserLogin"];//查找是否打开过窗体 if ((formOpen == null) || (formOpen.IsDisposed)) //如果没有打开过 { Form_UserLogin form = new Form_UserLogin(userAccount); form.ShowDialog(); //打开窗体 } else { formOpen.Activate(); //如果已经打开过就让窗体获得焦点 formOpen.WindowState = FormWindowState.Normal;//使恢复正常窗体大小 } } /// /// 订单按钮 /// private void btnOrder_Click(object sender, EventArgs e) { } /// /// 查看数据记录 /// private void button_Alarm_Click(object sender, EventArgs e) { } /// /// PLCDB按钮 /// private void btnPLCDB_Click(object sender, EventArgs e) { } /// /// 查看日志文件 /// private void button1_Click(object sender, EventArgs e) { Process.Start(GlobalContext.MainDir); } /// /// 设置按钮 /// private void button_vision_Click(object sender, EventArgs e) { } #endregion 菜单栏按钮 /// /// 带有权限的窗体访问管理 /// public void SwitchWnd(object sender, EventArgs e) { Button btn = sender as Button; if (m_currentButton != btn) { if (currentRole == "Admin" || currentRole == "SuperAdmin") { if (m_currentButton != null) m_currentButton.ImageIndex--; m_currentButton = btn; m_currentButton.ImageIndex++; if (m_currentForm != null) m_currentForm.Hide(); if (m_currentForm != m_dicForm[btn]) { m_currentForm = m_dicForm[btn]; m_currentForm.Show(); // 当没有点击“设置”按钮时,降级到操作员级别 if (btn.Name != "button_SystemSet" && btn.Name != "btnOrder" && btn.Name != "btnPLCDB" && btn.Name != "btnMES") { userAccount.UserSet(User.Operator); } } } else { if (btn.Name == "button_SystemSet" || btn.Name == "btnOrder" || btn.Name == "btnPLCDB" || btn.Name == "btnMES") { MessageBox.Show("您无权限进行此操作,请先登录!"); } else { if (m_currentButton != null) m_currentButton.ImageIndex--; m_currentButton = btn; m_currentButton.ImageIndex++; if (m_currentForm != null) m_currentForm.Hide(); if (m_currentForm != m_dicForm[btn]) { m_currentForm = m_dicForm[btn]; m_currentForm.Show(); } } } } } /// /// 改变用户时更新页面UI /// /// private void ForUserChangeToUpdate(User user) { currentRole = user.ToString(); switch (currentRole) { case "Operator": toolStripStatusLabel_user.Text = "操作员"; break; case "Admin": toolStripStatusLabel_user.Text = "管理员"; break; case "SuperAdmin": toolStripStatusLabel_user.Text = "超级管理员"; break; default: toolStripStatusLabel_user.Text = "未登录"; break; } } /// /// 模式更改事件 /// private void OnModeChanged() { } /// /// 记录日志的方法 /// /// 日志类型 /// 日志的值 private void WriteWorkLog(LogType logType, string logValue) { switch ((int)logType) { case 0: logNet.WriteDebug(logValue); break; case 1: logNet.WriteInfo(logValue); break; case 2: logNet.WriteWarn(logValue); break; case 3: logNet.WriteError(logValue); break; default: logNet.WriteFatal(logValue); break; } } } public enum LogType { Debug, Info, Warning, Error } }