frmMonitor.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. using com.hnshituo.core.webapp.vo;
  2. using Common;
  3. using Infragistics.Win.UltraWinGrid;
  4. using JC_MeasuringSystem;
  5. using MeterModuleLibrary.uc;
  6. using MeterPlugInLibrary;
  7. using System;
  8. using System.Collections;
  9. using System.Collections.Generic;
  10. using System.ComponentModel;
  11. using System.Data;
  12. using System.Diagnostics;
  13. using System.Drawing;
  14. using System.IO;
  15. using System.IO.Ports;
  16. using System.Linq;
  17. using System.Net;
  18. using System.Text;
  19. using System.Threading;
  20. using System.Threading.Tasks;
  21. using System.Windows.Forms;
  22. namespace CarMonitor
  23. {
  24. public partial class frmMonitor : Form
  25. {
  26. public frmMonitor()
  27. {
  28. InitializeComponent();
  29. }
  30. Log lg = Log.GetInstance();
  31. BaseDbCls bd = new BaseDbCls();
  32. private string sVoice = "";
  33. private Thread thVoice = null;
  34. VoicePlay vp = new VoicePlay();
  35. private frmMsgInfo fm = null;
  36. string userId = "", userName = "";
  37. DbHelper db = new DbHelper();
  38. MeterWorkMonitorService monitorService = new MeterWorkMonitorService();
  39. private void frmMonitor_Load(object sender, EventArgs e)
  40. {
  41. PbCacheMonitor.frmMsgClosingTime = DateTime.Now;
  42. timer2.Start();
  43. userId = ((ST_MainForm)(this.MdiParent)).UserID;
  44. userName = ((ST_MainForm)(this.MdiParent)).UserName;
  45. #region 载入计量点的信息
  46. bd.setBaseDb();
  47. bd.getDb();
  48. setGridData();
  49. foreach (UltraGridRow ugr in ultraGridPW.Rows)
  50. {
  51. if (ugr.Cells["monitorUserNo"].Text.Trim() != "" && ugr.Cells["monitorUserNo"].Text.Trim() == userName)
  52. {
  53. ugr.Cells["UNCK"].Value = true;
  54. ucCarMonitoring uc = new ucCarMonitoring();
  55. uc.strCollectNo = ugr.Cells["collectionCode"].Text.Trim();
  56. uc.Name = "uc" + ugr.Cells["pointNo"].Text;
  57. uc.sUserId = userId;
  58. uc.sName = userName;
  59. uc.sPoint= ugr.Cells["pointNo"].Text;
  60. uc.sPointName= ugr.Cells["pointName"].Text;
  61. uc.ucMonitoringEvent += new EventHandler(ucEvent);
  62. uc.evoice += new EventVoice(setsVoice);
  63. //****************************************注意下面这个**********************
  64. // uc.moxaip = dtPointInfo.Rows[k]["MOXAIP"].ToString().Trim();
  65. uc.openMsg += new EventOpenMsg(OpenMsg);
  66. uc.rowPointInfo = null;
  67. uc.BorderStyle = BorderStyle.FixedSingle;
  68. uc.db = db;
  69. flPanel.Controls.Add(uc);
  70. }
  71. else
  72. {
  73. ugr.Cells["UNCK"].Value = false;
  74. }
  75. }
  76. ClsControlPack.RefreshAndAutoSize(this.ultraGridPW);
  77. #endregion
  78. thVoice = new Thread(ThVoice);
  79. thVoice.Start();
  80. }
  81. public void setGridData()
  82. {
  83. DataTable dt = dtJGPointInfo.Clone();
  84. if (PbCacheMonitor.ltWorkMonitor != null && PbCacheMonitor.ltWorkMonitor.Count > 0)
  85. {
  86. foreach (MeterWorkMonitor mwm in PbCacheMonitor.ltWorkMonitor)
  87. {
  88. DataRow dr = dt.NewRow();
  89. dr["pointNo"] = mwm.pointNo;
  90. dr["pointName"] = mwm.pointName;
  91. dr["monitorUserNo"] = mwm.monitorUserNo;
  92. dr["collectionCode"] = mwm.collectionCode;
  93. dt.Rows.Add(dr);
  94. }
  95. }
  96. ClsControlPack.CopyDataToDatatable(ref dt, ref this.dtJGPointInfo, true);
  97. ClsControlPack.RefreshAndAutoSize(this.ultraGridPW);
  98. }
  99. /// <summary>
  100. /// 对应用户控件的ucMonitoringEvent;将用户控件回调到主界面执行,用于打开语音对讲或打开新的界面
  101. /// </summary>
  102. /// <param name="sender"></param>
  103. /// <param name="e"></param>
  104. public void ucEvent(object sender, EventArgs e)
  105. {
  106. Control control = (Control)sender;
  107. ucCarMonitoring um = control.Parent.Parent.Parent.Parent as ucCarMonitoring;
  108. bool bMainUm = true;
  109. if (control.Name == "btnSee")
  110. {
  111. um = control.Parent.Parent.Parent as ucCarMonitoring;
  112. }
  113. if (um == null)
  114. {
  115. frmProductVoice fv = control.Parent.Parent.Parent.Parent.Parent as frmProductVoice;
  116. um = fv._uc;
  117. bMainUm = false;
  118. }
  119. PbCacheMonitor.sportInfo = PbCacheMonitor.sportInfos.Where(s => s.baseSpotNo == um.sPoint).FirstOrDefault();
  120. //ucProductMonitoring um = control as ucProductMonitoring;
  121. try
  122. {
  123. switch (control.Name)
  124. {
  125. case "btnIpVoice":
  126. {
  127. //表示曾经打开了一个语音,且不是当前点击的这个语音
  128. if (um.sPoint != openPointNo && !string.IsNullOrEmpty(openPointNo))
  129. MessageBox.Show("一次只能打开一个语音对讲!");
  130. else
  131. VoiceOption(um, bMainUm);
  132. };
  133. break;
  134. case "btnSee":
  135. {
  136. frmProductVoice fpv = new frmProductVoice();
  137. fpv.ucMonitoringEvent += new EventHandler(ucEvent);
  138. fpv.Text = um.sPointName;
  139. fpv._uc = um;
  140. fpv.db = db;
  141. fpv.ShowDialog();
  142. };
  143. break;
  144. }
  145. }
  146. catch (Exception ex)
  147. {
  148. MessageBox.Show("操作异常:" + ex.Message);
  149. }
  150. }
  151. /// <summary>
  152. /// 现场求助信息为:1呼叫待接听,从用户控件中回调主界面方法
  153. /// </summary>
  154. /// <param name="pointName"></param>
  155. private void OpenMsg(string pointName)
  156. {
  157. try
  158. {
  159. if (string.IsNullOrEmpty(openPointNo) && !bMsgOpen)
  160. {
  161. if (PbCacheMonitor.frmMsgClosingTime == null)
  162. {
  163. bMsgOpen = true;
  164. fm = frmMsgInfo.CreateInstrance(this);
  165. fm.TopMost = true;
  166. fm.setLbTxt(pointName);
  167. fm.Show();
  168. }
  169. else
  170. {
  171. TimeSpan secondSpan = new TimeSpan(DateTime.Now.Ticks - PbCacheMonitor.frmMsgClosingTime.Value.Ticks);
  172. if (secondSpan.TotalSeconds > 10)
  173. {
  174. bMsgOpen = true;
  175. fm = frmMsgInfo.CreateInstrance(this);
  176. fm.TopMost = true;
  177. fm.setLbTxt(pointName);
  178. fm.Show();
  179. }
  180. }
  181. }
  182. if (!string.IsNullOrEmpty(openPointNo) && fm != null)
  183. {
  184. fm.CloseFrm();
  185. }
  186. }
  187. catch { }
  188. }
  189. public bool bMsgOpen = false;
  190. /// <summary>
  191. /// 用户控件中调用语音提示操作;具体操作在下面的线程ThVoice中处理
  192. /// </summary>
  193. /// <param name="sender"></param>
  194. /// <param name="e"></param>
  195. private void setsVoice(object sender, string e)
  196. {
  197. sVoice += e + "|";
  198. }
  199. /// <summary>
  200. /// fm为frmMsgInfo
  201. /// </summary>
  202. private void ThVoice()
  203. {
  204. while (true)
  205. {
  206. if (string.IsNullOrEmpty(openPointNo))
  207. {
  208. //挂断操作
  209. sVoice = "";
  210. if (fm != null && bMsgOpen && PbCacheMonitor.ltWorkMonitor != null)
  211. {
  212. int icount = PbCacheMonitor.ltWorkMonitor.Where(s => s.isHelp != null && s.isHelp == "1").Count();
  213. if (icount == 0)
  214. {
  215. fm.setFrmNull();
  216. fm = null;
  217. }
  218. }
  219. }
  220. else if (bMsgOpen)
  221. {
  222. //弹出了语音呼叫界面
  223. sVoice = "";
  224. }
  225. else if (sVoice != "")
  226. {
  227. /* //注销下面播放提示语音的代码
  228. //string[] sVoiceFirst = sVoice.Split("|");
  229. int i = sVoice.IndexOf("|");
  230. if (i > 0)
  231. {
  232. string voiceOpen = sVoice.Substring(0, i);
  233. sVoice = sVoice.Substring(i + 1);
  234. vp.GetVoicePlay(voiceOpen, "");
  235. //Thread.Sleep();
  236. }
  237. else
  238. {
  239. Thread.Sleep(2000);
  240. }
  241. //*/
  242. }
  243. else
  244. {
  245. Thread.Sleep(2000);
  246. }
  247. }
  248. }
  249. #region 语音对讲
  250. /// <summary>
  251. /// 硬盘录像机登录
  252. /// </summary>
  253. DhCameraShot cameraShotMain = new DhCameraShot();
  254. /// <summary>
  255. /// 必须先打开连接
  256. /// </summary>
  257. private bool GetIPVideo(MeterBaseVideoinfo video)
  258. {
  259. try
  260. {
  261. cameraShotMain.ip = video.videoip;
  262. cameraShotMain.port = video.vdoPort;
  263. cameraShotMain.uid = video.vdoUser;
  264. cameraShotMain.pwd = video.vdoPwd;
  265. cameraShotMain.Connection();
  266. }
  267. catch (Exception ex)
  268. {
  269. MessageBox.Show(ex.Message);
  270. return false;
  271. }
  272. return true;
  273. }
  274. /// <summary>
  275. /// 必须先打开视频,然后再打开语音
  276. /// </summary>
  277. private void VoiceOpen()
  278. {
  279. try
  280. {
  281. cameraShotMain.StartTalk();
  282. }
  283. catch (Exception exp)
  284. {
  285. MessageBox.Show("打开语音失败:" + exp.Message);
  286. }
  287. }
  288. /// <summary>
  289. /// 关闭语音对讲
  290. /// </summary>
  291. private void VoiceClose()
  292. {
  293. try
  294. {
  295. cameraShotMain.StopTalk();
  296. }
  297. catch (Exception exp)
  298. {
  299. MessageBox.Show("关闭失败" + exp.Message);
  300. }
  301. }
  302. /// <summary>
  303. /// 关闭视频
  304. /// </summary>
  305. private void IPVideoClose()
  306. {
  307. try
  308. {
  309. //退出视频及语音登录
  310. cameraShotMain.Close();
  311. }
  312. catch (Exception exp)
  313. {
  314. MessageBox.Show(exp.Message);
  315. }
  316. }
  317. #endregion
  318. private string openPointNo = "";
  319. private void VoiceOption(ucCarMonitoring um, bool bMainUm)
  320. {
  321. if (PbCacheMonitor.ltWorkMonitor == null || PbCacheMonitor.ltWorkMonitor.Count == 0)
  322. {
  323. MessageBox.Show("获取计量点信息异常,请稍后再试");
  324. return;
  325. }
  326. MeterWorkMonitor monitor = PbCacheMonitor.ltWorkMonitor.Where(s => s.pointNo == um.sPoint).FirstOrDefault();
  327. if (monitor == null)
  328. {
  329. MessageBox.Show("获取当前计量点信息异常,请稍后再试");
  330. return;
  331. }
  332. //当前计量点已开启语音对讲
  333. if (!um.isNcFlag) //未开启
  334. {
  335. //进行开启操作,并修改监控表的标识位
  336. bd.getSpot();
  337. GetIPVideo(PbCacheMonitor.videoInfo);
  338. VoiceOpen();
  339. um.setBtnVoiceText("挂断");
  340. UpdateCarijeg(new MeterWorkMonitor { pointNo = monitor.pointNo, isHelp = "2" });
  341. um.isNcFlag = true;
  342. um.bOpenVoice = false;
  343. openPointNo = um.sPoint;
  344. //um.cameraShotMain = cameraShotMain;
  345. lg.WriteLog(4, "开启语音的计量点:" + um.sPointName + ",对应的IP地址为:" + PbCacheMonitor.videoInfo.videoip);
  346. }
  347. else
  348. {
  349. //进行挂断操作,并修改监控表的标识位
  350. bd.getSpot();
  351. VoiceClose();
  352. /*
  353. if (bMainUm)
  354. {
  355. IPVideoClose();
  356. }
  357. //*/
  358. IPVideoClose();
  359. um.setBtnVoiceText("对讲");
  360. UpdateCarijeg(new MeterWorkMonitor { pointNo = monitor.pointNo, isHelp = "0" });
  361. um.isNcFlag = false;
  362. um.bOpenVoice = true;
  363. openPointNo = "";
  364. //um.cameraShotMain = null;
  365. lg.WriteLog(4, "关闭语音的计量点:" + um.sPointName + ",对应的IP地址为:" + PbCacheMonitor.videoInfo.videoip);
  366. }
  367. }
  368. /// <summary>
  369. /// 修改数据到接管表
  370. /// </summary>
  371. private void UpdateCarijeg(MeterWorkMonitor monitor)
  372. {
  373. RESTfulResult<string> rms = monitorService.doUpdateWf(monitor);
  374. if (!rms.Succeed)
  375. {
  376. lg.WriteLog(4, "写入数据失败");
  377. }
  378. }
  379. private void timer2_Tick(object sender, EventArgs e)
  380. {
  381. try
  382. {
  383. if (bd.getDb())
  384. {
  385. foreach (MeterWorkMonitor mon in PbCacheMonitor.ltWorkMonitor)
  386. {
  387. foreach (Control cn in flPanel.Controls)
  388. {
  389. if (cn.Name.Contains("uc"))
  390. {
  391. ucCarMonitoring ucCar = cn as ucCarMonitoring;
  392. if (ucCar.sPoint == mon.pointNo)
  393. {
  394. ucCar.rowPointInfo = mon;
  395. }
  396. }
  397. }
  398. }
  399. }
  400. else
  401. {
  402. lg.WriteLog(4, "未找到实时监控数据");
  403. }
  404. //*/
  405. }
  406. catch (Exception ex)
  407. {
  408. lg.WriteLog(4, "数据库连接异常");
  409. }
  410. }
  411. private void ultraGridPW_CellChange(object sender, CellEventArgs e)
  412. {
  413. ultraGridPW.UpdateData();
  414. UltraGridRow ugr = ultraGridPW.ActiveRow;
  415. if (ugr != null)
  416. {
  417. if (ugr.Cells["UNCK"].Value.ToString().ToLower() == "false")
  418. {
  419. if (!string.IsNullOrEmpty(openPointNo) && openPointNo == ugr.Cells["pointNo"].Text.Trim())
  420. {
  421. ugr.Cells["UNCK"].Value = true;
  422. MessageBox.Show("当前计量点开启了语音,请先关闭语音"); //若要自动关闭则看Form_Closing事件代码即可
  423. return;
  424. }
  425. flPanel.Controls.RemoveByKey("uc" + ugr.Cells["pointNo"].Text);
  426. RESTfulResult<string> rm = monitorService.doUpdateWf(new MeterWorkMonitor { pointNo = ugr.Cells["pointNo"].Text.Trim(), monitorUserNo = "" });
  427. if (!rm.Succeed)
  428. {
  429. lg.WriteLog(4, "写入取消接管信息失败");
  430. }
  431. }
  432. else
  433. {
  434. MeterWorkMonitor mwm = PbCacheMonitor.ltWorkMonitor.Where(s => s.pointNo == ugr.Cells["pointNo"].Text.Trim()).FirstOrDefault();
  435. //先查一次是否接管了
  436. if (mwm != null && !string.IsNullOrEmpty(mwm.monitorUserNo))
  437. {
  438. ugr.Cells["UNCK"].Value = false;
  439. MessageBox.Show("当前计量点已被账号【" + mwm.monitorUserNo + "】接管");
  440. return;
  441. }
  442. ucCarMonitoring uc = new ucCarMonitoring();
  443. uc.strCollectNo = ugr.Cells["collectionCode"].Text.Trim();
  444. uc.Name = "uc" + ugr.Cells["pointNo"].Text;
  445. uc.sUserId = userId;
  446. uc.sPoint = ugr.Cells["pointNo"].Text;
  447. uc.sPointName = ugr.Cells["pointName"].Text;
  448. uc.ucMonitoringEvent += new EventHandler(ucEvent);
  449. uc.evoice += new EventVoice(setsVoice);
  450. //****************************************注意下面这个**********************
  451. // uc.moxaip = dtPointInfo.Rows[k]["MOXAIP"].ToString().Trim();
  452. uc.openMsg += new EventOpenMsg(OpenMsg);
  453. uc.rowPointInfo = null;
  454. uc.BorderStyle = BorderStyle.FixedSingle;
  455. uc.db = db;
  456. flPanel.Controls.Add(uc);
  457. RESTfulResult<string> rm = monitorService.doUpdateWf(new MeterWorkMonitor { pointNo = ugr.Cells["pointNo"].Text.Trim(), monitorUserNo = userName });
  458. if (!rm.Succeed)
  459. {
  460. lg.WriteLog(4, "写入接管信息失败");
  461. }
  462. }
  463. }
  464. }
  465. private void frmMonitor_FormClosing(object sender, FormClosingEventArgs e)
  466. {
  467. try
  468. {
  469. if (!string.IsNullOrEmpty(openPointNo))
  470. {
  471. UpdateCarijeg(new MeterWorkMonitor { pointNo = openPointNo, isHelp = "0" });
  472. VoiceClose();
  473. IPVideoClose();//关闭视频
  474. }
  475. if (thVoice != null) thVoice.Abort();
  476. }
  477. catch (Exception ex)
  478. {
  479. lg.WriteLog(4, "关闭监控界面异常:" + ex.Message);
  480. }
  481. finally
  482. {
  483. timer2.Stop();
  484. }
  485. }
  486. }
  487. }