private void NotifyAll(object sender, System.Timers.ElapsedEventArgs e) { lock (waiters) { if (waiters.Count == 0) { return; } var sessions = CacheRepository.Instance.GetSessions(); foreach (var session in sessions) { var dsession = session as IDictionary <string, object>; if (!dsession.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var filtered = StructureGraph.Instance.Filter(waiters, Guid.Parse((string)session.userId)); if (filtered.Any()) { dynamic notifyMsg = Helper.BuildMessage("ListUpdate"); Dictionary <Guid, int> filteredWhithState = new Dictionary <Guid, int>(); foreach (var id in filtered) { if (waitersState.ContainsKey(id)) { filteredWhithState.Add(id, waitersState[id]); } } notifyMsg.body.ids = filtered.ToArray(); notifyMsg.body.idswithstate = filteredWhithState.ToArray(); //log.Debug(string.Format("уведомление по {0} объектам для сессии {1}", filtered.Count(), session.id)); try { var connectionId = dsession[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(notifyMsg, connectionId); } catch (Exception ex) { log.Error("Не смог отправить по signalR", ex); } } } waiters.Clear(); waitersState.Clear(); } }
public void NotifyAll(dynamic message) { var sessions = CacheRepository.Instance.GetSessions(); foreach (var session in sessions) { var bag = session as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { //log.Debug(string.Format("сессия {0} не содержит сигналр подписки", session.id)); continue; } //log.Debug(string.Format("отправка логов {0} шт, сессия {1}", filtered.Count, session.id)); var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } }
private void OnWatchdogReset(object sender, ElapsedEventArgs e) { try { dynamic head = new ExpandoObject(); head.what = "ping"; dynamic body = new ExpandoObject(); dynamic message = new ExpandoObject(); message.head = head; message.body = body; // var sessions = CacheRepository.Instance.GetSessions(); if (sessions == null) { throw new Exception("не удалось получить список сессий"); } int count = 0; foreach (var sess in sessions) { var bag = sess as IDictionary <string, object>; if (bag == null) { continue; } if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID) || bag[SignalRConnection.SIGNAL_CONNECTION_ID] == null) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); count++; } logger.Trace("Пинг отправлен по {0} из {1} сессий", count, sessions.Count()); } catch (Exception ex) { logger.Error(ex, "Ошибка при отправке пинга: {0}", ex.Message); } }
public async Task <dynamic> Handle(dynamic session, dynamic message) { string what = message.head.what; Guid userId = Guid.Parse(session.userId.ToString()); if (false && !session.IsSuperUser) { var ans = Helper.BuildMessage(what); ans.body.message = "недостаточно прав"; return(ans); } if (what == "managment-get-sessions") { var ans = Helper.BuildMessage(what); ans.body.sessions = new List <dynamic>(); return(ans); } if (what == "managment-pollserver-reset") { var serverName = message.body.serverName; var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { var dsession = sess as IDictionary <string, object>; if (!dsession.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = dsession[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } var ans = Helper.BuildMessage(what); ans.body.message = string.Format("перезагрузка сервера {0} уведомлено {1} клиентов", serverName, sessions.Count()); return(ans); } if (what == "managment-service-operation") { var ans = Helper.BuildMessage(what); ans.body.message = "недостаточно прав"; if ((message is IDictionary <string, object>) && (message as IDictionary <string, object>).ContainsKey("body") && (message.body is IDictionary <string, object>)) { IDictionary <string, object> dbody = message.body as IDictionary <string, object>; string password = ConfigurationManager.AppSettings["servicePassword"]; string operationName = null; string operationAction = null; string successMessage = null; if (dbody.ContainsKey("operation") && (message.body.operation is string) && (message.body.operation != null) && (message.body.operation != "")) { operationName = message.body.operation; operationAction = ConfigurationManager.AppSettings["operation_" + operationName]; successMessage = ConfigurationManager.AppSettings["message_" + operationName]; if (operationAction == null) { ans.body.message = "не найдена соответствующая операция в конфигурационном файле"; } else if (successMessage == null || successMessage == "") { successMessage = string.Format("выполняется сервисная операция: {0}", ans.body.operation); } } else { operationName = "serviceOperation"; operationAction = ConfigurationManager.AppSettings["serviceOperation"]; successMessage = "производится рестарт сервера"; } if (password != null && operationAction != null && operationAction != "" && dbody.ContainsKey("password") && (message.body.password is string) && (password == message.body.password)) { ans.body.message = successMessage; Process.Start(operationAction); //Process myProcess = new Process(); //myProcess.StartInfo.FileName = "cmd.exe"; //myProcess.StartInfo.Arguments = string.Format(@"/C cd {0} & {1}", Environment.CurrentDirectory, operation); //myProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; //myProcess.StartInfo.CreateNoWindow = true; //myProcess.Start(); } } return(ans); } if (what == "managment-rebuild-cache") { var diagnos = ""; var sw = new Stopwatch(); //параметры sw.Start(); var parameters = StructureGraph.Instance.GetAllParameters(userId); foreach (var par in parameters) { CacheRepository.Instance.SaveParameter(par.tubeId, par); } sw.Stop(); diagnos += string.Format("параметры перестроены за {0} мс;", sw.ElapsedMilliseconds); var result = new List <dynamic>(); sw.Restart(); var ids = StructureGraph.Instance.GetRowIds("", new Guid[] { }, userId); var rows = new List <dynamic>(); const int step = 100; for (var offset = 0; offset < ids.Count(); offset += step) { rows.AddRange(StructureGraph.Instance.GetRows(ids.Skip(offset).Take(step), userId)); } foreach (var row in rows) { var id = Guid.Parse(row.id.ToString()); CacheRepository.Instance.Set("row", id, row); //CacheRepository.Instance.SetLocal("row", id, row); } sw.Stop(); diagnos += string.Format("строки перестроены за {0} мс;", sw.ElapsedMilliseconds); var ans = Helper.BuildMessage(what); ans.body.message = diagnos; return(ans); } if (what == "managment-kill-com") { string port = message.body.port; var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { var dsession = sess as IDictionary <string, object>; if (!dsession.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = dsession[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } var ans = Helper.BuildMessage(what); ans.body.message = string.Format("убийство ком порта {0}", port); return(ans); } if (what == "managment-ping") { var ans = Helper.BuildMessage("managment-pong"); if ((message as IDictionary <string, object>).ContainsKey("body") && (message.body is IDictionary <string, object>) && (message.body as IDictionary <string, object>).ContainsKey("message") && (message.body.message is string) && (message.body.message != "")) { log.Info(string.Format("сообщение пинг: {0}", message.body.message)); } return(ans); } if (what == "managment-test") { string[] objectIds = new string[] { "15739db6-d683-45fa-92ff-7d6ff37ae2a1" }; dynamic test = new ExpandoObject(); test.head = new ExpandoObject(); test.head.what = "poll"; test.body = new ExpandoObject(); test.body.objectIds = objectIds; test.body.auto = false; test.body.arg = new ExpandoObject(); test.body.arg.cmd = ""; test.body.arg.components = "Current:3;"; test.body.arg.logLevel = "1"; test.body.arg.onlyHoles = false; var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { if (sess.id == session.id) { continue; } var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(test, connectionId); } } return(Helper.BuildMessage(what)); }
public void Handle(IEnumerable <Domain.Entities.DataRecord> records, Guid userId) { var logs = records.Where(r => r.Type == "LogMessage"); if (!logs.Any()) { return; } var sessions = CacheRepository.Instance.GetSessions(); //log.Debug(string.Format("извлекли {0} сессии", sessions.Count())); //уведомление об изменениях sessions.ToList().ForEach(session => { try { var bag = session as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { return; } if (!bag.ContainsKey("logSubscriber")) { return; } var ids = (List <dynamic>)session.logSubscriber; if (ids == null || !ids.Any()) { return; } var usrId = Guid.Parse(session.userId.ToString()); var filtered = new List <dynamic>(); foreach (var record in logs.GroupBy(r => r.ObjectId)) { for (var j = 0; j < ids.Count(); j++) { var tube = ids[j]; var neights = new List <dynamic>(); if ((tube as IDictionary <string, object>).ContainsKey("neighbours")) { neights = (List <dynamic>)tube.neighbours; } else { log.Debug(string.Format("сессия {0}, tube={1}", session.id, tube)); } if (neights.Contains(record.Key.ToString())) { foreach (var rec in record) { dynamic msg = new ExpandoObject(); msg.id = rec.ObjectId; msg.date = rec.Date; msg.tubeId = tube.tubeId; msg.@object = rec.ObjectId; msg.message = rec.S1; //msg.name = NamesCache.Instance.GetName(rec.ObjectId, usrId); msg.name = nameByOjectId(rec.ObjectId, usrId); filtered.Add(msg); } } else { //log.Debug(string.Format("запись с objid {0} не сидит в сессии {1}", record.Key, session.id)); } } } dynamic logsMessage = Helper.BuildMessage("log"); logsMessage.body.messages = filtered.ToArray(); //log.Debug(string.Format("отправка логов {0} шт, сессия {1}", filtered.Count, session.id)); var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(logsMessage, connectionId); } catch (Exception ex) { log.Error(string.Format("сессия {0} битая", session.id), ex); } }); }
public async Task <dynamic> Handle(dynamic session, dynamic message) { string what = message.head.what; var userId = Guid.Parse(session.userId.ToString()); if (what == "node-states") { foreach (var state in message.body.states) { Guid nodeId = Guid.Parse(state.nodeId.ToString()); var cache = Data.CacheRepository.Instance.GetCache(nodeId); if (cache == null) { cache = new ExpandoObject(); } cache.State = state; Data.CacheRepository.Instance.SaveCache(nodeId, cache); Data.RowsCache.Instance.UpdateState(state, nodeId, userId); Carantine.Instance.Push(nodeId, (int)state.code); } } if (what == "node-get-astronomTimer") { var answer = Helper.BuildMessage(what); Guid id = Guid.Parse(message.body.objectId.ToString()); dynamic tube = StructureGraph.Instance.GetTube(id, userId); var dtube = tube as IDictionary <string, object>; if (dtube.ContainsKey("coordinates")) { answer.body.coordinates = (string)tube.coordinates; } if (dtube.ContainsKey("afterBeforeSunSetRise")) { answer.body.afterBeforeSunSetRise = (string)tube.afterBeforeSunSetRise; } if (dtube.ContainsKey("utc")) { answer.body.utc = (string)tube.utc; } return(answer); } if (what == "node-update-astronomTimer") { string coordinates = (string)message.body.coordinates; string utc = (string)message.body.utc; string afterBeforeSunSetRise = (string)message.body.afterBeforeSunSetRise; Guid objectId = Guid.Parse((string)message.body.objectId); StructureGraph.Instance.UpdateLightControlsAstronTimersValues(coordinates, utc, afterBeforeSunSetRise, objectId); var ans = Helper.BuildMessage(what); return(ans); } if (what == "node-controller-data") { dynamic control = (dynamic)message.body.control; var dcontrol = control as IDictionary <string, object>; Guid objectId = Guid.Parse((string)message.body.objectId); //для освещения if (dcontrol.ContainsKey("controllerData")) { string controllerData = (string)control.controllerData; Data.RowsCache.Instance.UpdateControllerData(controllerData, objectId, userId); Carantine.Instance.Push(objectId); } if (dcontrol.ContainsKey("lightV2Config")) { string strConfig = (string)control.lightV2Config; StructureGraph.Instance.UpdateControlConfig(strConfig, objectId); //strConfig var ans = Helper.BuildMessage(what); return(ans); } if (dcontrol.ContainsKey("controllerConfig")) { string strConfig = (string)control.controllerConfig; StructureGraph.Instance.UpdateControlConfig(strConfig, objectId); //strConfig var ans = Helper.BuildMessage(what); return(ans); } } if (what == "node-config") { } if (what == "node-events") { int events = Convert.ToInt32(message.body.events); Guid objectId = Guid.Parse((string)message.body.objectId); Data.RowsCache.Instance.UpdateEvents(events, objectId, userId); Carantine.Instance.Push(objectId); } if (what == "node-watertower") { float max = Convert.ToSingle(message.body.max); float min = Convert.ToSingle(message.body.min); int controlMode = Convert.ToInt32(message.body.controlMode); Guid objectId = Guid.Parse((string)message.body.objectId); StructureGraph.Instance.UpdateWaterTowenParametr(min, max, controlMode, objectId); List <dynamic> rules = new List <dynamic>(); var connections = StructureGraph.Instance.GetNeightbours(objectId, userId); foreach (var connection in connections) { dynamic ruleConnection = new ExpandoObject(); ruleConnection.action = "upd"; ruleConnection.target = "node"; ruleConnection.content = new ExpandoObject(); ruleConnection.content.id = connection.id; ruleConnection.content.body = connection; ruleConnection.content.type = (string)connection.type; rules.Add(ruleConnection); } var area = StructureGraph.Instance.GetArea(objectId, userId); dynamic ruleArea = new ExpandoObject(); ruleArea.action = "upd"; ruleArea.target = "node"; ruleArea.content = new ExpandoObject(); ruleArea.content.id = area.id; ruleArea.content.body = area; ruleArea.content.type = "Area"; rules.Add(ruleArea); var tube = StructureGraph.Instance.GetTube(objectId, userId); dynamic ruleTube = new ExpandoObject(); ruleTube.action = "upd"; ruleTube.target = "node"; ruleTube.content = new ExpandoObject(); ruleTube.content.id = tube.id; ruleTube.content.body = tube; ruleTube.content.type = "Tube"; rules.Add(ruleTube); var sessions = CacheRepository.Instance.GetSessions(); sessions.AsParallel().ForAll(s => { var ds = s as IDictionary <string, object>; if (ds == null || !ds.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID) || ds[SignalRConnection.SIGNAL_CONNECTION_ID] == null) { return; } Guid uId = Guid.Parse(s.userId.ToString()); dynamic msg = Helper.BuildMessage("changes"); msg.body.rules = new List <dynamic>(); foreach (var rule in rules) { dynamic content = rule.content; Guid id = Guid.Empty; id = Guid.Parse(content.id.ToString()); if (id != Guid.Empty && StructureGraph.Instance.CanSee(id, uId)) { msg.body.rules.Add(rule); } } if (msg.body.rules.Count > 0) { var connectionId = ds[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(msg, connectionId); } }); return(Helper.BuildMessage(what)); } if (what == "node-get-light-control-config") { var answer = Helper.BuildMessage(what); string[] lightControlMetod = new string[4]; int[] lightBeforeSunRise = new int[4]; int[,] afterSunSetAndBeforeSunRise = new int[4, 2]; dynamic[,] lightSheduleOn = new dynamic[4, 2]; dynamic[,] lightSheduleOff = new dynamic[4, 2]; DateTime dt1970 = new DateTime(1970, 1, 1, 0, 0, 0); DateTime dt1970With1sec = new DateTime(1970, 1, 1, 0, 0, 1); Guid id = Guid.Parse(message.body.objectId.ToString()); dynamic tube = StructureGraph.Instance.GetTube(id, userId); var dtube = tube as IDictionary <string, object>; if (dtube.ContainsKey("strConfig")) { string strConfig = (string)tube.strConfig; var bytesConfig = strConfig.Split('-').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray(); LightConfig conf = StructsHelper.Instance.setBytesFromConfig <LightConfig>(bytesConfig, new LightConfig()); //Celestial cel = Celestial.CalculateCelestialTimes(Convert.ToInt32(conf.u32lat)+0, Convert.ToInt32(conf.u32lon), new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day)); //DateTime sunRiseUTC = cel.SunRise.Value; //DateTime sunSetUTC = cel.SunSet.Value; //DateTime lightAstronomOn = sunRiseUTC.AddHours(Convert.ToInt32(conf.u8timeDiff)); //DateTime lightAstronomOff = sunSetUTC.AddHours(Convert.ToInt32(conf.u8timeDiff)); lightControlMetod[0] = (conf.ligthtChannels1.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels1.u8ControlMode); lightControlMetod[1] = (conf.ligthtChannels2.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels2.u8ControlMode); lightControlMetod[2] = (conf.ligthtChannels3.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels3.u8ControlMode); lightControlMetod[3] = (conf.ligthtChannels4.u8ControlMode == 0xFF) ? "" : Convert.ToString(conf.ligthtChannels4.u8ControlMode); afterSunSetAndBeforeSunRise[0, 0] = (conf.ligthtChannels1.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels1.u8afterSunSet); afterSunSetAndBeforeSunRise[1, 0] = (conf.ligthtChannels2.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels2.u8afterSunSet); afterSunSetAndBeforeSunRise[2, 0] = (conf.ligthtChannels3.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels3.u8afterSunSet); afterSunSetAndBeforeSunRise[3, 0] = (conf.ligthtChannels4.u8afterSunSet == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels4.u8afterSunSet); afterSunSetAndBeforeSunRise[0, 1] = (conf.ligthtChannels1.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels1.u8beforeSunRise); afterSunSetAndBeforeSunRise[1, 1] = (conf.ligthtChannels2.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels2.u8beforeSunRise); afterSunSetAndBeforeSunRise[2, 1] = (conf.ligthtChannels3.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels3.u8beforeSunRise); afterSunSetAndBeforeSunRise[3, 1] = (conf.ligthtChannels4.u8beforeSunRise == 0xFF) ? 0 : Convert.ToInt32(conf.ligthtChannels4.u8beforeSunRise); lightSheduleOn[0, 0] = conf.ligthtChannels1.on1; lightSheduleOn[1, 0] = conf.ligthtChannels2.on1; lightSheduleOn[2, 0] = conf.ligthtChannels3.on1; lightSheduleOn[3, 0] = conf.ligthtChannels4.on1; lightSheduleOn[0, 1] = conf.ligthtChannels1.on2; lightSheduleOn[1, 1] = conf.ligthtChannels2.on2; lightSheduleOn[2, 1] = conf.ligthtChannels3.on2; lightSheduleOn[3, 1] = conf.ligthtChannels4.on2; lightSheduleOff[0, 0] = conf.ligthtChannels1.off1; lightSheduleOff[1, 0] = conf.ligthtChannels2.off1; lightSheduleOff[2, 0] = conf.ligthtChannels3.off1; lightSheduleOff[3, 0] = conf.ligthtChannels4.off1; lightSheduleOff[0, 1] = conf.ligthtChannels1.off2; lightSheduleOff[1, 1] = conf.ligthtChannels2.off2; lightSheduleOff[2, 1] = conf.ligthtChannels3.off2; lightSheduleOff[3, 1] = conf.ligthtChannels4.off2; answer.body.strConfig = strConfig; answer.body.lightControlMetod = lightControlMetod; answer.body.afterSunSetAndBeforeSunRise = afterSunSetAndBeforeSunRise; answer.body.lightSheduleOn = lightSheduleOn; answer.body.lightSheduleOff = lightSheduleOff; } return(answer); } if (what == "node-get-matrix-terminal-config") { var answer = Helper.BuildMessage(what); Guid id = Guid.Parse(message.body.objectId.ToString()); dynamic node = StructureGraph.Instance.GetNodeById(id); var dnode = node as IDictionary <string, object>; if (dnode.ContainsKey("config")) { string strConfig = (string)node.config; var bytesConfig = strConfig.Split('-').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray(); MatrixTerminalConfig conf = StructsHelper.Instance.setBytesFromConfig <MatrixTerminalConfig>(bytesConfig, new MatrixTerminalConfig()); answer.body.config = conf; List <dynamic> listProfile = new List <dynamic>(); List <string> listApnName = new List <string>(); foreach (var profile in conf.profile) { dynamic profileTmp = new ExpandoObject(); string ipPort = StructsHelper.Instance.ParseStringFromBytes(profile.ip_port); profileTmp.ip = (ipPort.Contains(':')) ? ipPort.Split(':')[0] : ipPort; profileTmp.port = (ipPort.Contains(':')) ? ipPort.Split(':')[1] : ""; listProfile.Add(profileTmp); } foreach (var apnName in conf.apnName) { listApnName.Add(StructsHelper.Instance.ParseStringFromBytes(apnName.APN)); } answer.body.profiles = listProfile; answer.body.APNs = listApnName; answer.body.strConfig = strConfig; } return(answer); } if (what == "node-value") { double value = (double)message.body.indication; string valueUnitMeasurement = (string)message.body.indicatioUnitMeasurement; DateTime date = DateTime.Parse(message.body.date.ToString()); Guid objectId = Guid.Parse((string)message.body.objectId); Data.RowsCache.Instance.UpdateValue(value, valueUnitMeasurement, date, objectId, userId); Carantine.Instance.Push(objectId); } if (what == "node-save") { //var node = message.body.node; //Data.StructureGraph.Instance.SaveNode(node.type.ToString(), node, Guid.Parse((string)session.User.id)); } if (what == "nodes-save") { var nodes = message.body.nodes; var tokens = new List <dynamic>(); foreach (var node in nodes) { var token = node; token.userId = userId; tokens.Add(token); } Data.NodeBackgroundProccessor.Instance.AddTokens(tokens); return(Helper.BuildMessage(what)); } if (what == "node-poll-server") { string serverName = message.body.serverName; var server = StructureGraph.Instance.GetPollServer(serverName); var ans = Helper.BuildMessage(what); ans.body.server = StructureGraph.Instance.GetServer(serverName, Guid.Parse((string)session.userId)); return(ans); } if (what == "nodes-poll-branch") { string serverName = message.body.serverName; var server = StructureGraph.Instance.GetPollServer(serverName); var ans = Helper.BuildMessage(what); ans.body.server = server;//StructureGraph.Instance.GetServer(serverName, Guid.Parse((string)session.userId)); return(ans); } return(Helper.BuildMessage(what)); }
public async Task <dynamic> Handle(dynamic session, dynamic message) { string what = message.head.what; Guid userId = Guid.Parse(session.userId.ToString()); if (what == "rows-cache-update") { RowsCache.Instance.Update(userId); var ans = Helper.BuildMessage(what); return(ans); } if (what == "rows-get-2") { var filter = message.body.filter; var rows = RowsCache.Instance.Get(filter, userId); var ans = Helper.BuildMessage(what); ans.body = rows; return(ans); } if (what == "rows-get-3") { var filter = message.body.filter; var rows = RowsCache.Instance.Get(filter, userId); var ans = Helper.BuildMessage(what); ans.body.ids = (rows.rows as IEnumerable <dynamic>).Select(r => r.id).ToArray(); return(ans); } if (what == "rows-get-4") { var ids = new List <Guid>(); foreach (var id in message.body.ids) { ids.Add(Guid.Parse(id.ToString())); } var rows = RowsCache.Instance.Get(ids, userId); var ans = Helper.BuildMessage(what); ans.body.rows = rows; return(ans); } if (what == "rows-get-light") { var ids = new List <Guid>(); foreach (var id in message.body.ids) { ids.Add(Guid.Parse(id.ToString())); } var rows = RowsCache.Instance.Get(ids, userId); var sw = new Stopwatch(); var datas = new List <dynamic>(); var data0 = new List <dynamic>(); var records = RecordsDecorator.Decorate(ids.ToArray(), DateTime.Now.AddMinutes(-20), DateTime.Now.AddHours(1), "Current", new Guid()); foreach (var id in ids) { data0.Clear(); foreach (var group in records.Where(r => r.ObjectId == id).GroupBy(r => r.Date)) { dynamic rec = new ExpandoObject(); rec.date = group.Key; rec.objectId = id; var drec = rec as IDictionary <string, object>; foreach (var record in group) { var unit = record.S2; var val = record.D1; var name = record.S1.Replace(".", "").Replace(" ", ""); if (!drec.ContainsKey(name)) { drec.Add(name, val); } } data0.Add(rec); } if (data0.Count > 0) { datas.Add(data0[data0.Count - 1]); } } foreach (var row in rows) { foreach (var data in datas) { if (row.id == data.objectId) { row.dataLight = data; } } } var ans = Helper.BuildMessage(what); ans.body.rows = rows; return(ans); } if (what == "rows-get") { var sw = new Stopwatch(); var result = new List <dynamic>(); var ids = new List <Guid>(); sw.Start(); foreach (var raw in message.body.ids) { var id = Guid.Parse((string)raw); //log.Debug(string.Format("рассматривается строка {0}", id)); //check for cache var cachedRow = CacheRepository.Instance.Get("row", id); //var cachedRow = CacheRepository.Instance.GetLocal("row", id); if (cachedRow == null) { //log.Debug(string.Format("строка {0} НЕ найдена в кеше", id)); ids.Add(id); } else { //log.Debug(string.Format("строка {0} найдена в кеше", id)); var cache = CacheRepository.Instance.Get("cache", id); //var cache = CacheRepository.Instance.GetLocal("cache", id); cachedRow.cache = cache; result.Add(cachedRow); } } sw.Stop(); log.Debug(string.Format("поиск в кеше {0} мс", sw.ElapsedMilliseconds)); sw.Restart(); if (ids.Any()) { IEnumerable <dynamic> res = StructureGraph.Instance.GetRows(ids, Guid.Parse(session.userId)); foreach (var r in res) { var id = Guid.Parse(r.id.ToString()); //log.Debug(string.Format("строка {0} записана в кеш", id)); CacheRepository.Instance.Set("row", id, r); var cache = CacheRepository.Instance.Get("cache", id); //CacheRepository.Instance.SetLocal("row", id, r); //var cache = CacheRepository.Instance.GetLocal("cache", id); r.cache = cache; result.Add(r); } } log.Debug(string.Format("поиск в базе {0} мс", sw.ElapsedMilliseconds)); var answer = Helper.BuildMessage(what); answer.body.rows = result; return(answer); } if (what == "row-get-devices") { var devices = StructureGraph.Instance.GetDevices(); var answer = Helper.BuildMessage(what); answer.body.devices = devices; return(answer); } if (what == "row-get-for-edit") { var tubeId = message.body.id; //StructureGraph.Instance } if (what == "row-save-row") { foreach (var change in message.body.changes) { if (change.mode == "add") { if (change.type == "node") { StructureGraph.Instance.SaveNode(change.entity); } else { StructureGraph.Instance.Merge(change.entity.start, change.entity.end, change.entity, change.entity.type); } } if (change.mode == "upd") { if (change.type == "node") { StructureGraph.Instance.SaveNode(change.entity); } else { StructureGraph.Instance.Merge(change.entity.start, change.entity.end, change.entity, change.entity.type); } } if (change.mode == "del") { if (change.type == "relation") { StructureGraph.Instance.Break(change.entity.start, change.entity.end); } } } var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } var answer = Helper.BuildMessage(what); return(answer); } if (what == "rows-get-ids") { string filter = message.body.filter.text; //var groups = (message.body.filter.groups as IEnumerable<string>).Select(i=>Guid.Parse(i)).ToArray(); var groups = new List <Guid>(); foreach (var gid in message.body.filter.groups) { groups.Add(Guid.Parse(gid.ToString())); } dynamic res = StructureGraph.Instance.GetRowIds(filter, groups.ToArray(), userId); var answer = Helper.BuildMessage(what); answer.body.ids = res; return(answer); } if (what == "rows-for-server") { string serverName = message.body.serverName; var ans = Helper.BuildMessage(what); ans.body.server = StructureGraph.Instance.GetServer(serverName, userId); return(ans); } if (what == "row-get-card") { Guid rowId = Guid.Parse(message.body.rowId.ToString()); var abnormals = Data.Cache.Instance.GetLastRecords("Abnormal", new Guid[] { rowId }); var currents = Data.Cache.Instance.GetLastRecords("Current", new Guid[] { rowId }); var constants = Data.Cache.Instance.GetLastRecords("Constant", new Guid[] { rowId }); var dayDate = Data.Cache.Instance.GetLastDate("Day", rowId); var days = (dayDate != DateTime.MinValue) ? Data.RecordsDecorator.Decorate(new[] { rowId }, dayDate, dayDate, "Day", userId).Where(d => d.Date == dayDate) : null; dynamic ans = Helper.BuildMessage(what); try { var fr = StructureGraph.Instance.GetRows(new Guid[] { rowId }, userId).FirstOrDefault(); var dfr = (fr as IDictionary <string, object>); if (dfr.ContainsKey("Area") && (fr.Area is IEnumerable <dynamic>) && (fr.Area as IEnumerable <object>).Any() && (fr.Area[0] is IDictionary <string, object>)) { var obj = fr.Area[0]; var dobj = fr.Area[0] as IDictionary <string, object>; ans.body.addr = dobj.ContainsKey("name")? obj.name : ""; ans.body.number = dobj.ContainsKey("number") ? obj.number : ""; ans.body.address = dobj.ContainsKey("address") ? obj.address : ""; } if (dfr.ContainsKey("Device") && (fr.Device is IEnumerable <dynamic>) && (fr.Device as IEnumerable <object>).Any() && (fr.Device[0] is IDictionary <string, object>)) { var obj = fr.Device[0]; var dobj = fr.Device[0] as IDictionary <string, object>; ans.body.dev = dobj.ContainsKey("name") ? obj.name : ""; } if (dfr.ContainsKey("CsdConnection") && (fr.CsdConnection is IEnumerable <dynamic>) && (fr.CsdConnection as IEnumerable <object>).Any() && (fr.CsdConnection[0] is IDictionary <string, object>)) { var obj = fr.CsdConnection[0]; var dobj = fr.CsdConnection[0] as IDictionary <string, object>; ans.body.phone = dobj.ContainsKey("phone") ? obj.phone : ""; } } catch (Exception exx) { } if (message.body.matrixId != "undefined") { Guid matrixId = Guid.Parse(message.body.matrixId.ToString()); var signalDate = Data.Cache.Instance.GetLastDate("MatrixSignal", matrixId); var signal = Data.Cache.Instance.GetRecords(signalDate, signalDate, "MatrixSignal", new Guid[] { matrixId }); ans.body.signal = signal.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.level = c.D1; return(d); }); } ans.body.currents = currents.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.serverDate = c.Dt1; d.name = c.S1; d.unit = c.S2; d.value = c.D1; return(d); }); ans.body.constants = constants.Select(c => { dynamic d = new ExpandoObject(); d.name = c.S1; d.value = c.S2; return(d); }); ans.body.days = days == null ? new List <dynamic> { } : days.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.name = c.S1; d.unit = c.S2; d.value = c.D1; return(d); }); ans.body.abnormals = abnormals.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.name = c.S1; return(d); }); return(ans); } if (what == "row-get-card-before20190201") { Guid rowId = Guid.Parse(message.body.rowId.ToString()); var abnormals = Data.Cache.Instance.GetLastRecords("Abnormal", new Guid[] { rowId }); var currents = Data.Cache.Instance.GetLastRecords("Current", new Guid[] { rowId }); var constants = Data.Cache.Instance.GetLastRecords("Constant", new Guid[] { rowId }); var dayDate = Data.Cache.Instance.GetLastDate("Day", rowId); var days = (dayDate != DateTime.MinValue) ? Data.RecordsDecorator.Decorate(new[] { rowId }, dayDate, dayDate, "Day", userId).Where(d => d.Date == dayDate) : null; dynamic ans = Helper.BuildMessage(what); try { var fr = StructureGraph.Instance.GetRows(new Guid[] { rowId }, userId).FirstOrDefault(); var dfr = (fr as IDictionary <string, object>); if (dfr.ContainsKey("Area") && (fr.Area is IEnumerable <dynamic>) && (fr.Area as IEnumerable <object>).Any() && (fr.Area[0] is IDictionary <string, object>)) { var obj = fr.Area[0]; var dobj = fr.Area[0] as IDictionary <string, object>; ans.body.addr = dobj.ContainsKey("name") ? obj.name : ""; ans.body.number = dobj.ContainsKey("number") ? obj.number : ""; ans.body.address = dobj.ContainsKey("address") ? obj.address : ""; } if (dfr.ContainsKey("Device") && (fr.Device is IEnumerable <dynamic>) && (fr.Device as IEnumerable <object>).Any() && (fr.Device[0] is IDictionary <string, object>)) { var obj = fr.Device[0]; var dobj = fr.Device[0] as IDictionary <string, object>; ans.body.dev = dobj.ContainsKey("name") ? obj.name : ""; } if (dfr.ContainsKey("CsdConnection") && (fr.CsdConnection is IEnumerable <dynamic>) && (fr.CsdConnection as IEnumerable <object>).Any() && (fr.CsdConnection[0] is IDictionary <string, object>)) { var obj = fr.CsdConnection[0]; var dobj = fr.CsdConnection[0] as IDictionary <string, object>; ans.body.phone = dobj.ContainsKey("phone") ? obj.phone : ""; } } catch (Exception exx) { } if (message.body.matrixId != "undefined") { Guid matrixId = Guid.Parse(message.body.matrixId.ToString()); var signalDate = Data.Cache.Instance.GetLastDate("MatrixSignal", matrixId); var signal = Data.Cache.Instance.GetRecords(signalDate, signalDate, "MatrixSignal", new Guid[] { matrixId }); ans.body.signal = signal.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.level = c.D1; return(d); }); } ans.body.currents = currents.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.serverDate = c.Dt1; d.name = c.S1; d.unit = c.S2; d.value = c.D1; return(d); }); ans.body.constants = constants.Select(c => { dynamic d = new ExpandoObject(); d.name = c.S1; d.value = c.S2; return(d); }); ans.body.days = days == null ? new List <dynamic> { } : days.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.name = c.S1; d.unit = c.S2; d.value = c.D1; return(d); }); ans.body.abnormals = abnormals.Select(c => { dynamic d = new ExpandoObject(); d.date = c.Date; d.name = c.S1; return(d); }); return(ans); } return(Helper.BuildMessage(what)); }
public async Task <dynamic> Handle(dynamic session, dynamic message) { string what = message.head.what; var userId = Guid.Parse(session.userId.ToString()); if (what == "poll-cancel") { //var sessions = StructureGraph.Instance.GetSessions(); var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { if (sess.id == session.id) { continue; } var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } return(Helper.BuildMessage(what)); } if (what.StartsWith("poll-vcom")) { //var sessions = StructureGraph.Instance.GetSessions(); var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { if (sess.id == session.id) { continue; } var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } return(Helper.BuildMessage(what)); } if (what == "poll") { //препроцессинг //редиректы var dmessage = message.body as IDictionary <string, object>; if (dmessage.ContainsKey("redirect")) { var objIds = new List <Guid>(); foreach (var objId in message.body.objectIds) { objIds.Add(Guid.Parse(objId)); } message.body.objectIds = StructureGraph.Instance.GetRelatedIds(objIds, message.body.redirect.ToString()); } var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { if (sess.id == session.id) { continue; } var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(message, connectionId); } } if (what == "poll-subscribe") { var bag = session.bag as IDictionary <string, object>; if (!bag.ContainsKey(SUBSCRIBE)) { bag.Add(SUBSCRIBE, new Dictionary <Guid, IEnumerable <Guid> >()); } var old = (Dictionary <Guid, IEnumerable <Guid> >)bag[SUBSCRIBE]; foreach (dynamic subs in message.body.subscribers) { Guid tubeId = subs.id; var sattelites = new List <Guid>(); foreach (Guid satteliteId in subs.sattelites) { sattelites.Add(satteliteId); } if (old.ContainsKey(tubeId)) { old[tubeId] = sattelites; } else { old.Add(tubeId, sattelites); } } session.Bag[SUBSCRIBE] = old; } if (what == "poll-unsubscribe") { var bag = session.bag as IDictionary <string, object>; if (!bag.ContainsKey(SUBSCRIBE)) { bag.Add(SUBSCRIBE, new Dictionary <Guid, IEnumerable <Guid> >()); } var old = (Dictionary <Guid, IEnumerable <Guid> >)bag[SUBSCRIBE]; foreach (dynamic subs in message.body.subscribers) { Guid tubeId = subs.tubeId; if (old.ContainsKey(tubeId)) { old.Remove(tubeId); } } session.Bag[SUBSCRIBE] = old; } if (what == "poll-get-objectid-imeina") { string imei = message.body.imei; string networkaddress = $"{message.body.networkaddress}"; var objectId = StructureGraph.Instance.GetTubeIdFromIMEIandNetworkAddress(imei, networkaddress); var answer = Helper.BuildMessage(what); answer.body.objectId = objectId; return(answer); } if (what == "poll-get-objectid-imeina-matrixterminal") { string imei = message.body.imei; string networkaddress = $"{message.body.networkaddress}"; var objectId = StructureGraph.Instance.GetTubeIdFromIMEIandNAMatrixTerminal(imei, networkaddress); var answer = Helper.BuildMessage(what); answer.body.objectId = objectId; return(answer); } if (what == "poll-set-light-astronomtimer") { byte afterSunSet = Byte.Parse(message.body.afterBeforeSunSetRise[0]); byte beforeSunRise = Byte.Parse(message.body.afterBeforeSunSetRise[1]); Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture; byte u8timeDiff = Byte.Parse(message.body.utc); double dLatitude = Double.Parse(((string)message.body.coordinates[0]).Replace(',', '.')); UInt32 latitude = (UInt32)(dLatitude * 10000000); double dLongitude = Double.Parse(((string)message.body.coordinates[1]).Replace(',', '.')); UInt32 longitude = (UInt32)(dLongitude * 10000000); string cmd = "setAstronTimer"; List <byte> listSetAstronom = new List <byte>(); listSetAstronom.Add(u8timeDiff); byte[] u32Lat = BitConverter.GetBytes(latitude); listSetAstronom.AddRange(u32Lat); byte[] u32Lon = BitConverter.GetBytes(longitude); listSetAstronom.AddRange(u32Lon); listSetAstronom.Add(afterSunSet); listSetAstronom.Add(beforeSunRise); dynamic msg = new ExpandoObject(); msg = Helper.BuildMessage("poll"); msg.head.sessionId = message.head.sessionId; msg.body.objectIds = new string[] { (string)message.body.objectId }; msg.body.what = "all"; msg.body.arg = new ExpandoObject(); msg.body.arg.components = "Current"; msg.body.arg.onlyHoles = false; msg.body.arg.cmd = cmd + BitConverter.ToString(listSetAstronom.ToArray()); var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { if (sess.id == session.id) { continue; } var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(msg, connectionId); } } if (what == "poll-light-control-config") { var lightControlMetod = message.body.lightControlMetod; var afterSunSetAndBeforeSunRise = message.body.afterSunSetAndBeforeSunRise; var lightSheduleOn = message.body.lightSheduleOn; var lightSheduleOff = message.body.lightSheduleOff; DateTime dt1970 = new DateTime(1970, 1, 1, 0, 0, 0); Guid id = Guid.Parse(message.body.objectId.ToString()); dynamic tube = StructureGraph.Instance.GetTube(id, userId); string strConfig = (string)tube.strConfig; var bytesConfig = strConfig.Split('-').Select(x => byte.Parse(x, NumberStyles.HexNumber)).ToArray(); LightConfig conf = StructsHelper.Instance.setBytesFromConfig <LightConfig>(bytesConfig, new LightConfig()); string cmd = "setAstronTimer"; if (lightControlMetod.Count > 0 && lightControlMetod[0] != null) { conf.ligthtChannels1.u8ControlMode = Convert.ToByte(lightControlMetod[0]); } conf.ligthtChannels1.u8afterSunSet = Convert.ToByte(afterSunSetAndBeforeSunRise[0][0]); conf.ligthtChannels1.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[0][1]); conf.ligthtChannels1.on1 = lightChannelOnOff(lightSheduleOn[0][0]); conf.ligthtChannels1.on2 = lightChannelOnOff(lightSheduleOn[0][1]); //------------------ conf.ligthtChannels1.off1 = lightChannelOnOff(lightSheduleOff[0][0]); //--------------------- conf.ligthtChannels1.off2 = lightChannelOnOff(lightSheduleOff[0][1]); if (lightControlMetod.Count > 1 && lightControlMetod[1] != null) { conf.ligthtChannels2.u8ControlMode = Convert.ToByte(lightControlMetod[1]); } conf.ligthtChannels2.u8afterSunSet = Convert.ToByte(afterSunSetAndBeforeSunRise[1][0]); conf.ligthtChannels2.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[1][1]); conf.ligthtChannels2.on1 = lightChannelOnOff(lightSheduleOn[1][0]); conf.ligthtChannels2.on2 = lightChannelOnOff(lightSheduleOn[1][1]); conf.ligthtChannels2.off1 = lightChannelOnOff(lightSheduleOff[1][0]); conf.ligthtChannels2.off2 = lightChannelOnOff(lightSheduleOff[1][1]); if (lightControlMetod.Count > 2 && lightControlMetod[2] != null) { conf.ligthtChannels3.u8ControlMode = Convert.ToByte(lightControlMetod[2]); } conf.ligthtChannels3.u8afterSunSet = Convert.ToByte(afterSunSetAndBeforeSunRise[2][0]); conf.ligthtChannels3.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[2][1]); conf.ligthtChannels3.on1 = lightChannelOnOff(lightSheduleOn[2][0]); conf.ligthtChannels3.on2 = lightChannelOnOff(lightSheduleOn[2][1]); conf.ligthtChannels3.off1 = lightChannelOnOff(lightSheduleOff[2][0]); conf.ligthtChannels3.off2 = lightChannelOnOff(lightSheduleOff[2][1]); if (lightControlMetod.Count > 3 && lightControlMetod[3] != null) { conf.ligthtChannels4.u8ControlMode = Convert.ToByte(lightControlMetod[3]); } conf.ligthtChannels4.u8afterSunSet = Convert.ToByte(afterSunSetAndBeforeSunRise[3][0]); conf.ligthtChannels4.u8beforeSunRise = Convert.ToByte(afterSunSetAndBeforeSunRise[3][1]); conf.ligthtChannels4.on1 = lightChannelOnOff(lightSheduleOn[3][0]); conf.ligthtChannels4.on2 = lightChannelOnOff(lightSheduleOn[3][1]); conf.ligthtChannels4.off1 = lightChannelOnOff(lightSheduleOff[3][0]); conf.ligthtChannels4.off2 = lightChannelOnOff(lightSheduleOff[3][1]); byte[] outByte = StructsHelper.Instance.getBytes <LightConfig>(conf); dynamic msg = new ExpandoObject(); msg = Helper.BuildMessage("poll"); msg.head.sessionId = message.head.sessionId; msg.body.objectIds = new string[] { (string)message.body.objectId }; msg.body.what = "all"; msg.body.arg = new ExpandoObject(); msg.body.arg.components = "Current"; msg.body.arg.onlyHoles = false; msg.body.arg.cmd = cmd + BitConverter.ToString(outByte); var sessions = CacheRepository.Instance.GetSessions(); foreach (var sess in sessions) { if (sess.id == session.id) { continue; } var bag = sess as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { continue; } var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(msg, connectionId); } } var ans = Helper.BuildMessage("poll-accepted"); return(ans); }
public async Task <dynamic> Handle(dynamic session, dynamic message) { string what = message.head.what; Guid userId = Guid.Parse(session.userId.ToString()); #region edit if (what == "edit") { var relations = new List <dynamic>(); var nodes = new List <dynamic>(); var tubeIds = new List <Guid>(); foreach (var rule in message.body.rules) { string action = rule.action; string target = rule.target; dynamic content = rule.content; if (target == TARGET_RELATION) { relations.Add(rule); } if (target == TARGET_NODE) { nodes.Add(rule); } } var audit = new List <DataRecord>(); var ids = new List <Guid>(); //Удаление 1.Связей и 2.Нодов foreach (var rule in relations.Union(nodes)) { string action = rule.action; if (action == ACTION_DEL) { string target = rule.target; dynamic content = rule.content; if (target == TARGET_RELATION) { Guid start = Guid.Parse(content.start.ToString()); Guid end = Guid.Parse(content.end.ToString()); ids.Add(start); ids.Add(end); string type = content.type; dynamic body = content.body; body.type = type; var leftTubes = StructureGraph.Instance.GetRelatedTubs(start); var rightTubes = StructureGraph.Instance.GetRelatedTubs(end); var relatedTubes = leftTubes.Union(rightTubes).Distinct(); //var relatedTubes = StructureGraph.Instance.GetRelatedTubs(end); //if (action == ACTION_DEL) { StructureGraph.Instance.DelRelation(start, end, type, userId); var st = StructureGraph.Instance.GetNodeById(start, userId); var ed = StructureGraph.Instance.GetNodeById(end, userId); if (st.type == "Folder" && ed.type == "Folder") { audit.AddRange(MakeAudit(string.Format("группа {0} удалена из группы {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Folder" && ed.type == "Area") { audit.AddRange(MakeAudit(string.Format("плошадка {0} удалена из группы {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "MatrixConnection") { audit.AddRange(MakeAudit(string.Format("контроллер матрикс {0} отвязан от объекта {1}", ed.imei, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "CsdConnection") { audit.AddRange(MakeAudit(string.Format("модем или контроллер СТЕЛ {0} отвязан от объекта {1}", ed.phone, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "LanConnection") { audit.AddRange(MakeAudit(string.Format("ethernet контроллер {0}:{1} отвязан от объекта {2}", ed.host, ed.port, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else { audit.AddRange(MakeAudit(string.Format("удалено соединение {0} -> {1}", st.id, Guid.Parse(ed.id.ToString())), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } } } else if (target == TARGET_NODE) { Guid id = Guid.Parse(content.id.ToString()); ids.Add(id); string type = content.type; dynamic body = content.body; //NamesCache.Instance.Update(body, userId); if (type == "Tube") { tubeIds.Add(id); } var relatedTubes = StructureGraph.Instance.GetRelatedTubs(id); { StructureGraph.Instance.DelNode(id, type, userId); //var st = StructureGraph.Instance.GetNodeById(start, userId); //var ed = StructureGraph.Instance.GetNodeById(end, userId); if (body.type == "Folder") { audit.AddRange(MakeAudit(string.Format("группа {0} удалена", body.name), userId, relatedTubes, Guid.Parse(body.id.ToString()))); } else { audit.AddRange(MakeAudit(string.Format("нод {0} удален", body.id), userId, relatedTubes, Guid.Parse(body.id.ToString()))); } } } } } //Добавление или Изменение 1.Нодов и 2.Связей foreach (var rule in nodes.Union(relations)) { string action = rule.action; string target = rule.target; dynamic content = rule.content; if ((action == ACTION_ADD) || (action == ACTION_UPD)) { if (target == TARGET_RELATION) { Guid start = Guid.Parse(content.start.ToString()); Guid end = Guid.Parse(content.end.ToString()); ids.Add(start); ids.Add(end); string type = content.type; dynamic body = content.body; body.type = type; var leftTubes = StructureGraph.Instance.GetRelatedTubs(start); var rightTubes = StructureGraph.Instance.GetRelatedTubs(end); var relatedTubes = leftTubes.Union(rightTubes).Distinct(); //var relatedTubes = StructureGraph.Instance.GetRelatedTubs(end); if (action == ACTION_ADD) { StructureGraph.Instance.AddOrUpdRelation(start, end, type, body, userId); var st = StructureGraph.Instance.GetNodeById(start, userId); //F4E311F5-35E6-4E35-90D5-BA85F1A315CB var ed = StructureGraph.Instance.GetNodeById(end, userId); //f4e311f5-35e6-4e35-90d5-ba85f1a315cb if (st.type == "Folder" && ed.type == "Folder") { audit.AddRange(MakeAudit(string.Format("группа {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Folder" && ed.type == "Area") { audit.AddRange(MakeAudit(string.Format("плошадка {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "MatrixConnection") { audit.AddRange(MakeAudit(string.Format("контроллер матрикс {0} привязан к объекту {1}", ed.imei, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "CsdConnection") { audit.AddRange(MakeAudit(string.Format("модем или контроллер СТЕЛ {0} привязан к объекту {1}", ed.phone, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "LanConnection") { audit.AddRange(MakeAudit(string.Format("ethernet контроллер {0}:{1} привязан к объекту {2}", ed.host, ed.port, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else { audit.AddRange(MakeAudit(string.Format("добавлено соединение {0} -> {1}", st.id, Guid.Parse(ed.id.ToString())), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } } else if (action == ACTION_UPD) { StructureGraph.Instance.AddOrUpdRelation(start, end, type, body, userId); var st = StructureGraph.Instance.GetNodeById(start, userId); var ed = StructureGraph.Instance.GetNodeById(end, userId); if (st.type == "Folder" && ed.type == "Folder") { audit.AddRange(MakeAudit(string.Format("группа {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Folder" && ed.type == "Area") { audit.AddRange(MakeAudit(string.Format("плошадка {0} добавлена в группу {1}", ed.name, st.name), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "MatrixConnection") { audit.AddRange(MakeAudit(string.Format("контроллер матрикс {0} привязан к объекту {1}", ed.imei, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "CsdConnection") { audit.AddRange(MakeAudit(string.Format("модем или контроллер СТЕЛ {0} привязан к объекту {1}", ed.phone, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else if (st.type == "Tube" && ed.type == "LanConnection") { audit.AddRange(MakeAudit(string.Format("ethernet контроллер {0}:{1} привязан к объекту {2}", ed.host, ed.port, st.id), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } else { audit.AddRange(MakeAudit(string.Format("обновлено соединение {0} -> {1}", st.id, Guid.Parse(ed.id.ToString())), userId, relatedTubes, Guid.Parse(ed.id.ToString()))); } } } else if (target == TARGET_NODE) { Guid id = Guid.Parse(content.id.ToString()); ids.Add(id); string type = content.type; dynamic body = content.body; //NamesCache.Instance.Update(body, userId); if (type == "Tube") { tubeIds.Add(id); } else if (type == "Area") { if ((body as IDictionary <string, object>).ContainsKey("addr") && (body.addr is string) && ((body.addr as string) != null) && ((body.addr as string) != "")) { body.city = ""; body.street = ""; body.house = ""; body.fiasid = ""; body.address = ""; var response = api.QueryAddress(body.addr as string); if (response != null && response.suggestions.Count > 0) { var result = response.suggestions.FirstOrDefault().data; body.city = result.city_with_type ?? ""; body.street = result.street_with_type ?? ""; body.house = result.house ?? ""; body.fiasid = result.house_fias_id ?? ""; body.address = $"{body.city}, {body.street}, {body.house}"; } } } var relatedTubes = StructureGraph.Instance.GetRelatedTubs(id); if (action == ACTION_ADD) { StructureGraph.Instance.AddNode(id, type, body, userId); var ser = JsonConvert.SerializeObject(body).Replace(@"/""", "'"); if (body.type == "Folder") { audit.AddRange(MakeAudit(string.Format("добавлена группа ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "Area") { audit.AddRange(MakeAudit(string.Format("добавлена площадка учета ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "Tube") { audit.AddRange(MakeAudit(string.Format("добавлена точка учета ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "CsdConnection") { audit.AddRange(MakeAudit(string.Format("добавлено модемное соединение ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "MatrixConnection") { audit.AddRange(MakeAudit(string.Format("добавлено соединение matrix ({0})", ser), userId, relatedTubes, id)); } else { audit.AddRange(MakeAudit(string.Format("добавлен объект {0}", ser), userId, relatedTubes, id)); } } else if (action == ACTION_UPD) { StructureGraph.Instance.UpdNode(id, type, body, userId); var ser = JsonConvert.SerializeObject(body).Replace(@"/""", "'"); if (body.type == "Folder") { audit.AddRange(MakeAudit(string.Format("обновлена группа ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "Area") { audit.AddRange(MakeAudit(string.Format("обновлена площадка учета ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "Tube") { audit.AddRange(MakeAudit(string.Format("обновлена точка учета ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "CsdConnection") { audit.AddRange(MakeAudit(string.Format("обновлено модемное соединение ({0})", ser), userId, relatedTubes, id)); } else if (body.type == "MatrixConnection") { audit.AddRange(MakeAudit(string.Format("обновлено соединение matrix ({0})", ser), userId, relatedTubes, id)); } else { audit.AddRange(MakeAudit(string.Format("обновлен объект {0}", ser), userId, relatedTubes, id)); } } } } } foreach (var node in nodes) { NamesCache.Instance.Update(node.content.body, userId); } Cache.Instance.SaveRecords(audit); RowsCache.Instance.UpdateRow(tubeIds, userId); ids.Distinct().ToList().ForEach(id => CacheRepository.Instance.Del("row", id)); var sessions = CacheRepository.Instance.GetSessions(); sessions.AsParallel().ForAll(s => { var ds = s as IDictionary <string, object>; if (ds == null || !ds.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID) || ds[SignalRConnection.SIGNAL_CONNECTION_ID] == null) { return; } Guid uId = Guid.Parse(s.userId.ToString()); dynamic msg = Helper.BuildMessage("changes"); msg.body.rules = new List <dynamic>(); foreach (var rule in message.body.rules) { string target = rule.target; dynamic content = rule.content; Guid id = Guid.Empty; if (target == TARGET_RELATION) { id = Guid.Parse(content.end.ToString()); } else if (target == TARGET_NODE) { id = Guid.Parse(content.id.ToString()); } if (id != Guid.Empty && StructureGraph.Instance.CanSee(id, uId)) { msg.body.rules.Add(rule); } } if (msg.body.rules.Count > 0) { var connectionId = ds[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(msg, connectionId); } }); } #endregion if (what == "edit-get-connections") { string filter = message.body.filter; var types = new List <string>(); foreach (string type in message.body.types) { types.Add(type); } var dbody = message.body as IDictionary <string, object>; Guid startId = Guid.Empty; //if (dbody.ContainsKey("startId")) //{ // startId = Guid.Parse(message.body.startId.ToString()); //} var answer = Helper.BuildMessage(what); //StructureGraph.Instance.GetNeightbours(startId, userId); answer.body.connections = StructureGraph.Instance.GetConnections(filter, types, userId); return(answer); } if (what == "edit-get-wave") { Guid startId = Guid.Parse(message.body.startId.ToString()); var answer = Helper.BuildMessage(what); answer.body.wave = StructureGraph.Instance.GetNeightbours(startId, userId); return(answer); } if (what == "edit-get-devices") { var answer = Helper.BuildMessage(what); answer.body.devices = StructureGraph.Instance.GetDevices(); return(answer); } if (what == "edit-get-fias") { var answer = Helper.BuildMessage(what); string queryText = ""; if ((message.body as IDictionary <string, object>).ContainsKey("searchText")) { queryText = message.body.searchText; } AddressSuggestQuery asquery = new AddressSuggestQuery(queryText); if ((message.body as IDictionary <string, object>).ContainsKey("searchFias")) { string queryFias = message.body.searchFias; AddressData addrData = new AddressData(); addrData.fias_id = queryFias; asquery.locations = new AddressData[] { addrData }; } var response = api.QueryAddress(asquery); if (response == null) { throw new Exception("Сервис подсказок недоступен"); } var results = new List <dynamic>(); foreach (var suggest in response.suggestions) { dynamic result = new ExpandoObject(); result.value = suggest.value; result.fiasid = suggest.data.fias_id; result.fiaslvl = suggest.data.fias_level; result.housefiasid = suggest.data.house_fias_id; results.Add(result); } answer.body.results = results; return(answer); } if (what == "edit-get-row") { var answer = Helper.BuildMessage(what); Guid id; if (message.body.isNew) { answer.body.area = new ExpandoObject(); answer.body.area.id = Guid.NewGuid(); answer.body.area.type = "Area"; answer.body.tube = new ExpandoObject(); answer.body.tube.id = Guid.NewGuid(); answer.body.tube.type = "Tube"; } else { id = Guid.Parse(message.body.id.ToString()); answer.body.area = StructureGraph.Instance.GetArea(id, userId); answer.body.tube = StructureGraph.Instance.GetTube(id, userId); answer.body.areaIsNew = false; if (answer.body.tube != null && answer.body.area == null) { answer.body.area = new ExpandoObject(); answer.body.area.id = Guid.NewGuid(); answer.body.area.type = "Area"; answer.body.areaIsNew = true; } answer.body.device = StructureGraph.Instance.GetTubeDevice(id, userId); answer.body.Tube = StructureGraph.Instance.GetHouseTubes(id, userId); //answer.body.connections = StructureGraph.Instance.GetTubeConnections(id, userId); answer.body.relations = StructureGraph.Instance.GetTubeRelations(id, userId); } answer.body.devices = StructureGraph.Instance.GetDevices(); //answer.body.ports = StructureGraph.Instance.GetPollPorts(userId); return(answer); } //if (what == "edit-get-house") //{ // var answer = Helper.BuildMessage(what); // Guid id; // if (message.body.isNew) // { // answer.body.area = new ExpandoObject(); // answer.body.area.id = Guid.NewGuid(); // answer.body.area.type = "Area"; // answer.body.tube = new ExpandoObject(); // answer.body.tube.id = Guid.NewGuid(); // answer.body.tube.type = "Tube"; // } // else // { // id = Guid.Parse(message.body.id.ToString()); // answer.body.area = StructureGraph.Instance.GetArea(id, userId); // answer.body.tube = StructureGraph.Instance.GetTube(id, userId); // answer.body.device = StructureGraph.Instance.GetTubeDevice(id, userId); // answer.body.relations = StructureGraph.Instance.GetTubeRelations(id, userId); // } // return answer; //} if (what == "edit-get-folder") { var answer = Helper.BuildMessage(what); Guid id; if (message.body.isNew) { answer.body.folderNew = new ExpandoObject(); answer.body.folderNew.id = Guid.NewGuid(); answer.body.folderNew.type = "Folder"; //answer.body.connections = new List<object>(); } if (message.body.id != null) { id = Guid.Parse(message.body.id.ToString()); dynamic pack = StructureGraph.Instance.GetFolder(id, userId); answer.body.folder = pack.folder; answer.body.parent = pack.parent; } return(answer); } if (what == "edit-get-folder-id") { var folderId = Guid.Parse((string)message.body.id); // var folder = StructureGraph.Instance.GetFolderById(folderId, userId); // var answer = Helper.BuildMessage(what); answer.body.folder = folder; return(answer); } if (what == "edit-get-folders-id") { var folders = new List <dynamic>(); foreach (string sid in message.body.ids) { var folderId = Guid.Parse(sid); var folder = StructureGraph.Instance.GetFolderById(folderId, userId); folders.Add(folder); } var answer = Helper.BuildMessage(what); answer.body.folders = folders; return(answer); } if (what == "edit-get-branch") { var answer = Helper.BuildMessage(what); Guid id = Guid.Parse(message.body.id.ToString()); answer.body.branch = StructureGraph.Instance.GetServerBranch(id, userId); return(answer); } if (what == "edit-get-area-id") { var answer = Helper.BuildMessage(what); Guid id = Guid.Parse(message.body.id.ToString()); answer.body.areaId = StructureGraph.Instance.GetIdAreaForTube(id, userId); return(answer); } if (what == "edit-get-area") { var answer = Helper.BuildMessage(what); Guid id = Guid.Parse(message.body.id.ToString()); answer.body.area = StructureGraph.Instance.GetArea(id, userId); return(answer); } if (what == "edit-get-name-area") { var answer = Helper.BuildMessage(what); var ids = message.body.ids; var areas = new List <string>(); foreach (var id in ids) { Guid guid = Guid.Parse(id.ToString()); var area = StructureGraph.Instance.GetArea(guid, userId); if (area != null) { areas.Add(area.name); } } answer.body.areas = areas.ToArray(); return(answer); } if (what == "edit-get-tasks") { var answer = Helper.BuildMessage(what); var tasks = StructureGraph.Instance.GetNodesByType("Task", Guid.Parse(session.userId.ToString())); answer.body.tasks = tasks; return(answer); } if (what == "edit-delate-tube") { var answer = Helper.BuildMessage(what); if (message.body.objectIds == null) { return(answer); } List <Guid> listObjectIds = new List <Guid>(); foreach (var objectId in message.body.objectIds) { Guid id = Guid.Parse(objectId.ToString()); StructureGraph.Instance.DelAllRelationObjects(id, userId); if (StructureGraph.Instance.DelObject(id, userId)) { listObjectIds.Add(id); } } if (listObjectIds.Any()) { Data.Cache.Instance.DeleteRow(listObjectIds); } } if (what == "edit-disable-tube") { Guid id = Guid.Parse(message.body.id.ToString()); var tube = StructureGraph.Instance.GetTube(id, userId); tube.isDisabled = true; StructureGraph.Instance.UpdNode(id, "Tube", tube, userId); NamesCache.Instance.Update(tube, userId); } return(Helper.BuildMessage(what)); }
public void Handle(IEnumerable <Domain.Entities.DataRecord> db_records, Guid userId) { long paramsTime = 0; long statesTime = 0; var sw = new Stopwatch(); sw.Start(); // //Кэш событий dynamic events = null; var eventsUpdated = new List <dynamic>(); // УСТАВКИ - Минимум, Максимум по ТЕКУЩИМ var groups = db_records.Where(r => setpointTypes.Contains(r.Type)).GroupBy(r => r.ObjectId).Select(g => new { objectId = g.Key, records = g.Select(r => r).Distinct() }); // группировка архивных+текущих значений по объектам //var userId = StructureGraph.Instance.GetRootUser(); foreach (var group in groups) // для каждого объекта: { if (!group.records.Any()) { continue; // проверка наличия записей } var parameters = CacheRepository.Instance.GetParameters(group.objectId); // получаем все параметры //Кэш статусов dynamic states = CacheRepository.Instance.Get("setpoint", group.objectId); // инициализация кэша //dynamic states = CacheRepository.Instance.GetLocal("setpoint", group.objectId); if (states == null) { states = new ExpandoObject(); } bool statesUpdate = false; // флаг записи в кэш var dstates = states as IDictionary <string, object>; foreach (var record in group.records) // (текущие) записи для объекта { if (record.D1 == null) { continue; } var sw2 = new Stopwatch(); sw2.Start(); if (record.Type == "Abnormal" && record.D1 != null && record.D1 == 1) { sw2.Stop(); paramsTime += sw2.ElapsedMilliseconds; var sw3 = new Stopwatch(); sw3.Start(); // вычислить значение var value = record.D1; var unit = record.S2; var date = record.Date.ToUniversalTime(); var dt1 = ((DateTime)record.Dt1).ToUniversalTime(); dynamic state = new ExpandoObject(); state.bad = true; if (events == null) { events = CacheRepository.Instance.Get("setpoint-event"); // инициализация кэша //events = CacheRepository.Instance.GetLocal("setpoint-event"); if (events == null) { events = new ExpandoObject(); } } var devents = events as IDictionary <string, object>; var key = string.Format("{0}-{1}-{2}", group.objectId.ToString(), record.S1, date.ToString()); dynamic ev = null; if (!devents.ContainsKey(key)) { ev = new ExpandoObject(); ev.id = null; ev.objectId = group.objectId; ev.param = record.S1; ev.start = date; ev.end = null; ev.message = record.S2; } else { ev = devents[key]; } eventsUpdated.Add(ev); devents[key] = ev; state.bad = true; state.value = value; state.unit = unit; state.date = date; state.dt1 = dt1; dstates[record.S1] = state; statesUpdate = true; sw3.Stop(); statesTime += sw3.ElapsedMilliseconds; } else { // взять у каждой записи параметр var par = parameters.Where(p => p.name == record.S1).Select(p => p).FirstOrDefault(); var dpar = par as IDictionary <string, object>; // узнать, есть ли тег и уставки if (par == null || !dpar.ContainsKey("tag")) { continue; // параметр должен быть теггирован } //TODO сравнение date с предыдущим, т.к интересуют только последние по времени record //dynamic current = new ExpandoObject(); // текущие var min = ParseDoubleParameter(par, "min"); var max = ParseDoubleParameter(par, "max"); //var minNigth = ParseDoubleParameter(par, "minNight"); //var maxNight = ParseDoubleParameter(par, "maxNight"); sw2.Stop(); paramsTime += sw2.ElapsedMilliseconds; if ((min == null) && (max == null)) { continue; // есть уставка? } var sw3 = new Stopwatch(); sw3.Start(); double init = 0.0; if (!dpar.ContainsKey("init") || !Double.TryParse(par.init.ToString(), out init)) { init = 0.0; } double k = 1.0; if (!dpar.ContainsKey("k") || !Double.TryParse(par.k.ToString(), out k)) { k = 1.0; } // вычислить значение var value = init + record.D1 * k; var unit = record.S2; var date = record.Date.ToUniversalTime(); var dt1 = record.Dt1 == null ? DateTime.MinValue : ((DateTime)record.Dt1).ToUniversalTime(); dynamic state; if (!dstates.ContainsKey(par.tag)) { state = new ExpandoObject(); state.bad = false; } else { state = dstates[par.tag]; //проверка даты на прошедшее время if (date < state.date) { continue; } } // проверить на выход за уставку // получаем статус: хорошо-плохо var bad = (value <= min) || (value >= max); // смотрим: если статус изменился, то рождается событие if (state.bad != bad) { if (events == null) { events = CacheRepository.Instance.Get("setpoint-event"); // инициализация кэша //events = CacheRepository.Instance.GetLocal("setpoint-event"); if (events == null) { events = new ExpandoObject(); } } var devents = events as IDictionary <string, object>; var key = string.Format("{0}-{1}", group.objectId.ToString(), par.tag); dynamic ev = null; if (!devents.ContainsKey(key)) { ev = new ExpandoObject(); ev.id = null; ev.objectId = group.objectId; ev.param = par.tag; ev.start = null; ev.end = null; ev.message = ""; } else { ev = devents[key]; } //ухудшение = новое событие if (bad == true) { ev.start = date; ev.end = null; var message = string.Format("Выход за уставки {0}={1}{2} {3}{4}", par.tag, value, unit, min == null ? "" : string.Format("(min={0})", min), max == null ? "" : string.Format("(max={0})", max) ); if (!dpar.ContainsKey("alertMsg") || (par.alertMsg == "")) { ev.message = message; } else { ev.message = par.alertMsg; } log.Info(string.Format("{0:dd HH:mm:ss} началось событие tp={1}: {2}", date, key.Substring(32), ev.message)); } else { var message = string.Format("{0}={1}{2}{3}{4}", par.tag, value, unit, min == null ? "" : string.Format(" мин.={0}", min), max == null ? "" : string.Format(" макс.={0}", max) ); ev.end = date.ToUniversalTime(); log.Info(string.Format("{0:dd HH:mm:ss} закончилось событие tp={1}: {2} при {3}", date, key.Substring(32), ev.message ?? "неизвестное событие", message)); } eventsUpdated.Add(ev); devents[key] = ev; state.bad = bad; } state.value = value; state.unit = unit; state.date = date; state.dt1 = dt1; dstates[par.tag] = state; statesUpdate = true; sw3.Stop(); statesTime += sw3.ElapsedMilliseconds; } } if (statesUpdate == true) { CacheRepository.Instance.Set(states, "setpoint", group.objectId); } } // ... ЕЩЕ СОБЫТИЯ // Обработка событий if (eventsUpdated.Count > 0) { // сохранение кэша событий CacheRepository.Instance.Set(events, "setpoint-event"); var sessions = CacheRepository.Instance.GetSessions(); // оповещение sessions.ToList().ForEach(session => { try { var bag = session as IDictionary <string, object>; if (!bag.ContainsKey(SignalRConnection.SIGNAL_CONNECTION_ID)) { //log.Debug(string.Format("сессия {0} не содержит сигналр подписки", session.id)); return; } dynamic eventsMessage = Helper.BuildMessage("setpoint"); eventsMessage.body.events = eventsUpdated.ToArray(); log.Debug(string.Format("отправка событий {0} шт, сессия {1}", eventsUpdated.Count, session.id)); var connectionId = bag[SignalRConnection.SIGNAL_CONNECTION_ID].ToString(); SignalRConnection.RaiseEvent(eventsMessage, connectionId); } catch (Exception ex) { log.Error(string.Format("сессия {0} битая", session.id), ex); } }); // запись в базу SQL try { var data = new List <dynamic>(); foreach (var ev in eventsUpdated) { dynamic record = new ExpandoObject(); record.id = Guid.NewGuid().ToString(); record.date = ev.start; record.type = DataRecordTypes.EventType.Name; record.objectId = ev.objectId.ToString(); record.s1 = ev.param; record.s2 = ev.message; record.dt1 = DateTime.Now; if (ev.end == null) { record.i1 = 1; } else { record.i1 = 0; record.dt2 = ev.end; } data.Add(record); } // var records = new List <DataRecord>(); foreach (var raw in data) { records.Add(EntityExtensions.ToRecord(raw)); } if (records.Count > 0) { RecordAcceptor.Instance.Save(records); } } catch (Exception ex) { log.Error(string.Format("не удалось сохранить {0} событий в SQL DB", eventsUpdated.Count), ex); } } // sw.Stop(); log.Info(string.Format("обработчик уставок принял {0} записей за {1} мс: параметры={2} уставки={3}", db_records.Count(), sw.ElapsedMilliseconds, paramsTime, statesTime)); //if (events.Any()) //{ //} }