using com.hnshituo.core.webapp.vo; using Common; using Infragistics.Win.UltraWinGrid; using JC_MeasuringSystem; using MeterModuleLibrary.uc; using MeterPlugInLibrary; using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.IO.Ports; using System.Linq; using System.Net; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; namespace CarMonitor { public partial class frmMonitor : Form { public frmMonitor() { InitializeComponent(); } Log lg = Log.GetInstance(); BaseDbCls bd = new BaseDbCls(); private string sVoice = ""; private Thread thVoice = null; VoicePlay vp = new VoicePlay(); private frmMsgInfo fm = null; string userId = "", userName = ""; DbHelper db = new DbHelper(); MeterWorkMonitorService monitorService = new MeterWorkMonitorService(); private void frmMonitor_Load(object sender, EventArgs e) { PbCacheMonitor.frmMsgClosingTime = DateTime.Now; timer2.Start(); userId = ((ST_MainForm)(this.MdiParent)).UserID; userName = ((ST_MainForm)(this.MdiParent)).UserName; #region 载入计量点的信息 bd.setBaseDb(); bd.getDb(); setGridData(); foreach (UltraGridRow ugr in ultraGridPW.Rows) { if (ugr.Cells["monitorUserNo"].Text.Trim() != "" && ugr.Cells["monitorUserNo"].Text.Trim() == userName) { ugr.Cells["UNCK"].Value = true; ucCarMonitoring uc = new ucCarMonitoring(); uc.strCollectNo = ugr.Cells["collectionCode"].Text.Trim(); uc.Name = "uc" + ugr.Cells["pointNo"].Text; uc.sUserId = userId; uc.sName = userName; uc.sPoint= ugr.Cells["pointNo"].Text; uc.sPointName= ugr.Cells["pointName"].Text; uc.ucMonitoringEvent += new EventHandler(ucEvent); uc.evoice += new EventVoice(setsVoice); //****************************************注意下面这个********************** // uc.moxaip = dtPointInfo.Rows[k]["MOXAIP"].ToString().Trim(); uc.openMsg += new EventOpenMsg(OpenMsg); uc.rowPointInfo = null; uc.BorderStyle = BorderStyle.FixedSingle; uc.db = db; flPanel.Controls.Add(uc); } else { ugr.Cells["UNCK"].Value = false; } } ClsControlPack.RefreshAndAutoSize(this.ultraGridPW); #endregion thVoice = new Thread(ThVoice); thVoice.Start(); } public void setGridData() { DataTable dt = dtJGPointInfo.Clone(); if (PbCacheMonitor.ltWorkMonitor != null && PbCacheMonitor.ltWorkMonitor.Count > 0) { foreach (MeterWorkMonitor mwm in PbCacheMonitor.ltWorkMonitor) { DataRow dr = dt.NewRow(); dr["pointNo"] = mwm.pointNo; dr["pointName"] = mwm.pointName; dr["monitorUserNo"] = mwm.monitorUserNo; dr["collectionCode"] = mwm.collectionCode; dt.Rows.Add(dr); } } ClsControlPack.CopyDataToDatatable(ref dt, ref this.dtJGPointInfo, true); ClsControlPack.RefreshAndAutoSize(this.ultraGridPW); } /// /// 对应用户控件的ucMonitoringEvent;将用户控件回调到主界面执行,用于打开语音对讲或打开新的界面 /// /// /// public void ucEvent(object sender, EventArgs e) { Control control = (Control)sender; ucCarMonitoring um = control.Parent.Parent.Parent.Parent as ucCarMonitoring; bool bMainUm = true; if (control.Name == "btnSee") { um = control.Parent.Parent.Parent as ucCarMonitoring; } if (um == null) { frmProductVoice fv = control.Parent.Parent.Parent.Parent.Parent as frmProductVoice; um = fv._uc; bMainUm = false; } PbCacheMonitor.sportInfo = PbCacheMonitor.sportInfos.Where(s => s.baseSpotNo == um.sPoint).FirstOrDefault(); //ucProductMonitoring um = control as ucProductMonitoring; try { switch (control.Name) { case "btnIpVoice": { //表示曾经打开了一个语音,且不是当前点击的这个语音 if (um.sPoint != openPointNo && !string.IsNullOrEmpty(openPointNo)) MessageBox.Show("一次只能打开一个语音对讲!"); else VoiceOption(um, bMainUm); }; break; case "btnSee": { frmProductVoice fpv = new frmProductVoice(); fpv.ucMonitoringEvent += new EventHandler(ucEvent); fpv.Text = um.sPointName; fpv._uc = um; fpv.db = db; fpv.ShowDialog(); }; break; } } catch (Exception ex) { MessageBox.Show("操作异常:" + ex.Message); } } /// /// 现场求助信息为:1呼叫待接听,从用户控件中回调主界面方法 /// /// private void OpenMsg(string pointName) { try { if (string.IsNullOrEmpty(openPointNo) && !bMsgOpen) { if (PbCacheMonitor.frmMsgClosingTime == null) { bMsgOpen = true; fm = frmMsgInfo.CreateInstrance(this); fm.TopMost = true; fm.setLbTxt(pointName); fm.Show(); } else { TimeSpan secondSpan = new TimeSpan(DateTime.Now.Ticks - PbCacheMonitor.frmMsgClosingTime.Value.Ticks); if (secondSpan.TotalSeconds > 10) { bMsgOpen = true; fm = frmMsgInfo.CreateInstrance(this); fm.TopMost = true; fm.setLbTxt(pointName); fm.Show(); } } } if (!string.IsNullOrEmpty(openPointNo) && fm != null) { fm.CloseFrm(); } } catch { } } public bool bMsgOpen = false; /// /// 用户控件中调用语音提示操作;具体操作在下面的线程ThVoice中处理 /// /// /// private void setsVoice(object sender, string e) { sVoice += e + "|"; } /// /// fm为frmMsgInfo /// private void ThVoice() { while (true) { if (string.IsNullOrEmpty(openPointNo)) { //挂断操作 sVoice = ""; if (fm != null && bMsgOpen && PbCacheMonitor.ltWorkMonitor != null) { int icount = PbCacheMonitor.ltWorkMonitor.Where(s => s.isHelp != null && s.isHelp == "1").Count(); if (icount == 0) { fm.setFrmNull(); fm = null; } } } else if (bMsgOpen) { //弹出了语音呼叫界面 sVoice = ""; } else if (sVoice != "") { /* //注销下面播放提示语音的代码 //string[] sVoiceFirst = sVoice.Split("|"); int i = sVoice.IndexOf("|"); if (i > 0) { string voiceOpen = sVoice.Substring(0, i); sVoice = sVoice.Substring(i + 1); vp.GetVoicePlay(voiceOpen, ""); //Thread.Sleep(); } else { Thread.Sleep(2000); } //*/ } else { Thread.Sleep(2000); } } } #region 语音对讲 /// /// 硬盘录像机登录 /// DhCameraShot cameraShotMain = new DhCameraShot(); /// /// 必须先打开连接 /// private bool GetIPVideo(MeterBaseVideoinfo video) { try { cameraShotMain.ip = video.videoip; cameraShotMain.port = video.vdoPort; cameraShotMain.uid = video.vdoUser; cameraShotMain.pwd = video.vdoPwd; cameraShotMain.Connection(); } catch (Exception ex) { MessageBox.Show(ex.Message); return false; } return true; } /// /// 必须先打开视频,然后再打开语音 /// private void VoiceOpen() { try { cameraShotMain.StartTalk(); } catch (Exception exp) { MessageBox.Show("打开语音失败:" + exp.Message); } } /// /// 关闭语音对讲 /// private void VoiceClose() { try { cameraShotMain.StopTalk(); } catch (Exception exp) { MessageBox.Show("关闭失败" + exp.Message); } } /// /// 关闭视频 /// private void IPVideoClose() { try { //退出视频及语音登录 cameraShotMain.Close(); } catch (Exception exp) { MessageBox.Show(exp.Message); } } #endregion private string openPointNo = ""; private void VoiceOption(ucCarMonitoring um, bool bMainUm) { if (PbCacheMonitor.ltWorkMonitor == null || PbCacheMonitor.ltWorkMonitor.Count == 0) { MessageBox.Show("获取计量点信息异常,请稍后再试"); return; } MeterWorkMonitor monitor = PbCacheMonitor.ltWorkMonitor.Where(s => s.pointNo == um.sPoint).FirstOrDefault(); if (monitor == null) { MessageBox.Show("获取当前计量点信息异常,请稍后再试"); return; } //当前计量点已开启语音对讲 if (!um.isNcFlag) //未开启 { //进行开启操作,并修改监控表的标识位 bd.getSpot(); GetIPVideo(PbCacheMonitor.videoInfo); VoiceOpen(); um.setBtnVoiceText("挂断"); UpdateCarijeg(new MeterWorkMonitor { pointNo = monitor.pointNo, isHelp = "2" }); um.isNcFlag = true; um.bOpenVoice = false; openPointNo = um.sPoint; //um.cameraShotMain = cameraShotMain; lg.WriteLog(4, "开启语音的计量点:" + um.sPointName + ",对应的IP地址为:" + PbCacheMonitor.videoInfo.videoip); } else { //进行挂断操作,并修改监控表的标识位 bd.getSpot(); VoiceClose(); /* if (bMainUm) { IPVideoClose(); } //*/ IPVideoClose(); um.setBtnVoiceText("对讲"); UpdateCarijeg(new MeterWorkMonitor { pointNo = monitor.pointNo, isHelp = "0" }); um.isNcFlag = false; um.bOpenVoice = true; openPointNo = ""; //um.cameraShotMain = null; lg.WriteLog(4, "关闭语音的计量点:" + um.sPointName + ",对应的IP地址为:" + PbCacheMonitor.videoInfo.videoip); } } /// /// 修改数据到接管表 /// private void UpdateCarijeg(MeterWorkMonitor monitor) { RESTfulResult rms = monitorService.doUpdateWf(monitor); if (!rms.Succeed) { lg.WriteLog(4, "写入数据失败"); } } private void timer2_Tick(object sender, EventArgs e) { try { if (bd.getDb()) { foreach (MeterWorkMonitor mon in PbCacheMonitor.ltWorkMonitor) { foreach (Control cn in flPanel.Controls) { if (cn.Name.Contains("uc")) { ucCarMonitoring ucCar = cn as ucCarMonitoring; if (ucCar.sPoint == mon.pointNo) { ucCar.rowPointInfo = mon; } } } } } else { lg.WriteLog(4, "未找到实时监控数据"); } //*/ } catch (Exception ex) { lg.WriteLog(4, "数据库连接异常"); } } private void ultraGridPW_CellChange(object sender, CellEventArgs e) { ultraGridPW.UpdateData(); UltraGridRow ugr = ultraGridPW.ActiveRow; if (ugr != null) { if (ugr.Cells["UNCK"].Value.ToString().ToLower() == "false") { if (!string.IsNullOrEmpty(openPointNo) && openPointNo == ugr.Cells["pointNo"].Text.Trim()) { ugr.Cells["UNCK"].Value = true; MessageBox.Show("当前计量点开启了语音,请先关闭语音"); //若要自动关闭则看Form_Closing事件代码即可 return; } flPanel.Controls.RemoveByKey("uc" + ugr.Cells["pointNo"].Text); RESTfulResult rm = monitorService.doUpdateWf(new MeterWorkMonitor { pointNo = ugr.Cells["pointNo"].Text.Trim(), monitorUserNo = "" }); if (!rm.Succeed) { lg.WriteLog(4, "写入取消接管信息失败"); } } else { MeterWorkMonitor mwm = PbCacheMonitor.ltWorkMonitor.Where(s => s.pointNo == ugr.Cells["pointNo"].Text.Trim()).FirstOrDefault(); //先查一次是否接管了 if (mwm != null && !string.IsNullOrEmpty(mwm.monitorUserNo)) { ugr.Cells["UNCK"].Value = false; MessageBox.Show("当前计量点已被账号【" + mwm.monitorUserNo + "】接管"); return; } ucCarMonitoring uc = new ucCarMonitoring(); uc.strCollectNo = ugr.Cells["collectionCode"].Text.Trim(); uc.Name = "uc" + ugr.Cells["pointNo"].Text; uc.sUserId = userId; uc.sPoint = ugr.Cells["pointNo"].Text; uc.sPointName = ugr.Cells["pointName"].Text; uc.ucMonitoringEvent += new EventHandler(ucEvent); uc.evoice += new EventVoice(setsVoice); //****************************************注意下面这个********************** // uc.moxaip = dtPointInfo.Rows[k]["MOXAIP"].ToString().Trim(); uc.openMsg += new EventOpenMsg(OpenMsg); uc.rowPointInfo = null; uc.BorderStyle = BorderStyle.FixedSingle; uc.db = db; flPanel.Controls.Add(uc); RESTfulResult rm = monitorService.doUpdateWf(new MeterWorkMonitor { pointNo = ugr.Cells["pointNo"].Text.Trim(), monitorUserNo = userName }); if (!rm.Succeed) { lg.WriteLog(4, "写入接管信息失败"); } } } } private void frmMonitor_FormClosing(object sender, FormClosingEventArgs e) { try { if (!string.IsNullOrEmpty(openPointNo)) { UpdateCarijeg(new MeterWorkMonitor { pointNo = openPointNo, isHelp = "0" }); VoiceClose(); IPVideoClose();//关闭视频 } if (thVoice != null) thVoice.Abort(); } catch (Exception ex) { lg.WriteLog(4, "关闭监控界面异常:" + ex.Message); } finally { timer2.Stop(); } } } }