private void getdt(DateTime nowtime) { DataRow[] rows = null; DataRow row = null, r = null; TimeSpan span; string point = "", ssz1, ssz2; double ssz, zdz, zxz, pjz, allvlaue; int zt = -1; DataTable dt = showdt.Clone(); List <int> fzh; int x = -1, y = -1, count = 0, toprowindex = 0; long temp = 0; string[] kdid1; Jc_BInfo tempobj = null; bool updateflag = true; List <Jc_BInfo> endkdlist = new List <Jc_BInfo>(); Jc_BInfo lb = new Jc_BInfo(); string nt = string.Empty; try { #region 模拟量信息 lock (StaticClass.allPointDtLockObj) { rows = StaticClass.AllPointDt.Select("lx='开关量' ", "fzh,tdh,dzh"); //modified by 20170315 //在调试代码时,发现此select返回的行,第一行有时有为null的情况(估计是datatable读写并发引起返回为空行记录,临时通过特殊处理空行记录), if (rows != null && rows.Length > 0) { List <DataRow> list = new List <DataRow>(); foreach (DataRow dr in rows) { if (dr != null) //移除空行 { list.Add(dr); } } rows = list.ToArray(); } if (rows.Length > 0) { DataTable dt1 = rows.CopyToDataTable(); #region 除已结束的报警 lock (objShowDt) { for (int i = 0; i < showdt.Rows.Count; i++) { rows = dt1.Select("point='" + showdt.Rows[i]["point"].ToString() + "'"); if (rows.Length > 0) { #region 刷新实时值、最大值、最小值、平均值 point = showdt.Rows[i]["point"].ToString(); ssz2 = showdt.Rows[i]["ssz"].ToString(); ssz1 = rows[0]["ssz"].ToString(); if (ssz1 != ssz2) { showdt.Rows[i]["ssz"] = ssz1; showdt.Rows[i]["state"] = OprFuction.StateChange(rows[0]["zt"].ToString()); showdt.Rows[i]["sbstate"] = OprFuction.StateChange(rows[0]["sbzt"].ToString()); showdt.Rows[i]["stime"] = OprFuction.TimeToString(DateTime.Parse(rows[0]["time"].ToString())); showdt.Rows[i]["time"] = OprFuction.TimeToString(DateTime.Parse(rows[0]["time"].ToString())); } #endregion lock (StaticClass.bjobj) { var bjobj = StaticClass.jcbdata.Values.Where(pp => pp.Point == showdt.Rows[i]["point"].ToString() && ( (OprFuction.KGLisAlarm(pp) || !string.IsNullOrEmpty(pp.Kzk))) && (OprFuction.IsInitTime(pp.Etime))).OrderByDescending(pp => pp.Stime).FirstOrDefault(); if (bjobj != null && !string.IsNullOrEmpty(bjobj.Point)) { if (OprFuction.KGLisAlarm(bjobj)) { if (showdt.Rows[i]["bjtime"] != null && showdt.Rows[i]["bjtime"].ToString() != "报警/" + OprFuction.TimeToString(bjobj.Etime)) { showdt.Rows[i]["bjtime"] = "报警/" + OprFuction.TimeToString(bjobj.Stime); } } else { if (showdt.Rows[i]["bjtime"] != null && showdt.Rows[i]["bjtime"].ToString() != "断电/" + OprFuction.TimeToString(bjobj.Stime)) { showdt.Rows[i]["bjtime"] = "断电/" + OprFuction.TimeToString(bjobj.Stime); } } if (!string.IsNullOrEmpty(bjobj.Kzk)) { string[] kzk = bjobj.Kzk.Split('|'); string kzqy = ""; if (kzk.Length > 0) { for (int k = 0; k < kzk.Length; k++) { lock (StaticClass.allPointDtLockObj) { DataRow[] row1 = StaticClass.AllPointDt.Select("point='" + kzk[i] + "'"); if (row1.Length > 0) { kzqy = kzqy + kzk[i] + "(" + row1[0]["wz"] + ")|"; } } } } if (kzqy.Length > 1) { kzqy = kzqy.Substring(0, kzqy.Length - 1); } showdt.Rows[i]["ddqy"] = kzqy; } else { showdt.Rows[i]["ddqy"] = ""; } if (showdt.Rows[i]["cstime"] != null && showdt.Rows[i]["cstime"].ToString() != bjobj.Cs + "/" + bjobj.Bz2) { showdt.Rows[i]["cstime"] = bjobj.Cs + "/" + bjobj.Bz2; } if (!string.IsNullOrEmpty(bjobj.Kdid)) { if (null != showdt.Rows[i]["kdid"]) { if (showdt.Rows[i]["kdid"].ToString() != bjobj.Kdid) { #region 修改馈电 kdid1 = bjobj.Kdid.Split(','); lock (StaticClass.bjobj) { try { for (int z = 0; z < kdid1.Length; z++) { if (!string.IsNullOrEmpty(kdid1[z])) { temp = long.Parse(kdid1[z]); if (StaticClass.jcbdata.ContainsKey(temp)) { tempobj = StaticClass.jcbdata[temp]; showdt.Rows[i]["kdtime"] = OprFuction.StateChange(tempobj.Type.ToString()) + "/" + tempobj.Stime; } } } } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(ex); } } showdt.Rows[i]["kdid"] = bjobj.Kdid; #endregion } else { updateflag = true; kdid1 = bjobj.Kdid.Split(','); for (int z = 0; z < kdid1.Length; z++) { if (!string.IsNullOrEmpty(kdid1[z])) { temp = long.Parse(kdid1[z]); if (StaticClass.jcbdata.ContainsKey(temp)) { tempobj = StaticClass.jcbdata[temp]; endkdlist.Add(tempobj); if (OprFuction.IsInitTime(tempobj.Etime)) { updateflag = false; } } } } if (updateflag) { lb = endkdlist.OrderByDescending(pp => pp.Etime).First(); if (lb.Type == (short)DeviceDataState.DataPowerOffFail) { nt = ((short)DeviceDataState.DataPowerOffSuc).ToString(); } else if (lb.Type == (short)DeviceDataState.DataPowerOnFail) { nt = ((short)DeviceDataState.DataPowerOnSuc).ToString(); } showdt.Rows[i]["kdtime"] = OprFuction.StateChange(nt) + "/" + lb.Etime; } } } } } else { showdt.Rows[i]["bjtime"] = ""; showdt.Rows[i]["ddqy"] = ""; showdt.Rows[i]["kdtime"] = ""; showdt.Rows[i]["cstime"] = ""; } } } else { showdt.Rows.RemoveAt(i); i--; } } } #endregion #region 添加新的报警 lock (objShowDt) { for (int kj = 0; kj < dt1.Rows.Count; kj++) { r = dt1.Rows[kj]; rows = showdt.Select("point='" + r["point"].ToString() + "'"); { if (rows.Length > 0) { continue; } } row = showdt.NewRow(); row["point"] = r["point"]; row["wz"] = r["wz"]; if (r["zt"].ToString() == StaticClass.itemStateToClient.EqpState7.ToString()) { row["yjz"] = r["sxyj"]; } else { row["yjz"] = r["xxyj"]; } row["fzh"] = r["fzh"] + "/" + r["tdh"] + "/" + r["dzh"]; row["ssz"] = r["ssz"]; row["state"] = OprFuction.StateChange(r["zt"].ToString()); row["sbstate"] = OprFuction.StateChange(r["sbzt"].ToString()); row["stime"] = OprFuction.TimeToString(DateTime.Parse(r["time"].ToString())); row["time"] = OprFuction.TimeToString(DateTime.Parse(r["time"].ToString())); span = nowtime - DateTime.Parse(r["time"].ToString()); row["cxtime"] = String.Format("{0:D2}:{1:D2}:{2:D2}:{3:D2}", span.Days, span.Hours, span.Minutes, span.Seconds); row["zdz"] = r["ssz"]; row["zxz"] = r["ssz"]; row["pjz"] = r["ssz"]; row["count"] = 1; row["allvalue"] = r["ssz"]; row["id"] = 0; row["devname"] = r["lb"]; row["dw"] = r["dw"]; showdt.Rows.InsertAt(row, 0);//添加新记录 } } #endregion } else { lock (objShowDt) { showdt.Rows.Clear(); } } } #endregion } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(ex); } }
/// <summary> /// 获取新增报警断电信息 /// </summary> public void getdata() { short type = 0; int count = 0; long id = 0; List <long> keylist; Jc_BInfo jcb = null; Jc_BInfo obj = null; lock (StaticClass.bjobj) { try { #region 获取报警信息 keylist = new List <long>(StaticClass.jcbdata.Keys); for (int i = 0; i < keylist.Count; i++) { if (StaticClass.jcbdata.ContainsKey(keylist[i])) { jcb = StaticClass.jcbdata[keylist[i]]; type = jcb.Type; if (type == 27) { } if (type == StaticClass.itemStateToClient.EqpState24 || type == StaticClass.itemStateToClient.EqpState25 || type == StaticClass.itemStateToClient.EqpState26) { id = long.Parse(jcb.ID); if (!jc_b.ContainsKey(id) && (OprFuction.KGLisAlarm(jcb) || !string.IsNullOrEmpty(jcb.Kzk)))//增加如果未选择报警,勾选了控制的也进行显示 20170726 { #region 新增报警断电 obj = OprFuction.NewDTO(jcb); jc_b.Add(id, obj); addlist.Add(id); #endregion } else { #region update 报警 断电 if (jc_b.ContainsKey(id)) { #region 控制口改变 if (jc_b[id].Kzk != jcb.Kzk)//报警断电结束 { obj = OprFuction.NewDTO(jcb); jc_b[id] = obj; addlist.Add(id); } #endregion if (OprFuction.IsInitTime(jc_b[id].Etime) && !OprFuction.IsInitTime(jcb.Etime) || jc_b[id].Kdid != jcb.Kdid)//报警断电结束 { obj = OprFuction.NewDTO(jcb); if (jc_b[id].Kdid != jcb.Kdid)//馈电改变 { kdlist.Add(id); } jc_b[id] = obj; updatelist.Add(id); } else if (jc_b[id].Cs != jcb.Cs)//措施改变//&& !OprFuction.GetClientType() 注释 20170817 { obj = OprFuction.NewDTO(jcb); jc_b[id] = obj; updatelist.Add(id); } //else if (jc_b[id].Isalarm != jcb.Isalarm) //{ // //2017.7.14 by // obj = OprFuction.NewDTO(jcb); // jc_b[id] = obj; // updatelist.Add(id); //} else//无变化,直接更新结束时间 20170627 { updatelist.Add(id); } } #endregion } } } } #region 判断报警断电是否还存在 foreach (long key in jc_b.Keys) { if (!StaticClass.jcbdata.ContainsKey(key) || (StaticClass.jcbdata[key].Isalarm == 0 && string.IsNullOrEmpty(StaticClass.jcbdata[key].Kzk)))//如果用户取消报警(只有报警,没有控制时,可取消),此时数据处理会将标记置成正常,客户端显示的时候也取消报警 20170627 { deletelist.Add(key); } } #endregion #endregion } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(ex); } } }