/// <summary> /// 删除 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void btnDelete_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e) { string daID = null; string daName = null; try { int[] Handle = gridViewData.GetSelectedRows(); if (Handle == null || Handle.Length == 0) { XtraMessageBox.Show("请选择模型", "消息"); return; } //如果此模型绑定了应急联动,则不能删除! int rowHandle = gridViewData.FocusedRowHandle; daID = gridViewData.GetRowCellValue(rowHandle, "Id").ToString(); var sysEmergencyInfo = sysEmergencyLinkageService.GetAllSysEmergencyLinkageList().Data; if (sysEmergencyInfo.FirstOrDefault(o => o.MasterModelId == daID) != null) { XtraMessageBox.Show("此模型已绑定应急联动配置,不能删除!", "消息"); return; } if (XtraMessageBox.Show("确定删除选择的分析模型吗?", "删除提示", MessageBoxButtons.OKCancel) == DialogResult.OK) { daName = gridViewData.GetRowCellValue(rowHandle, "Name").ToString(); string reError = largedataAnalysisConfigBusiness.DeleteLargedataAnalysisConfigById(daID); if (reError == "100") { XtraMessageBox.Show("删除成功", "消息"); OperateLogHelper.InsertOperateLog(16, "大数据分析模型-删除【" + daName + "】,", "大数据分析模型-删除"); btnQuery_ItemClick(sender, e); } else { XtraMessageBox.Show(reError, "消息"); } } } catch (Exception ex) { LogHelper.Error(ex.Message); XtraMessageBox.Show(ex.Message, "删除模型失败"); } }
/// <summary> /// 加载应急联动配置列表 /// </summary> /// <param name="isreal">true-显示实时;false-显示全部</param> private void RefreshSysEmergencyLinkageList(bool isreal) { var response = sysEmergencyLinkageService.GetAllSysEmergencyLinkageList(); SysEmergencyLinkageInfos.Clear(); if (isreal) { SysEmergencyLinkageInfos = response.Data.Where(o => o.EmergencyLinkageState == 1).ToList(); } else { SysEmergencyLinkageInfos = response.Data; } this.listBoxControlLargedataModule.DataSource = SysEmergencyLinkageInfos; this.listBoxControlLargedataModule.DisplayMember = "Name"; this.listBoxControlLargedataModule.ValueMember = "Id"; this.listBoxControlLargedataModule.SelectedIndex = -1; this.listBoxControlLargedataModule.Refresh(); }
/// <summary> /// 获取所有测点的实时值 /// </summary> /// <returns>返回格式:测点号,实时值,设备状态,数据状态值,是否报警(1:报警,0:不报警),数据状态文本,设备状态文本,人员定位设备是否呼叫(1:井上呼叫,2,井下呼叫,3,井上和惊吓呼叫,0:不呼叫)</returns> private void setAllPointSsz() { _rwLocker.AcquireWriterLock(-1); try { PointSsz.Clear(); string pointssz = string.Empty; //修改为从实时缓存中读取数据 DataTable pointsdt = PointInMap; var pointResponse = graphicsbaseinfService.GetDefPointInformationInCache(); DataTable pointsszdt = ObjectConverter.ToDataTable <Jc_DefInfo>(pointResponse.Data); var masResponse = graphicsbaseinfService.GetSwitchInformationInCache(); DataTable dt_ip = ObjectConverter.ToDataTable <Jc_MacInfo>(masResponse.Data); //应急联动配置 var SysEmergencyLinkageInfos = sysEmergencyLinkageService.GetAllSysEmergencyLinkageList().Data; //大数据分析模型 var largeDataAnalysisInfos = largeDataAnalysisCacheClientService.GetAllLargeDataAnalysisConfigCache(new LargeDataAnalysisCacheClientGetAllRequest()).Data; //人员定位 var prealinfos = prealSerive.GetAllPrealCacheList(new RPrealCacheGetAllRequest()).Data; var rdefinfos = rdefService.GetAllPointDefineCache().Data; if (prealinfos == null) { prealinfos = new List <R_PrealInfo>(); } var rcallinfos = rcallService.GetAllRCallCache(new RCallCacheGetAllRequest()).Data; //视频 var videoinfos = vdefService.GetAllVideoDefCache().Data; //广播 var bdefinfos = _bdefService.GetAllPointDefineCache().Data; //当前应急联动配置 var currSysEmergencyLinkageInfo = SysEmergencyLinkageInfos.FirstOrDefault(o => o.Id == SysEmergencyLinkageInfoId); //应急联动呼叫关联MasterId var masterid = ""; if (currSysEmergencyLinkageInfo != null) { masterid = currSysEmergencyLinkageInfo.Type == 2 ? currSysEmergencyLinkageInfo.MasterModelId : currSysEmergencyLinkageInfo.Id; } dt_ip.Columns.Add("ssz"); dt_ip.Columns.Add("type"); DataView dv = pointsszdt.DefaultView; dv.Sort = "alarm Asc"; pointsszdt = dv.ToTable(); foreach (DataRow tmpdr in dt_ip.Rows) { DataRow drtemp = pointsszdt.NewRow(); drtemp["state"] = tmpdr["state"]; drtemp["datastate"] = tmpdr["state"]; drtemp["Point"] = tmpdr["IP"]; drtemp["ID"] = tmpdr["ID"]; DataRow[] drstateIP = dtStateVal.Select("lngEnumValue='" + tmpdr["state"].ToString() + "'"); if (drstateIP.Length > 0) { drtemp["ssz"] = drstateIP[0]["strEnumDisplay"].ToString(); drtemp["alarm"] = "0"; } else { drtemp["ssz"] = "未知"; drtemp["alarm"] = "0"; } pointsszdt.Rows.InsertAt(drtemp, 0); } for (int i = 0; i < pointsdt.Rows.Count; i++) { pointssz = ""; string callstate = "0"; pointssz += pointsdt.Rows[i]["Point"].ToString() + ","; int sysid = Convert.ToInt32(pointsdt.Rows[i]["SysId"].ToString()); switch (sysid) { case 0: case (int)SystemEnum.Security: pointssz += SecurityHandle(pointsdt, i, pointsszdt); break; case (int)SystemEnum.Broadcast: pointssz += BroadCastHandle(pointsdt, i, bdefinfos); break; case (int)SystemEnum.Personnel: pointssz += PersonnelHandle(pointsdt, i, pointsszdt, rdefinfos, rcallinfos, prealinfos, masterid, ref callstate); break; case (int)SystemEnum.Video: pointssz += VideoHandle(pointsdt, i, videoinfos, currSysEmergencyLinkageInfo, SysEmergencyLinkageInfos); break; case -1: pointssz += AnalysisConfigHandle(pointsdt, i, largeDataAnalysisInfos); break; default: pointssz += "无数据,0,46,0,未知,未知"; break; } pointssz += "," + callstate; PointSsz.Add(pointssz); } isConnLose = false; } catch (Exception ex) { LogHelper.Error("RefPointSsz-setAllPointSsz" + ex.Message + ex.StackTrace); isConnLose = true; } finally { _rwLocker.ReleaseWriterLock(); } }
/// <summary> /// 报警,应急联动 /// </summary> /// <param name="args"></param> private void DataAnalysisService_AnalysisReulstHandlerEvent(AnalysisChangedEventArgs args) { try { JC_LargedataAnalysisConfigInfo analysisConfigInfo = args.AnalysisConfig; string analysisModelId = analysisConfigInfo.Id; List <JC_AlarmNotificationPersonnelConfigInfo> responseAlarmConfigList; JC_EmergencyLinkageConfigInfo responseEmergencyLinkageConfig; List <JC_RegionOutageConfigInfo> responseRegionOutageConfigList; //多系统融合应急联动 SysEmergencyLinkageInfo responsesysEmergencyLinkInfo; //分析模板传感器分级报警配置 Jc_AnalysistemplatealarmlevelInfo analysistemplatealarmlevelInfo; try { responseAlarmConfigList = AlarmConfigCache.Instance.Query(q => q.AnalysisModelId == analysisModelId); responseEmergencyLinkageConfig = EmergencyLinkageConfigCache.Instance.Query(q => q.AnalysisModelId == analysisModelId).FirstOrDefault(); responseRegionOutageConfigList = RegionOutageConfigCache.Instance.Query(q => q.AnalysisModelId == analysisModelId); // //responsesysEmergencyLinkInfos = SysEmergencyLinkageCache.Instance.Query(o => o.MasterModelId == analysisModelId && o.Type == 2).FirstOrDefault(); responsesysEmergencyLinkInfo = sysEmergencyLinkageService.GetAllSysEmergencyLinkageList().Data.FirstOrDefault(o => o.MasterModelId == analysisModelId && o.Type == 2); AnalysistemplatealarmlevelGetByAnalysistemplateIdRequest cacherequest = new AnalysistemplatealarmlevelGetByAnalysistemplateIdRequest(); cacherequest.AnalysistemplateId = analysisModelId; analysistemplatealarmlevelInfo = analysistemplatealarmlevelService.GetAnalysistemplatealarmlevelByAnalysistemplateId(cacherequest).Data; } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("获取输出配置信息出错:{0}", ex.StackTrace)); return; } #region 报警配置 //存在报警配置 if (responseAlarmConfigList != null && responseAlarmConfigList.Count > 0) { try { //报警 BasicResponse <JC_AlarmHandleInfo> alarmHandleResponse = alarmHandleService.GetUnclosedAlarmByAnalysisModelId(new AlarmHandleGetByAnalysisModelIdRequest() { AnalysisModelId = analysisModelId }); if (analysisConfigInfo.AnalysisResult == 2) { if (alarmHandleResponse.Data == null) { //报警消息格式: 测点号+安装位置+分析模型名称+输出结果 StringBuilder alarmMessage = new StringBuilder(); var analysisSuccessfulPointList = ObjectConverter.CopyList <AnalysisSuccessfulPointInfo, AnalysisSuccessfulPointInfo>(analysisConfigInfo.AnalysisSuccessfulPointList); foreach (var item in analysisSuccessfulPointList) { alarmMessage.Append(string.Format("{0} {1} {2} {3}", item.Point, item.Wz, analysisConfigInfo.Name, analysisConfigInfo.TrueDescription)).Append(Environment.NewLine); } alarmHandleService.AddJC_AlarmHandle(new AlarmHandleAddRequest() { JC_AlarmHandleInfo = new JC_AlarmHandleInfo() { Id = IdHelper.CreateLongId().ToString(), AnalysisModelId = analysisModelId, AnalysisResult = alarmMessage.ToString(), StartTime = DateTime.Now, AlarmType = responseAlarmConfigList[0].AlarmType, AlarmColor = responseAlarmConfigList[0].AlarmColor, EndTime = new DateTime(1900, 1, 1, 0, 0, 0) } }); } } else { //不成立或未知更新报警结束时间 if (alarmHandleResponse.Data != null) { alarmHandleResponse.Data.EndTime = DateTime.Now; alarmHandleService.UpdateJC_AlarmHandle(new AlarmHandleUpdateRequest() { JC_AlarmHandleInfo = alarmHandleResponse.Data }); } } } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("添加或更新报警信息出错:{0}", ex.StackTrace)); } } #endregion #region 应急联动 //应急联动 if (analysisConfigInfo.AnalysisResult == 2 && responseEmergencyLinkageConfig != null) { analysisConfigInfo.IsEmergencyLinkage = true; analysisConfigInfo.EmergencyLinkageConfig = responseEmergencyLinkageConfig.Coordinate; } else { //不成立或未知解除应急联动 analysisConfigInfo.IsEmergencyLinkage = false; analysisConfigInfo.EmergencyLinkageConfig = string.Empty; } try { largeDataAnalysisCacheClientService.UpdateLargeDataAnalysisConfigCahce(new LargeDataAnalysisConfigCacheUpdateRequest() { //LargeDataAnalysisConfigInfo = ObjectConverter.DeepCopy<JC_LargedataAnalysisConfigInfo>(analysisConfigInfo) LargeDataAnalysisConfigInfo = analysisConfigInfo }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("更新应急联动配置信息到缓存出错:{0}", ex.StackTrace)); } #endregion #region 区域断电 //存在区域断电配置 if (responseRegionOutageConfigList != null && responseRegionOutageConfigList.Count > 0) { //分析成立时 if (analysisConfigInfo.AnalysisResult == 2) { //要控制的列表 List <Jc_JcsdkzInfo> controlList = new List <Jc_JcsdkzInfo>(); //要解控的列表 List <Jc_JcsdkzInfo> removeControlList = new List <Jc_JcsdkzInfo>(); foreach (var item in responseRegionOutageConfigList) { BasicResponse <List <Jc_JcsdkzInfo> > analysisBKResponse; try { BasicResponse <bool> controlPointLegalResponse = pointDefineService.ControlPointLegal(new Sys.Safety.Request.PointDefine.PointDefineGetByPointIDRequest() { PointID = item.PointId }); if (!controlPointLegalResponse.Data) { //风电闭锁控制口或者甲烷风电闭锁控制口,数据分析这边不处理.如果风电闭锁和甲烷风电闭锁后定义并且当前控制口已被控制则解除控制。 analysisBKResponse = manualCrossControlService.GetManualCrossControlByTypeZkPointBkPoint(new ManualCrossControlGetByTypeZkPointBkPointRequest() { ZkPoint = analysisModelId, BkPoint = item.Point, Type = (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff }); if (analysisBKResponse.Data != null && analysisBKResponse.Data.Count > 0) { try { manualCrossControlService.DeleteManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = analysisBKResponse.Data }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("解除控制出错:{0}", ex.StackTrace)); } } continue; } } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("风电闭锁控制口或者甲烷风电闭锁控制口,数据分析这边不处理:{0}", ex.StackTrace)); } try { //查询测点为item.Point的被控列表 analysisBKResponse = manualCrossControlService.GetManualCrossControlByBkPoint(new ManualCrossControlGetByBkPointRequest() { BkPoint = item.Point }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("查询测点为item.Point的被控列表出错:{0}", ex.StackTrace)); continue; } //控制 if (item.ControlStatus == 1) { //删除此处判断,添加了模型成立后,再添加区域断电,不会控制 20180919 ////如果上一次也是分析成立,则不再添加控制,为了避免一边添加控制一边解除控制这种情况。 //if (analysisConfigInfo.PrevAnalysisResult == analysisConfigInfo.AnalysisResult) // continue; if (analysisBKResponse.Data != null && analysisBKResponse.Data.Count > 0) { //被控测点 item.Point 已经存在控制,不能再控. continue; } else { //向 jc_jcsdkz 插入数据 if (!controlList.Exists(p => p.ZkPoint == item.AnalysisModelId && p.Bkpoint == item.Point)) { controlList.Add(new Jc_JcsdkzInfo() { ID = IdHelper.CreateLongId().ToString(), ZkPoint = item.AnalysisModelId, Type = (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff, Upflag = "0", Bkpoint = item.Point }); } } } //解除控制 if (item.ControlStatus == 0) { //表 jc_jcsdkz 存在被控测点为当前解控测点的记录. if (analysisBKResponse.Data != null && analysisBKResponse.Data.Count > 0) { //如果表 jc_jcsdkz 存在和当前解控模型和当前解控测点有关的控制则解除. Jc_JcsdkzInfo JkInfo = analysisBKResponse.Data.FirstOrDefault(q => q.ZkPoint == item.RemoveModelId && q.Bkpoint == item.Point && q.Type == (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff); if (JkInfo != null) { removeControlList.Add(new Jc_JcsdkzInfo() { ID = JkInfo.ID, ZkPoint = JkInfo.ZkPoint, Bkpoint = JkInfo.Bkpoint, Type = JkInfo.Type, Upflag = JkInfo.Upflag }); } } } } if (controlList.Count > 0) { try { manualCrossControlService.AddManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = controlList }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("添加控制出错:{0}", ex.StackTrace)); } } if (removeControlList.Count > 0) { try { manualCrossControlService.DeleteManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = removeControlList }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("解除控制出错:{0}", ex.StackTrace)); } } } else { BasicResponse <List <Jc_JcsdkzInfo> > analysisZKResponse = null; try { //查询主控为analysisModelId的列表 analysisZKResponse = manualCrossControlService.GetManualCrossControlByTypeZkPoint(new ManualCrossControlGetByTypeZkPointRequest() { ZkPoint = analysisModelId, Type = (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("查询主控为{0}的列表出错:{1}", analysisModelId, ex.StackTrace)); } if (analysisZKResponse != null && analysisZKResponse.Data != null && analysisZKResponse.Data.Count > 0) { //不成立或未知时,首先看表达式测点是否还存在。 如果不存在, 分析模型控制的测点全部解除控制. foreach (var modelPoint in analysisConfigInfo.AnalysisModelPointRecordInfoList) { Jc_DefInfo definedPoint = null; try { definedPoint = PointCache.Instance.Query(q => q.PointID == modelPoint.PointId, false).FirstOrDefault(); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("获取测点缓存信息出错, 错误消息:{0}", ex.StackTrace)); } if (PointCache.Instance.Count > 0 && definedPoint == null /*测点不存在*/) { try { manualCrossControlService.DeleteManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = analysisZKResponse.Data }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("解除控制出错:{0}", ex.StackTrace)); } return; } } //不成立或未知时解除分析成立时所加的控制 List <Jc_JcsdkzInfo> removeControlList = new List <Jc_JcsdkzInfo>(); foreach (var item in responseRegionOutageConfigList) { try { BasicResponse <bool> controlPointLegalResponse = pointDefineService.ControlPointLegal(new Sys.Safety.Request.PointDefine.PointDefineGetByPointIDRequest() { PointID = item.PointId }); if (!controlPointLegalResponse.Data) { //风电闭锁控制口或者甲烷风电闭锁控制口,数据分析这边不处理.如果风电闭锁和甲烷风电闭锁后定义并且当前控制口已被控制则解除控制。 BasicResponse <List <Jc_JcsdkzInfo> > analysisBKResponse = manualCrossControlService.GetManualCrossControlByTypeZkPointBkPoint(new ManualCrossControlGetByTypeZkPointBkPointRequest() { ZkPoint = analysisModelId, BkPoint = item.Point, Type = (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff }); if (analysisBKResponse.Data != null && analysisBKResponse.Data.Count > 0) { try { manualCrossControlService.DeleteManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = analysisBKResponse.Data }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("解除控制出错:{0}", ex.StackTrace)); } } continue; } } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("风电闭锁控制口或者甲烷风电闭锁控制口,数据分析这边不处理:{0}", ex.StackTrace)); } //是否配置当分析不成立时解除分析成立时所加的控制. 1-解除控制 if (item.ControlStatus == 1 && item.IsRemoveControl == 1) { Jc_JcsdkzInfo JkInfo = analysisZKResponse.Data.FirstOrDefault(q => q.ZkPoint == item.AnalysisModelId && q.Bkpoint == item.Point && q.Type == (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff); if (JkInfo != null) { removeControlList.Add(new Jc_JcsdkzInfo() { ID = JkInfo.ID, ZkPoint = JkInfo.ZkPoint, Bkpoint = JkInfo.Bkpoint, Type = JkInfo.Type, Upflag = JkInfo.Upflag }); } } } if (removeControlList.Count > 0) { try { manualCrossControlService.DeleteManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = removeControlList }); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("解除控制出错:{0}", ex.StackTrace)); } } } } } else { try { //没有区域断电配置. BasicResponse <List <Jc_JcsdkzInfo> > analysisZKResponse = manualCrossControlService.GetManualCrossControlByTypeZkPoint(new ManualCrossControlGetByTypeZkPointRequest() { ZkPoint = analysisModelId, Type = (short)Enums.ControlType.LargeDataAnalyticsAreaPowerOff }); if (analysisZKResponse != null && analysisZKResponse.Data != null && analysisZKResponse.Data.Count > 0) { manualCrossControlService.DeleteManualCrossControls(new ManualCrossControlsRequest() { ManualCrossControlInfos = analysisZKResponse.Data }); } } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(string.Format("没有区域断电配置时删除控制出错:{0}", ex.StackTrace)); } } #endregion #region 多系统融合应急联动 if (responsesysEmergencyLinkInfo != null && !string.IsNullOrEmpty(responsesysEmergencyLinkInfo.Id)) { SysEmergencyLinkHandle(analysisConfigInfo, responsesysEmergencyLinkInfo); } #endregion #region 感器分级报警 if (analysistemplatealarmlevelInfo != null) { AnalysistemplateAlarmLevelHandle(analysisConfigInfo, analysistemplatealarmlevelInfo); } //如果报警配置等级不存在,则更新模型关联传感器报警等级为0 else { ManualCrossControlGetByTypeZkPointRequest mcrequest = new ManualCrossControlGetByTypeZkPointRequest(); mcrequest.Type = 12; mcrequest.ZkPoint = analysisConfigInfo.Id; var kzinfo = manualCrossControlService.GetManualCrossControlByTypeZkPoint(mcrequest).Data; if (kzinfo.Count > 0) { kzinfo.ForEach(kz => kz.Upflag = "0"); ManualCrossControlsRequest updaterequest = new ManualCrossControlsRequest(); updaterequest.ManualCrossControlInfos = kzinfo; manualCrossControlService.UpdateManualCrossControls(updaterequest); } } #endregion //更新上一次的分析结果 Dictionary <string, object> upddateitems = new Dictionary <string, object>(); upddateitems.Add("PrevAnalysisResult", analysisConfigInfo.AnalysisResult); if (analysisConfigInfo.AnalysisTime != null) { upddateitems.Add("PrevAnalysisTime", analysisConfigInfo.AnalysisTime.Value); } AnalysisModelCache.Instance.UpdateProperties(analysisConfigInfo.Id, upddateitems); } catch (Exception ex) { Basic.Framework.Logging.LogHelper.Error(ex.ToString()); } }
/// <summary>分析函数 /// /// </summary> private static void Analyze() { var nowTime = DateTime.Now; //if (_ifFirstRun) //{ // _ifFirstRun = false; //} //else //{ //结束已删除的应急联动 var res4 = EmergencyLinkHistoryService.GetDeleteButNotEndLinkageIds(); //var allDelLinkageConfig = allLinkageConfig.Where(a => a.Type == 1 && a.Activity != 1 && a.EmergencyLinkageState==1).ToList(); //所有非活动的普通应急联动 foreach (var item in res4.Data) { EndLinkageHisAndCall(item, nowTime, false); } var triggerDataState = LinkageConstant.TriggerDataStateVlaue; var req18 = new AlarmCacheGetAllRequest(); var allJcbCache = AlarmCacheService.GetAllAlarmCache(req18).Data; var time1900 = new DateTime(1900, 1, 1); var sievingJcb = allJcbCache.Where(a => (a.Point.Contains("A") || a.Point.Contains("D")) && triggerDataState.Contains(a.Type) && a.Etime == time1900).ToList(); //筛选后的未结束的jcb //判断jcb是否有重复数据 var groupData = sievingJcb.GroupBy(a => new { a.Point, a.Type }).Select(a => new { Group = a.Key, Count = a.Count() }); if (sievingJcb.Count != groupData.Count()) { StringBuilder repeatStr = new StringBuilder(); foreach (var item in groupData) { if (item.Count > 1) { var repeat = sievingJcb.Where(a => a.Point == item.Group.Point && a.Type == item.Group.Type); foreach (var item2 in repeat) { repeatStr.Append("\r\nPoint:" + item2.Point + " PointId:" + item2.PointID + " JcbId:" + item2.ID + " Stime:" + item2.Stime + " Etime:" + item2.Etime); } } } LogHelper.Error("Sys.Safety.Processing.Linkage.LinkageAnalyze:jc_b缓存存在重复数据。" + repeatStr); } var res = SysEmergencyLinkageService.GetAllSysEmergencyLinkageList(); var allLinkageConfig = res.Data; var allActivityLinkageConfig = allLinkageConfig.Where(a => a.Type == 1 && a.Activity == 1).ToList(); //所有活动的普通应急联动 var req3 = new PointDefineCacheGetAllRequest(); var res3 = PointDefineCacheService.GetAllPointDefineCache(req3); var allPoint = res3.Data; //所有测点 foreach (var item in allActivityLinkageConfig) { //判断是否处于强制解除状态 todo 需要加锁 if (item.IsForceEnd) { var endTime = item.EndTime.AddSeconds(item.DelayTime); if (nowTime <= endTime) { continue; } else { item.IsForceEnd = false; } } //获取主控测点 List <Jc_DefInfo> masterPoint = null; //主控测点 if (item.MasterDevTypeAssId != "0") //主控为设备类型 { var req2 = new LongIdRequest() { Id = Convert.ToInt64(item.MasterDevTypeAssId) }; var res2 = SysEmergencyLinkageService.GetMasterEquTypeInfoByAssId(req2); var allDev = res2.Data; var allDevId = new List <string>(); foreach (var item2 in allDev) { allDevId.Add(item2.Devid); } masterPoint = allPoint.Where(a => allDevId.Contains(a.Devid)).ToList(); } if (item.MasterAreaAssId != "0") { var req2 = new LongIdRequest() { Id = Convert.ToInt64(item.MasterAreaAssId) }; var res2 = SysEmergencyLinkageService.GetMasterAreaInfoByAssId(req2); var allArea = res2.Data; var allAreaId = new List <string>(); foreach (var item2 in allArea) { allAreaId.Add(item2.Areaid); } masterPoint = allPoint.Where(a => allAreaId.Contains(a.Areaid)).ToList(); } if (item.MasterPointAssId != "0") { var req2 = new LongIdRequest() { Id = Convert.ToInt64(item.MasterPointAssId) }; var res2 = SysEmergencyLinkageService.GetMasterPointInfoByAssId(req2); masterPoint = res2.Data; } if (masterPoint == null) { continue; } var masterPointId = new List <string>(); //主控测点id foreach (var item2 in masterPoint) { if (item2 == null) { continue; } masterPointId.Add(item2.PointID); } var duration = item.Duration; //获取触发主控状态 var triDataState = new List <short>(); foreach (var item2 in item.MasterTriDataStates) { triDataState.Add(Convert.ToInt16(item2.DataStateId)); } var satisfyJcb = sievingJcb.Where(a => (a.State == 21 || a.State == 20 || a.State == 5 || a.State == 24) && masterPointId.Contains(a.PointID) && triDataState.Contains(a.Type) && (nowTime - a.Stime).TotalSeconds >= duration) .OrderBy(a => a.PointID).ThenBy(a => a.Type).ToList(); //满足条件的jcb //去掉设备实时状态为标校、红外遥控的jcb数据 for (int i = satisfyJcb.Count - 1; i >= 0; i--) { var ifExist = allPoint.Any(a => a.PointID == satisfyJcb[i].PointID && (a.State == 5 || a.State == 24)); if (ifExist) { satisfyJcb.RemoveAt(i); } } var req11 = new LongIdRequest() { Id = Convert.ToInt64(item.Id) }; var res11 = EmergencyLinkHistoryService.GetNotEndLastLinkageHistoryMasterPointByLinkageId(req11); var lastNotEndHisLinkagePointInfo = res11.Data.OrderBy(a => a.PointId).ThenBy(a => a.DataState).ToList(); //当前联动上一次未结束的历史联动记录主控测点 //判断触发的测点及其状态是否一样 bool same = true; if (satisfyJcb.Count == lastNotEndHisLinkagePointInfo.Count) { for (int i = 0; i < satisfyJcb.Count; i++) { if (satisfyJcb[i].PointID != lastNotEndHisLinkagePointInfo[i].PointId || satisfyJcb[i].Type != lastNotEndHisLinkagePointInfo[i].DataState) { same = false; break; } } } else { same = false; } if (satisfyJcb.Count != 0) //触发联动 { if (lastNotEndHisLinkagePointInfo.Count > 0) { if (!same) //主控不一样则先结束之前的联动 { EndLinkageHisAndCall(item, nowTime, false); AddLinkageHisAndCall(item, satisfyJcb, nowTime, true); } } else { AddLinkageHisAndCall(item, satisfyJcb, nowTime, true); } } else //解除联动 { EndLinkageHisAndCall(item, nowTime, true); } //} //删除2天前的已结束的bcall BcallService.DeleteFinishedBcall(); //删除2天前的已结束的rcall RcallService.DeleteFinishedBcall(); } }
public Basic.Framework.Web.BasicResponse <List <Sys.Safety.DataContract.SysEmergencyLinkageInfo> > GetAllSysEmergencyLinkageList() { return(_sysEmergencyLinkageService.GetAllSysEmergencyLinkageList()); }