MainForm.cs 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484
  1. using System;
  2. using System.Net;
  3. using System.Management;
  4. using System.Drawing;
  5. using System.Windows.Forms;
  6. using DevExpress.XtraTabbedMdi;
  7. using StackExchange.Redis;
  8. using ProjectBase.Controls;
  9. using ProjectBase.Data.Logs;
  10. using ProjectBase.Data.Redis;
  11. using ProjectBase.Data.BaseDAL;
  12. using ProjectBase.Util;
  13. using SIMDP.BLL;
  14. using SIMDP.Model;
  15. using SIMDP.View;
  16. using System.Reflection;
  17. namespace SIMDP.Project
  18. {
  19. public partial class MainForm : DevExpress.XtraBars.Ribbon.RibbonForm
  20. {
  21. //用来第一次创建动态菜单
  22. private RibbonPageHelper ribbonHelper = null;
  23. private delegate void messageDelegate();
  24. private NotifyWindow notifyWindow = null;
  25. SchedulerHelper task = new SchedulerHelper();
  26. private RedisHelper redis = new RedisHelper(0);
  27. UserIdleStatusHelper activityMonitor = new UserIdleStatusHelper(300000);//获取用户空闲状态类
  28. public MainForm()
  29. {
  30. InitializeComponent();
  31. DevExpress.LookAndFeel.UserLookAndFeel.Default.SetSkinStyle("Office 2019 Colorful");//设置主题样式
  32. }
  33. private void MainForm_Load(object sender, EventArgs e)
  34. {
  35. //ToDo:最小化托盘显示
  36. this.notifyIcon1.Visible = true;
  37. this.ribbonControl.Minimized = true;
  38. task.Start();
  39. GetIpMac();
  40. this.label_Version.Caption = "当前版本号:" + System.Configuration.ConfigurationManager.AppSettings["Version"];
  41. string defaultUser = System.Configuration.ConfigurationManager.AppSettings["DefaultUser"];
  42. if (defaultUser != null && defaultUser != "")
  43. {
  44. SysEnvironment.CurrentLoginID = defaultUser; //默认登录用户
  45. ////开启XX窗口
  46. //FormCurrentTask form = new FormCurrentTask();
  47. //form.MdiParent = this;
  48. //form.Show();
  49. }
  50. else
  51. {
  52. LogIn();
  53. }
  54. InitRibbonPage();
  55. SysSubscribeEvent();
  56. barButtonItemReset_ItemClick(this, null);
  57. // 刷卡登录界面
  58. //FormSwipeToLogin form = new FormSwipeToLogin();
  59. //form.Show();
  60. //开启XX窗口
  61. FormCurrentTask form = new FormCurrentTask();
  62. form.MdiParent = this;
  63. form.Show();
  64. //获取用户操作状态
  65. activityMonitor.Start();
  66. redis.Publish(SysEnvironment.UserOperateState, "");
  67. }
  68. private void GetIpMac()
  69. {
  70. //获取本机的IP地址和MAC地址
  71. IPAddress[] ipadrlist = Dns.GetHostAddresses(Dns.GetHostName());
  72. string ip = null;
  73. foreach (IPAddress item in ipadrlist)
  74. {
  75. if (item.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
  76. {
  77. ip = SysEnvironment.Ip = item.ToString();
  78. }
  79. }
  80. string mac = null;
  81. ManagementClass mc = new ManagementClass("Win32_NetworkAdapterConfiguration");
  82. ManagementObjectCollection moc = mc.GetInstances();
  83. foreach (ManagementObject mo in moc)
  84. {
  85. if ((bool)mo["IPEnabled"] == true)
  86. {
  87. mac = SysEnvironment.Mac = mo["MacAddress"].ToString();
  88. break;
  89. }
  90. }
  91. }
  92. /// <summary>
  93. /// 动态创建界面菜单对象
  94. /// </summary>
  95. private void InitRibbonPage()
  96. {
  97. try
  98. {
  99. //20220307 记录当前用户名、groupId
  100. MoAuthoryUser user = BLLFactory<BlAuthoryUser>.Instance.FindByID(SysEnvironment.CurrentLoginID);
  101. SysEnvironment.CurrentLoginName = user.UserName;
  102. SysEnvironment.CurrentLoginGroupId = user.GroupId;
  103. this.barStaticItem_User.Caption = string.Format("{0}", user.UserName);
  104. //动态创建界面菜单对象(防止重复构建)
  105. if (ribbonHelper == null)
  106. {
  107. ribbonHelper = new RibbonPageHelper(this, ref this.ribbonControl);
  108. ribbonHelper.AddPages();
  109. }
  110. }
  111. catch (Exception ex)
  112. {
  113. DevExpress.XtraEditors.XtraMessageBox.Show("获取该用户权限失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  114. LogHelper.log.Error(string.Format("初始化界面菜单出现错误:{0}", ex.ToString()));
  115. }
  116. }
  117. private void xtraTabbedMdiManager1_MouseDown(object sender, MouseEventArgs e)
  118. {
  119. if (e.Button != MouseButtons.Right)
  120. return;
  121. DevExpress.XtraTab.ViewInfo.BaseTabHitInfo hi = xtraTabbedMdiManager1.CalcHitInfo(new Point(e.X, e.Y));
  122. if (hi.HitTest == DevExpress.XtraTab.ViewInfo.XtraTabHitTest.PageHeader)
  123. {
  124. popupMenu1.ShowPopup(Cursor.Position);
  125. }
  126. }
  127. private void pop_CloseCurrent_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  128. {
  129. XtraMdiTabPage page = xtraTabbedMdiManager1.SelectedPage;
  130. if (page != null && page.MdiChild != null)
  131. {
  132. page.MdiChild.Close();
  133. }
  134. }
  135. private void pop_CloseAll_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  136. {
  137. foreach (Form form in this.MdiChildren)
  138. {
  139. form.Close();
  140. if (form != null && !form.IsDisposed)
  141. {
  142. form.Dispose();
  143. }
  144. }
  145. }
  146. private void pop_CloseOther_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  147. {
  148. XtraMdiTabPage selectedPage = xtraTabbedMdiManager1.SelectedPage;
  149. Type currentType = selectedPage.MdiChild.GetType();
  150. for (int i = xtraTabbedMdiManager1.Pages.Count - 1; i >= 0; i--)
  151. {
  152. XtraMdiTabPage page = xtraTabbedMdiManager1.Pages[i];
  153. if (page != null && page.MdiChild != null)
  154. {
  155. Form form = page.MdiChild;
  156. if (form.GetType() != currentType)
  157. {
  158. form.Close();
  159. if (form != null && !form.IsDisposed)
  160. {
  161. form.Dispose();
  162. }
  163. }
  164. }
  165. }
  166. }
  167. /// <summary>
  168. /// 登录验证
  169. /// </summary>
  170. private void LogIn()
  171. {
  172. Assembly asmb = Assembly.LoadFrom("SIMDP.View.dll");
  173. Type type = asmb.GetType("SIMDP.View.FormLogIn");
  174. // Type type = Type.GetType("SIMDP.View.FormLogIn");
  175. FormLogIn logIn = ChildWinManagement.LoadMdiForm(this, type) as FormLogIn;
  176. this.xtraTabbedMdiManager1.Pages[0].ShowCloseButton = DevExpress.Utils.DefaultBoolean.False;
  177. logIn.myRefresh += new FormLogIn.refresh(InitRibbonPage);
  178. }
  179. /// <summary>
  180. /// 退出系统
  181. /// </summary>
  182. /// <param name="sender"></param>
  183. /// <param name="e"></param>
  184. private void barBtnItem_Quit_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  185. {
  186. this.Close();
  187. }
  188. /// <summary>
  189. /// 重新登录
  190. /// </summary>
  191. /// <param name="sender"></param>
  192. /// <param name="e"></param>
  193. private void barBtnItem_ReLogIn_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  194. {
  195. SysEnvironment.CurrentLoginID = null;
  196. SysEnvironment.passWordMD5 = null;
  197. this.barStaticItem_User.Caption = "欢迎登录";
  198. pop_CloseAll_ItemClick(sender, e);
  199. this.ribbonControl.Pages.Clear();
  200. ribbonHelper = null;
  201. LogIn();
  202. }
  203. /// <summary>
  204. /// 修改密码
  205. /// </summary>
  206. /// <param name="sender"></param>
  207. /// <param name="e"></param>
  208. private void barBtnItem_EditPassWord_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  209. {
  210. FormChangePassWord passWord = new FormChangePassWord();
  211. passWord.ShowDialog();
  212. if (passWord.DialogResult == DialogResult.OK)
  213. {
  214. barBtnItem_ReLogIn_ItemClick(sender, e);
  215. }
  216. }
  217. /// <summary>
  218. /// OPC重新连接
  219. /// </summary>
  220. /// <param name="sender"></param>
  221. /// <param name="e"></param>
  222. private void barButtonItemReset_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  223. {
  224. try
  225. {
  226. PlcHelper.Instance.Connect();
  227. //Thread.Sleep(5000);
  228. if (e != null)
  229. DevExpress.XtraEditors.XtraMessageBox.Show("重新连接设备");
  230. }
  231. catch (Exception ex)
  232. {
  233. DevExpress.XtraEditors.XtraMessageBox.Show("重新连接设备失败\n" + ex.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  234. LogHelper.log.Error(string.Format("重新连接设备失败:{0}", ex.ToString()));
  235. }
  236. }
  237. /// <summary>
  238. /// OPC 断开
  239. /// </summary>
  240. /// <param name="sender"></param>
  241. /// <param name="e"></param>
  242. private void barButtonItemCancle_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
  243. {
  244. try
  245. {
  246. PlcHelper.Instance.Close();
  247. DevExpress.XtraEditors.XtraMessageBox.Show("设备连接已断开");
  248. }
  249. catch (Exception ex)
  250. {
  251. DevExpress.XtraEditors.XtraMessageBox.Show("设备连接断开失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  252. LogHelper.log.Error(string.Format("设备连接断开失败:{0}", ex.ToString()));
  253. }
  254. }
  255. /// <summary>
  256. /// 最小化托盘退出
  257. /// </summary>
  258. /// <param name = "sender" ></ param >
  259. /// < param name="e"></param>
  260. private void menu_Exit_Click(object sender, EventArgs e)
  261. {
  262. this.Close();
  263. }
  264. /// <summary>
  265. /// 窗口大小发生变化时发生
  266. /// </summary>
  267. /// <param name = "sender" ></ param >
  268. /// < param name="e"></param>
  269. private void MainForm_Resize(object sender, EventArgs e)
  270. {
  271. //ToDo:窗口最小化到托盘
  272. //if (this.WindowState == FormWindowState.Minimized)
  273. //{
  274. // this.Visible = false;
  275. // this.notifyIcon1.Visible = true;
  276. //}
  277. }
  278. /// <summary>
  279. /// 托盘鼠标双击事件
  280. /// </summary>
  281. /// <param name = "sender" ></ param >
  282. /// < param name="e"></param>
  283. private void notifyIcon1_MouseDoubleClick(object sender, MouseEventArgs e)
  284. {
  285. this.Visible = true;
  286. this.WindowState = FormWindowState.Maximized;
  287. this.Show();
  288. this.Activate();
  289. }
  290. private void menu_Hide_Click(object sender, EventArgs e)
  291. {
  292. this.Hide();
  293. }
  294. private void menu_Open_Click(object sender, EventArgs e)
  295. {
  296. notifyIcon1_MouseDoubleClick(sender, null);
  297. }
  298. private void MainForm_FormClosing(object sender, FormClosingEventArgs e)
  299. {
  300. if (DevExpress.XtraEditors.XtraMessageBox.Show("您确定要退出吗?", "新松智能制造数据平台", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes)
  301. {
  302. FormUserVerification form = new FormUserVerification();
  303. //form.ShowDialog();
  304. //if (form.DialogResult != DialogResult.OK)
  305. //{
  306. // DevExpress.XtraEditors.XtraMessageBox.Show("用户验证失败。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
  307. // e.Cancel = true;
  308. //}
  309. task.Stop();
  310. redis.UnsubscribeAll();
  311. }
  312. else
  313. {
  314. e.Cancel = true;
  315. }
  316. }
  317. /// <summary>
  318. /// 订阅系统提示消息
  319. /// </summary>
  320. private void SysSubscribeEvent()
  321. {
  322. string channel = SysEnvironment.SystemMessage;
  323. redis.Subscribe(channel, new Action<RedisChannel, RedisValue>(InsertSysMessage));
  324. string channel2 = SysEnvironment.UserOperateState;
  325. redis.Subscribe(channel2, new Action<RedisChannel, RedisValue>(RefreshUserState));
  326. }
  327. public delegate void delegateResetVertify();
  328. public static event delegateResetVertify eventUserIdle;
  329. /// <summary>
  330. /// 刷新用户操作状态
  331. /// </summary>
  332. /// <param name="channel"></param>
  333. /// <param name="message"></param>
  334. private void RefreshUserState(RedisChannel channel, RedisValue message)
  335. {
  336. if (InvokeRequired)
  337. {
  338. BeginInvoke(new Action(() =>
  339. {
  340. RefreshUserState(channel,message);
  341. }));
  342. return;
  343. }
  344. if (activityMonitor.IsIdle)
  345. {
  346. this.barStaticItem_Idle.Caption = "空闲";
  347. this.barStaticItem_Idle.ImageOptions.Image = Image.FromFile(Application.StartupPath + @"\Images\greenball.png");
  348. if (eventUserIdle != null)//未绑定时不会分配内存(功能界面打开才绑定),所以必须校验非null
  349. eventUserIdle();//触发权限超时事件
  350. }
  351. else
  352. {
  353. this.barStaticItem_Idle.Caption = "忙碌";
  354. this.barStaticItem_Idle.ImageOptions.Image = Image.FromFile(Application.StartupPath + @"\Images\redball.png");
  355. }
  356. }
  357. ///// <summary>
  358. ///// 刷新用户状态,如果空闲则关闭权限窗口
  359. ///// </summary>
  360. //private void RefreshState()
  361. //{
  362. // if (activityMonitor.IsIdle)
  363. // {
  364. // this.barStaticItem_Idle.Caption = "空闲";
  365. // this.barStaticItem_Idle.ImageOptions.Image = Image.FromFile(Application.StartupPath + @"\Images\greenball.png");
  366. // //close the UI that require authentication
  367. // foreach (Form form in this.MdiChildren)
  368. // {
  369. // if (form.GetType() == typeof(FormBarcodeManualEntry))
  370. // {
  371. // form.Close();
  372. // form.Dispose();
  373. // Device.AlarmHelper.LogAndNotice("提示", 1, "当前用户无操作,已退出权限功能界面");
  374. // }
  375. // }
  376. // }
  377. // else
  378. // {
  379. // this.barStaticItem_Idle.Caption = "忙碌";
  380. // this.barStaticItem_Idle.ImageOptions.Image = Image.FromFile(Application.StartupPath + @"\Images\redball.png");
  381. // }
  382. //}
  383. /// <summary>
  384. /// 发布时插入数据库
  385. /// </summary>
  386. /// <param name="channel"></param>
  387. /// <param name="message"></param>
  388. private void InsertSysMessage(RedisChannel channel, RedisValue message)
  389. {
  390. try
  391. {
  392. string[] arr = message.ToString().Split('|');
  393. MoSystemNotice mo = new MoSystemNotice();
  394. mo.NoticeTitle = arr[0];
  395. mo.NoticeType = Convert.ToInt32(arr[1]);
  396. mo.NoticeContent = arr[2];
  397. mo.NoticeTime = Convert.ToDateTime(arr[3]);
  398. mo.NoticeSign = Convert.ToBoolean(arr[4]);
  399. BLLFactory<BlSystemNotice>.Instance.Insert(mo);
  400. if (this.InvokeRequired)
  401. {
  402. messageDelegate mes = new messageDelegate(ShowSysMessage);
  403. this.Invoke(mes, null);
  404. }
  405. else
  406. {
  407. ShowSysMessage();
  408. }
  409. }
  410. catch (Exception ex)
  411. {
  412. LogHelper.log.Error("显示订阅系统提示信息 出现错误" + ex);
  413. }
  414. }
  415. //显示系统消息提示框
  416. private void ShowSysMessage()
  417. {
  418. if (notifyWindow == null || notifyWindow.IsDisposed)
  419. {
  420. notifyWindow = new NotifyWindow("系统提示信息", "");
  421. notifyWindow.SetDimensions(600, 200);
  422. notifyWindow.WaitTime = 50;
  423. notifyWindow.Notify();
  424. }
  425. else
  426. {
  427. notifyWindow.Activate();
  428. notifyWindow.RefreshWindow();
  429. return;
  430. }
  431. }
  432. }
  433. }