/// <summary> /// 确认/取消哨位报警 /// </summary> /// <returns></returns> public HttpRequestResult SendDeviceAlarmStatus(DeviceAlarmStatus status) { string url = string.Format(@"http://{0}:{1}/ASCS/SentinelAlarmStatus", ASCS.EndPoints[0].IPAddress, ASCS.EndPoints[0].Port); _logger.LogInformation("发送报警状态确认 Begin.\r\nUrl:{0},\r\n Protocol:{1}...", url, JsonUtility.CamelCaseSerializeObject(status)); var result = HttpClientHelper.Put(status, url); _logger.LogInformation("发送报警状态确认 End,retur {0}...", result); return(result); }
/// <summary> /// 获取报警推送到哨位中心的状态 /// </summary> /// <param name="db"></param> /// <param name="setting"></param> /// <param name="alarmStatus"></param> /// <returns></returns> private DeviceAlarmStatus GetDeviceAlarmStatus(AllInOneContext.AllInOneContext db, AlarmSetting setting, bool alarmStatus) { DeviceAlarmStatus status = null; var deviceType = db.SystemOption.FirstOrDefault(t => t.SystemOptionId.Equals(setting.AlarmSource.DeviceTypeId)); if (deviceType != null) { if (deviceType.ParentSystemOptionId.Equals(Guid.Parse("A0002016-E009-B019-E001-ABCD11000004"))) { var sentinel = db.Sentinel.Include(t => t.DeviceInfo).FirstOrDefault(t => t.DeviceInfoId.Equals(setting.AlarmSource.IPDeviceInfoId)); status = new DeviceAlarmStatus() { DeviceCode = sentinel.DeviceInfo.IPDeviceCode, SentinelCode = sentinel.DeviceInfo.IPDeviceCode, //DeviceCode = Int32.Parse(sentinel.DeviceInfo.Organization.OrganizationCode), //SentinelCode = Int32.Parse(sentinel.DeviceInfo.Organization.OrganizationCode), AlarmType = setting.AlarmTypeId, AlarmStatus = alarmStatus }; } else if (deviceType.ParentSystemOptionId.Equals(Guid.Parse("A0002016-E009-B019-E001-ABCDEF000110"))) { //获取防区设备关联的哨位台 var defenceDevice = db.DefenseDevice.Include(t => t.Sentinel).ThenInclude(t => t.DeviceInfo).ThenInclude(t => t.Organization) .Include(t => t.DeviceInfo) .First(t => t.DeviceInfoId.Equals(setting.AlarmSource.IPDeviceInfoId)); status = new DeviceAlarmStatus() { DeviceCode = defenceDevice.DeviceInfo.IPDeviceCode, // SentinelCode = defenceDevice.Sentinel.DeviceInfo.IPDeviceCode, SentinelCode = Int32.Parse(defenceDevice.Sentinel.DeviceInfo.Organization.OrganizationCode), AlarmType = setting.AlarmTypeId, AlarmStatus = alarmStatus }; } } return(status); }
/// <summary> /// 发送报警状态到哨位中心服务 /// </summary> /// <param name="db"></param> /// <param name="status"></param> /// <param name="deviceOrgId"></param> private void SendAlarmStatusToASCS(DeviceAlarmStatus status, Guid deviceOrgId) { Task.Run(new Action(() => { using (var db = new AllInOneContext.AllInOneContext()) { _logger.LogInformation("推送报警状态到哨位心..."); Guid ascsServerType = Guid.Parse("A0002016-E009-B019-E001-ABCD11300206"); //哨位台挂在哨位节点上面 var org = db.Organization.FirstOrDefault(t => t.OrganizationId.Equals(deviceOrgId)); var service = db.ServiceInfo.Include(t => t.ServerInfo). FirstOrDefault(t => t.ServiceTypeId.Equals(ascsServerType) && ( t.ServerInfo.OrganizationId.Equals(org.ParentOrganizationId) || t.ServerInfo.OrganizationId.Equals(deviceOrgId))); //var service = new ServiceInfo() { // EndPointsJson = "[{\"IPAddress\":\"192.168.18.76\",\"Port\":5002}]" //}; if (service != null) { try { ASCSApi ascs = new ASCSApi(service); var r = ascs.SendDeviceAlarmStatus(status); _logger.LogInformation("推送报警状态到哨位中心结果:{0}...", r.Success); } catch (Exception ex) { _logger.LogError("发送报警状态到哨位中心异常:{0}\r\n{1}", ex.Message, ex.StackTrace); } return; } } _logger.LogInformation("未配置哨位中心服务,取消推送...."); })); }
private void Run() { while (WaitHandle.WaitAny(m_WaitHandles) == 0) { if (m_alarmLogQueue.Count == 0) { m_queueThreadSemaphore.Reset(); } //出列,处理 AlarmLog alarmLog = null; bool dequeueOk = m_alarmLogQueue.TryDequeue(out alarmLog); if (dequeueOk) { //报警联动 using (var db = new AllInOneContext.AllInOneContext()) { try { var setting = GetAlarmSetting(db, alarmLog); if (setting != null) { int code = 0; if (Int32.TryParse(setting.AlarmSource.Organization.OrganizationCode, out code)) { setting.AlarmSource.IPDeviceCode = code; } Plan plan = null; DeviceAlarmStatus status = null; //本地广播报警消息 MQPulish.PublishMessage("AlarmLog", alarmLog); if (alarmLog.AlarmStatusId.Equals(Guid.Parse("A0002016-E009-B019-E001-ABCD13100001"))) //执行预案,状态未确认 { if (ScheduleUtility.IsValidSchedule(setting.Schedule, DateTime.Now)) //符合当前排班的情况 { ////本地广播报警消息 //MQPulish.PublishMessage("AlarmLog", alarmLog); plan = db.Plan.Include(t => t.Actions).ThenInclude(t => t.PlanActions).ThenInclude(t => t.Action).FirstOrDefault(t => t.PlanId.Equals(setting.BeforePlanId)); } } else if (alarmLog.AlarmStatusId.Equals(Guid.Parse("A0002016-E009-B019-E001-ABCD13100002"))) //执行应急预案 { //预案确认 plan = db.Plan.Include(t => t.Actions).ThenInclude(t => t.PlanActions).ThenInclude(t => t.Action).FirstOrDefault(t => t.PlanId.Equals(setting.EmergencyPlanId)); //哨位报警,确认需推送报警确认/取消到哨位中心服务 status = GetDeviceAlarmStatus(db, setting, true); } else if (alarmLog.AlarmStatusId.Equals(Guid.Parse("A0002016-E009-B019-E001-ABCD13100003"))) //报警取消,停止联动动作 { //哨位报警,取消需推送报警确认/取消到哨位中心服务 status = GetDeviceAlarmStatus(db, setting, false); StopPlan(setting); } else if (alarmLog.AlarmStatusId.Equals(Guid.Parse("A0002016-E009-B019-E001-ABCD13100004"))) //停止联动动作,已关闭 { status = GetDeviceAlarmStatus(db, setting, false); StopPlan(setting); } //找到满足条件的预案,发送到任务服务,启动预案 if (plan != null) { plan.PlanTrigger = new PlanTriggerSource() { AlarmSource = setting.AlarmSource, AlarmType = setting.AlarmType, BeforePlanId = setting.BeforePlanId, EmergencyPlanId = setting.EmergencyPlanId, AlarmLogId = alarmLog.AlarmLogId }; StartPlan(plan); } if (status != null) { SendAlarmStatusToASCS(status, setting.AlarmSource.OrganizationId); } } else { _logger.LogInformation("未配置报警,没有任务联动响应!!!!"); } } catch (Exception ex) { _logger.LogError("报警处理异常,Message:{0}\r\nStackTrace:{1}", ex.Message, ex.StackTrace); } } } } }