Form_Main.cs 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Windows.Forms;
  4. using StandardLibrary;
  5. using UserSettings;
  6. using System.Drawing;
  7. using System.Diagnostics;
  8. using System.Threading;
  9. using static StandardLibrary.UserAccount;
  10. using System.IO;
  11. using HslCommunication.LogNet;
  12. using System.Data;
  13. using MainForm.FaForm;
  14. using MainForm.ClassFile;
  15. using System.Threading.Tasks;
  16. using Newtonsoft.Json;
  17. using SqlSugar.Extensions;
  18. namespace MainForm
  19. {
  20. public partial class Form_Main : Form
  21. {
  22. #region 变量
  23. /// <summary>
  24. /// 窗体字典与窗体
  25. /// </summary>
  26. Dictionary<Button, Form> m_dicForm = new Dictionary<Button, Form>(); // 窗体字典
  27. Form m_currentForm = null; // 当前窗体
  28. public static Form_Home formHome;
  29. private Form_Order formOrder; // 订单维护窗体
  30. public static Form_DevAlarm formDevAlarm; // 设备运行情况窗体
  31. private Form_Alarm formAlarm; // 数据及报警查询窗体
  32. public static Form_PLCDB formPLCDB; // PLC点位维护窗体
  33. private Form_MESTest formMESTest; // MES手动调试窗体
  34. private Form_Other formOther; // 测试窗体
  35. private Form_SystemSet formSystemSet; // 设置页窗体
  36. /// <summary>
  37. /// 记录用户正在触发的按钮
  38. /// </summary>
  39. Button m_currentButton = null;
  40. /// <summary>
  41. /// 当前用户信息
  42. /// </summary>
  43. private UserAccount userAccount = new UserAccount();
  44. /// <summary>
  45. /// 当前用户角色
  46. /// </summary>
  47. string currentRole = "SuperAdmin";
  48. /// <summary>
  49. /// 是否可正常上传数据到MES(有2小时前的数据未上传则为2;正常为1)
  50. /// </summary>
  51. public static int IsNormal_MESServer = 0;
  52. /// <summary>
  53. /// 用于记录"运行日志"
  54. /// </summary>
  55. ILogNet logNet = new LogNetDateTime(GlobalContext.WorkLogDir, GenerateMode.ByEveryHour);
  56. #endregion 变量
  57. #region 窗体基础事件
  58. public Form_Main()
  59. {
  60. InitializeComponent();
  61. // 需要权限的按钮绑定权限控制事件
  62. this.btnOrder.Click += new System.EventHandler(this.SwitchWnd);
  63. this.Btn_DevAlarm.Click += new System.EventHandler(this.SwitchWnd);
  64. this.button_Alarm.Click += new System.EventHandler(this.SwitchWnd);
  65. this.btnPLCDB.Click += new System.EventHandler(this.SwitchWnd);
  66. this.btnMES.Click += new System.EventHandler(this.SwitchWnd);
  67. this.button_SystemSet.Click += new System.EventHandler(this.SwitchWnd);
  68. this.button_Other.Click += new System.EventHandler(this.SwitchWnd);
  69. this.button_Home.Click += new System.EventHandler(this.SwitchWnd);
  70. //this.button_Other.Click += new System.EventHandler(this.SwitchWnd);
  71. }
  72. /// <summary>
  73. /// 窗体加载事件
  74. /// </summary>
  75. /// <param name="sender"></param>
  76. /// <param name="e"></param>
  77. private void Form_Main_Load(object sender, EventArgs e)
  78. {
  79. try
  80. {
  81. #region 尝试关联启动“气密设备软件”(进程名QIMITest.exe)与“电测设备软件”(进程名MainForm.exe)。
  82. Task.Run(() =>
  83. {
  84. try
  85. {
  86. if (!ProcessHelper.CheckProcessActivityByProcessName("QIMITest")) // 进程名QIMITest.exe
  87. {
  88. string pathStr1 = @"D:\MES\QIMIAPP\QIMITest.exe";
  89. if (FileIOHelper.ISExists_File(pathStr1))
  90. ProcessHelper.StartProcess(pathStr1);
  91. }
  92. }
  93. catch { }
  94. try
  95. {
  96. if (!ProcessHelper.CheckProcessActivityByProcessName("MainForm")) // 进程名MainForm.exe
  97. {
  98. // 电测使用 ProcessHelper.StartProcess启动时页面UI异常,所以使用bat启动
  99. string pathStr2 = Application.StartupPath + @"\启动电测.bat";
  100. string pathStr3 = @"D:\MES\DianCeAPP\MainForm.exe";
  101. if (FileIOHelper.ISExists_File(pathStr2) && FileIOHelper.ISExists_File(pathStr3))
  102. ProcessHelper.StartProcess(pathStr2);
  103. }
  104. }
  105. catch { }
  106. });
  107. #endregion 尝试关联启动“气密设备软件”与“电测设备软件”
  108. //初始化目录
  109. //if (!Directory.Exists(GlobalContext.DBDir)) Directory.CreateDirectory(GlobalContext.DBDir); // 判断路径是否存在,不存在则创建路径
  110. //if (!Directory.Exists(GlobalContext.ProcessDataDir)) Directory.CreateDirectory(GlobalContext.ProcessDataDir); // 判断路径是否存在,不存在则创建路径
  111. //if (!Directory.Exists(GlobalContext.OneCheckDataDir)) Directory.CreateDirectory(GlobalContext.OneCheckDataDir); // 判断路径是否存在,不存在则创建路径
  112. if (!Directory.Exists(GlobalContext.MqttDeviceStateDir)) Directory.CreateDirectory(GlobalContext.MqttDeviceStateDir); // 判断路径是否存在,不存在则创建路径
  113. if (!Directory.Exists(GlobalContext.MqttInputBeginDir)) Directory.CreateDirectory(GlobalContext.MqttInputBeginDir); // 判断路径是否存在,不存在则创建路径
  114. if (!Directory.Exists(GlobalContext.MqttOperateLogDir)) Directory.CreateDirectory(GlobalContext.MqttOperateLogDir); // 判断路径是否存在,不存在则创建路径
  115. if (!Directory.Exists(GlobalContext.MqttAlarmLogDir)) Directory.CreateDirectory(GlobalContext.MqttAlarmLogDir); // 判断路径是否存在,不存在则创建路径
  116. if (!Directory.Exists(GlobalContext.MqttPassResultLogDir)) Directory.CreateDirectory(GlobalContext.MqttPassResultLogDir); // 判断路径是否存在,不存在则创建路径
  117. if (!Directory.Exists(GlobalContext.MqttPassDetailLogDir)) Directory.CreateDirectory(GlobalContext.MqttPassDetailLogDir); // 判断路径是否存在,不存在则创建路径
  118. if (!Directory.Exists(GlobalContext.MqttFileUpLogDir)) Directory.CreateDirectory(GlobalContext.MqttFileUpLogDir); // 判断路径是否存在,不存在则创建路径
  119. if (!Directory.Exists(GlobalContext.MqttFileBackupLogDir)) Directory.CreateDirectory(GlobalContext.MqttFileBackupLogDir); // 判断路径是否存在,不存在则创建路径
  120. if (!Directory.Exists(GlobalContext.MqttDeviceConfigLogDir)) Directory.CreateDirectory(GlobalContext.MqttDeviceConfigLogDir); // 判断路径是否存在,不存在则创建路径
  121. if (!Directory.Exists(GlobalContext.MaterialVerifyLog)) Directory.CreateDirectory(GlobalContext.MaterialVerifyLog); // 判断路径是否存在,不存在则创建路径
  122. GlobalContext.UpdateData();
  123. //创建窗体及事件
  124. formOrder = new Form_Order(); // 订单维护窗体
  125. formDevAlarm = new Form_DevAlarm(); // 设备运行情况窗体
  126. formAlarm = new Form_Alarm(); // 数据及报警查询窗体
  127. formPLCDB = new Form_PLCDB(); // PLC点位维护窗体
  128. formMESTest = new Form_MESTest(); // MES手动调试窗体
  129. formOther = new Form_Other(); // 测试窗体
  130. formSystemSet = new Form_SystemSet(); // 设置页窗体
  131. formHome = new Form_Home(); // 首页窗体
  132. userAccount.UserChangedEvent += new UserChangedHandler(ForUserChangeToUpdate); // 改变用户时更新页面信息
  133. userAccount.UserChangedEvent += new UserChangedHandler(formOrder.ForUserChangeToUpdate); // 改变用户时更新页面信息
  134. userAccount.UserChangedEvent += new UserChangedHandler(formPLCDB.ForUserChangeToUpdate); // 改变用户时更新页面信息
  135. userAccount.UserChangedEvent += new UserChangedHandler(formSystemSet.ForUserChangeToUpdate); // 改变用户时更新页面信息
  136. formHome.MessageEvent += new HomeMessageHandler(WriteWorkLog); // 写入工作日志
  137. formOrder.MessageEvent += new OrderMessageHandler(WriteWorkLog); // 写入工作日志
  138. formSystemSet.MessageEvent += new SystemSetMessageHandler(WriteWorkLog); // 写入工作日志
  139. formDevAlarm.MessageEvent += new AlarmMessageHandler(formHome.AddMessage);
  140. formAlarm.MessageEvent += new AlarmMessageHandler(formHome.AddMessage);
  141. formPLCDB.MessageEvent += new AlarmMessageHandler(formHome.AddMessage);
  142. formMESTest.MessageEvent += new AlarmMessageHandler(formHome.AddMessage);
  143. //formAlarm.SaveProcessDataEvent += new HomeSaveProcessDataHandler(formHome.SaveProcessDataByDB); // 保存加工数据的事件
  144. //formAlarm.SaveOneCheckDataEvent += new HomeSaveOneCheckDataHandler(formHome.SaveOneCheckDataByDB); // 保存点检数据的事件
  145. //formAlarm.SaveAlarmDataEvent += new HomeSaveAlarmDataHandler(formHome.SaveAlarmDataByDB); // 保存报警数据的事件
  146. this.Text += " - V" + Application.ProductVersion; // 显示版本信息
  147. // Btn_DevAlarm
  148. m_dicForm.Add(btnOrder, formOrder); // 将按钮与事件存到字典中
  149. m_dicForm.Add(Btn_DevAlarm, formDevAlarm); // 将按钮与事件存到字典中
  150. m_dicForm.Add(button_Alarm, formAlarm); // 将按钮与事件存到字典中
  151. m_dicForm.Add(btnPLCDB, formPLCDB); // 将按钮与事件存到字典中
  152. m_dicForm.Add(btnMES, formMESTest); // 将按钮与事件存到字典中
  153. m_dicForm.Add(button_SystemSet, formSystemSet); // 将按钮与事件存到字典中
  154. m_dicForm.Add(button_Home, formHome); // 将按钮与事件存到字典中
  155. m_dicForm.Add(button_Other, formOther); // 将按钮与事件存到字典中
  156. foreach (KeyValuePair<Button, Form> kp in m_dicForm) // 设置窗体属性(无边框、嵌套、停靠)
  157. {
  158. kp.Value.TopLevel = false;
  159. kp.Value.FormBorderStyle = FormBorderStyle.None;
  160. kp.Value.Parent = this.panelMain;
  161. kp.Value.Dock = DockStyle.Fill;
  162. }
  163. GlobalContext.UpdateData();
  164. SQLHelper.DBInitWork(); // 初始化数据库
  165. SQLHelper.CreateDataBase_DBMain(); // 初始化主数据库
  166. button_Home.PerformClick(); // 模拟点击button_Home按钮
  167. currentRole = ""; // 重置当前用户的角色
  168. OnModeChanged(); // 模式更改事件
  169. Task.Run(() => DBChanged());
  170. #region 定时任务
  171. ////timer1.Interval = 60000; // 间隔一分钟
  172. //timer1.Interval = 1800000; // 间隔半小时
  173. //timer1.Enabled = true; // 开启
  174. #endregion 定时任务
  175. }
  176. catch (Exception ex)
  177. {
  178. string str = ex.StackTrace;
  179. logNet.WriteError("主窗体初始化出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  180. MessageBox.Show("主窗体初始化出错!异常信息:" + ex.Message.ToString());
  181. }
  182. }
  183. /// <summary>
  184. /// 窗体关闭事件
  185. /// </summary>
  186. private void Form_Main_FormClosing(object sender, FormClosingEventArgs e)
  187. {
  188. Form_Home home=new Form_Home();
  189. home.operateToIot("shutdown", "关闭");
  190. formHome.Closed2();
  191. if (GlobalContext.Save != null)
  192. GlobalContext.Save();
  193. }
  194. /// <summary>
  195. /// 定时任务
  196. /// </summary>
  197. private void timer1_Tick(object sender, EventArgs e)
  198. {
  199. try
  200. {
  201. DateTime dtNow = DateTime.Now;
  202. #region 检测2h前是否有漏传的数据,有就报警
  203. // 检测2h前是否有漏传的数据,有就报警
  204. ProcessData processData0 = new ProcessData();
  205. string QuerySQL0 = processData0.ToStringQueryCount(dtNow.AddHours(-2).ToString("yyyy-MM-dd HH:mm:ss"), "未上传");
  206. DataSet ds1 = SQLHelper_New.Query(QuerySQL0, null);
  207. if (ds1 != null && ds1.Tables.Count > 0 && ds1.Tables[0].Rows.Count > 0)
  208. {
  209. int count = ds1.Tables[0].Rows[0][0].ObjToInt();
  210. IsNormal_MESServer = count < 1 ? 1 : 2;
  211. }
  212. #endregion 检测2h前是否有漏传的数据,有就报警
  213. #region 检查48h内(正常就2h内的数据)是否有漏传的数据,有就重新上传
  214. // 检查MES地址是否可以ping通
  215. bool mesret = HttpUitls.PingIP(GlobalContext.ServerHost);
  216. if (!mesret)
  217. return;
  218. // 查询所有未上传的值-6h
  219. ProcessData processData = new ProcessData();
  220. string QuerySQL = processData.ToStringQuery2(dtNow.AddHours(-48).ToString("yyyy-MM-dd HH:mm:ss"), dtNow.ToString("yyyy-MM-dd HH:mm:ss"), "未上传");
  221. DataSet ds = SQLHelper_New.Query(QuerySQL, null);
  222. if (ds != null && ds.Tables.Count > 0 && ds.Tables[0].Rows.Count > 0)
  223. {
  224. for (int i = 0; i < ds.Tables[0].Rows.Count; i++)
  225. {
  226. var idStr = ds.Tables[0].Rows[i][0].ToString().Trim();
  227. // 上传
  228. var processData1 = new List<ProcessData>(){
  229. new ProcessData()
  230. {
  231. Equipment_code = ds.Tables[0].Rows[i][1].ToString().Trim(),
  232. Workorder_code = ds.Tables[0].Rows[i][2].ToString().Trim(),
  233. //Batch_number = ds.Tables[0].Rows[i][3].ToString().Trim(),
  234. Sn = ds.Tables[0].Rows[i][4].ToString().Trim(),
  235. Testitem = ds.Tables[0].Rows[i][5].ToString().Trim(),
  236. Parameter_values = JsonConvert.DeserializeObject<List<TestItem>>(ds.Tables[0].Rows[i][6].ToString().Trim()),
  237. Write_user = ds.Tables[0].Rows[i][7].ToString().Trim(),
  238. Test_time = ds.Tables[0].Rows[i][8].ToString().Trim(),
  239. }
  240. };
  241. var jsonstr = JsonConvert.SerializeObject(processData1);
  242. if (GlobalContext.IsSendProcessData) // 上传mes
  243. {
  244. string url = @"HTTP://" + GlobalContext.ServerHost + ":" + @"/api/ProductionLine/ProcessData";
  245. string mesRet = HttpUitls.SubmitDataToMES(url, jsonstr);
  246. int upload = 0;
  247. //本地数据
  248. if (mesRet == "成功")
  249. {
  250. upload = 1;
  251. SQLHelper_New.ExecuteSQL(ProcessData.ToStringUpdateStatusByID(upload,0, idStr), null);
  252. }
  253. else
  254. {
  255. upload = 0;
  256. }
  257. logNet.WriteInfo("定时任务上传加工数据【Id:" + idStr + "】到MES服务器---" + mesRet);
  258. }
  259. // 定时任务运行超过30分钟,则停止运行
  260. var dtLong = (DateTime.Now - dtNow).TotalMinutes;
  261. if (dtLong > 30)
  262. {
  263. break;
  264. }
  265. }
  266. }
  267. #endregion 检查48h内是否有流传的数据,有就重新上传
  268. }
  269. catch (Exception ex)
  270. {
  271. string str = ex.StackTrace;
  272. logNet.WriteError("定时检查加工数据漏传的任务执行出错!异常位置:" + str.Substring(str.LastIndexOf("\\") + 1, str.Length - str.LastIndexOf("\\") - 1) + ";异常信息:" + ex.Message.ToString());
  273. }
  274. }
  275. /// <summary>
  276. /// 监控时间同步到数据库配置中
  277. /// </summary>
  278. /// <returns></returns>
  279. private void DBChanged()
  280. {
  281. try
  282. {
  283. while (true)
  284. {
  285. string dbNow = "DB" + DateTime.Now.ToString("yyyyMM");
  286. if (SQLHelper.dataBaseName != dbNow)
  287. {
  288. SQLHelper.DBInitWork();
  289. }
  290. Thread.Sleep(5000);
  291. }
  292. }
  293. catch (Exception ex)
  294. {
  295. WriteWorkLog(LogType.Error, "实时监听创建数据库出错!错误信息:" + ex.Message);
  296. }
  297. }
  298. #endregion 窗体基础事件
  299. #region 菜单栏按钮
  300. /// <summary>
  301. /// 登录按钮事件
  302. /// </summary>
  303. private void button_Login_Click(object sender, EventArgs e)
  304. {
  305. Form formOpen = Application.OpenForms["Form_UserLogin"];//查找是否打开过窗体
  306. if ((formOpen == null) || (formOpen.IsDisposed)) //如果没有打开过
  307. {
  308. Form_UserLogin form = new Form_UserLogin(userAccount);
  309. form.ShowDialog(); //打开窗体
  310. }
  311. else
  312. {
  313. formOpen.Activate(); //如果已经打开过就让窗体获得焦点
  314. formOpen.WindowState = FormWindowState.Normal;//使恢复正常窗体大小
  315. }
  316. }
  317. /// <summary>
  318. /// 订单按钮
  319. /// </summary>
  320. private void btnOrder_Click(object sender, EventArgs e)
  321. {
  322. }
  323. /// <summary>
  324. /// 查看数据记录
  325. /// </summary>
  326. private void button_Alarm_Click(object sender, EventArgs e)
  327. {
  328. }
  329. /// <summary>
  330. /// PLCDB按钮
  331. /// </summary>
  332. private void btnPLCDB_Click(object sender, EventArgs e)
  333. {
  334. }
  335. /// <summary>
  336. /// 查看日志文件
  337. /// </summary>
  338. private void button1_Click(object sender, EventArgs e)
  339. {
  340. Process.Start(GlobalContext.MainDir);
  341. }
  342. /// <summary>
  343. /// 设置按钮
  344. /// </summary>
  345. private void button_vision_Click(object sender, EventArgs e)
  346. {
  347. }
  348. #endregion 菜单栏按钮
  349. /// <summary>
  350. /// 带有权限的窗体访问管理
  351. /// </summary>
  352. public void SwitchWnd(object sender, EventArgs e)
  353. {
  354. Button btn = sender as Button;
  355. if (m_currentButton != btn)
  356. {
  357. if (currentRole == "Admin" || currentRole == "SuperAdmin")
  358. {
  359. if (m_currentButton != null)
  360. m_currentButton.ImageIndex--;
  361. m_currentButton = btn;
  362. m_currentButton.ImageIndex++;
  363. if (m_currentForm != null)
  364. m_currentForm.Hide();
  365. if (m_currentForm != m_dicForm[btn])
  366. {
  367. m_currentForm = m_dicForm[btn];
  368. m_currentForm.Show();
  369. // 当没有点击“设置”按钮时,降级到操作员级别
  370. if (btn.Name != "button_SystemSet" && btn.Name != "btnOrder"
  371. && btn.Name != "btnPLCDB" && btn.Name != "btnMES")
  372. {
  373. userAccount.UserSet(User.Operator);
  374. }
  375. }
  376. }
  377. else
  378. {
  379. if (btn.Name == "button_SystemSet" || btn.Name == "btnOrder"
  380. || btn.Name == "btnPLCDB" || btn.Name == "btnMES")
  381. {
  382. MessageBox.Show("您无权限进行此操作,请先登录!");
  383. }
  384. else
  385. {
  386. if (m_currentButton != null)
  387. m_currentButton.ImageIndex--;
  388. m_currentButton = btn;
  389. m_currentButton.ImageIndex++;
  390. if (m_currentForm != null)
  391. m_currentForm.Hide();
  392. if (m_currentForm != m_dicForm[btn])
  393. {
  394. m_currentForm = m_dicForm[btn];
  395. m_currentForm.Show();
  396. }
  397. }
  398. }
  399. }
  400. }
  401. /// <summary>
  402. /// 改变用户时更新页面UI
  403. /// </summary>
  404. /// <param name="user"></param>
  405. private void ForUserChangeToUpdate(User user)
  406. {
  407. currentRole = user.ToString();
  408. switch (currentRole)
  409. {
  410. case "Operator":
  411. toolStripStatusLabel_user.Text = "操作员";
  412. break;
  413. case "Admin":
  414. toolStripStatusLabel_user.Text = "管理员";
  415. break;
  416. case "SuperAdmin":
  417. toolStripStatusLabel_user.Text = "超级管理员";
  418. break;
  419. default:
  420. toolStripStatusLabel_user.Text = "未登录";
  421. break;
  422. }
  423. }
  424. /// <summary>
  425. /// 模式更改事件
  426. /// </summary>
  427. private void OnModeChanged()
  428. {
  429. }
  430. /// <summary>
  431. /// 记录日志的方法
  432. /// </summary>
  433. /// <param name="logType">日志类型</param>
  434. /// <param name="logValue">日志的值</param>
  435. private void WriteWorkLog(LogType logType, string logValue)
  436. {
  437. switch ((int)logType)
  438. {
  439. case 0:
  440. logNet.WriteDebug(logValue);
  441. break;
  442. case 1:
  443. logNet.WriteInfo(logValue);
  444. break;
  445. case 2:
  446. logNet.WriteWarn(logValue);
  447. break;
  448. case 3:
  449. logNet.WriteError(logValue);
  450. break;
  451. default:
  452. logNet.WriteFatal(logValue);
  453. break;
  454. }
  455. }
  456. }
  457. public enum LogType
  458. {
  459. Debug,
  460. Info,
  461. Warning,
  462. Error
  463. }
  464. }