public async Task <dynamic> Handle(dynamic session, dynamic message) { string what = message.head.what; Guid userId = Guid.Parse(session.userId.ToString()); if (what == "export-ids") { var ids = Data.StructureGraph.Instance.GetRowIds("", new Guid[] { }, userId); var ans = Helper.BuildMessage(what); ans.body.ids = ids; return(ans); } if (what == "export-watertower") { var answer = Helper.BuildMessage(what); Guid objectId = Guid.Parse((string)message.body.objectId); var tube = StructureGraph.Instance.GetTube(objectId, userId); var dtube = tube as IDictionary <string, object>; if (dtube.ContainsKey("criticalMax")) { answer.body.criticalMax = tube.criticalMax.ToString().Replace(',', '.'); } if (dtube.ContainsKey("controlMode")) { answer.body.controlMode = tube.controlMode; } if (dtube.ContainsKey("criticalMin")) { answer.body.criticalMin = tube.criticalMin.ToString().Replace(',', '.');; } if (dtube.ContainsKey("max")) { answer.body.max = tube.max.ToString().Replace(',', '.');; } if (dtube.ContainsKey("min")) { answer.body.min = tube.min.ToString().Replace(',', '.');; } if (dtube.ContainsKey("interval")) { answer.body.interval = tube.interval.ToString().Replace(',', '.');; } return(answer); } if (what == "export-names") { var names = new List <dynamic>(); Func <dynamic, dynamic> toName = (d) => { var dd = d as IDictionary <string, object>; dynamic name = new ExpandoObject(); name.id = d.id; name.device = ""; if (dd.ContainsKey("Device") && d.Device is IEnumerable <dynamic> ) { name.device = d.Device[0].name; } name.name = ""; if (dd.ContainsKey("Area") && d.Area is IEnumerable <dynamic> ) { var area = d.Area[0]; var darea = area as IDictionary <string, object>; if (darea.ContainsKey("name")) { name.name += area.name + " "; } if (darea.ContainsKey("city")) { name.name += area.city + " "; } if (darea.ContainsKey("street")) { name.name += area.street + " "; } if (darea.ContainsKey("house")) { name.name += area.house + " "; } } if (dd.ContainsKey("name")) { name.name += d.name + " "; } return(name); }; var nonCachedIds = new List <Guid>(); foreach (var rid in message.body.ids) { Guid id = Guid.Parse(rid.ToString()); var cachedRow = CacheRepository.Instance.Get("row", id); //var cachedRow = CacheRepository.Instance.GetLocal("row", id); if (cachedRow == null) { nonCachedIds.Add(id); continue; } names.Add(toName(cachedRow)); } var rows = StructureGraph.Instance.GetRows(nonCachedIds, 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); names.Add(toName(row)); } var ans = Helper.BuildMessage(what); ans.body.names = names; return(ans); } if (what == "export-values") { var ans = Helper.BuildMessage(what); bool isAll = false; List <Guid> fiasIds = new List <Guid>(); if ((message.body as IDictionary <string, object>).ContainsKey("fiasIds")) { if ((message.body.fiasIds is string) && (message.body.fiasIds == "*")) { isAll = true; } else if (message.body.fiasIds is IEnumerable <object> ) { foreach (object fiasId in (message.body.fiasIds as IEnumerable <object>)) { Guid id = new Guid(fiasId.ToString()); fiasIds.Add(id); } } } IDictionary <Guid, ExportValue> exportData = new Dictionary <Guid, ExportValue>(); if (isAll || (fiasIds.Count > 0)) { var rows = StructureGraph.Instance.GetRowsFias(fiasIds, userId); foreach (var row in rows) { exportData[row.Key] = new ExportValue { id = row.Value.Id, fiasId = row.Value.FiasId, address = row.Value.Address, name = row.Value.Name, resource = row.Value.Resource, lastRecords = new List <ExportRecord>() }; } var records = RecordsDecorator.DecorateLast(exportData.Keys.ToArray(), "Current", userId); foreach (var record in records) { exportData[record.ObjectId].lastRecords.Add(new ExportRecord { parameter = record.S1, value = record.D1 ?? 0.0, unit = record.S2, date = record.Date, dt = record.Dt1 ?? DateTime.MinValue }); } } ans.body.allIds = isAll; ans.body.fiasIds = fiasIds; ans.body.data = exportData.Values.ToList(); return(ans); } if (what == "export-data") { var sw = new Stopwatch(); string type = message.body.type; DateTime start = message.body.start; DateTime end = message.body.end; var data = new List <dynamic>(); var ids = new List <Guid>(); foreach (var id in message.body.ids) { ids.Add(Guid.Parse(id.ToString())); } var records = RecordsDecorator.Decorate(ids.ToArray(), start, end, type, userId); foreach (var id in ids) { 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; if (thousand.Contains(unit)) { val *= 1000.0; } var name = record.S1.Replace(".", "").Replace(" ", ""); if (!drec.ContainsKey(name)) { drec.Add(name, val); } } data.Add(rec); } } var ans = Helper.BuildMessage(what); ans.body.data = data; 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; Guid userId = Guid.Parse((string)session.user.id); if (what == "records-save") { //var sw = new Stopwatch(); //sw.Start(); var records = new List <DataRecord>(); foreach (var raw in message.body.records) { records.Add(EntityExtensions.ToRecord(raw)); } //RecordsBackgroundProccessor.Instance.AddPart(records); RecordAcceptor.Instance.Save(records); //хук для паралельной обработки записей в микросервисе bus.SendRecords(AdaptRecords(records)); return(Helper.BuildMessage(what)); } if (what == "records-get-load-pretty") { var objectIds = new List <Guid>(); foreach (string target in message.body.targets) { objectIds.Add(Guid.Parse(target)); } DateTime start = message.body.start; DateTime end = message.body.end; string type = message.body.type; var records = RecordsDecorator.Decorate(objectIds.ToArray(), start, end, type, userId).ToDynamic(); var ans = Helper.BuildMessage(what); ans.body.records = records; return(ans); } if (what == "records-get") { var objectIds = new List <Guid>(); foreach (string target in message.body.targets) { var id = Guid.Parse(target); if (StructureGraph.Instance.CanSee(id, Guid.Parse((string)session.userId))) { objectIds.Add(id); } } DateTime start = message.body.start; DateTime end = message.body.end; string type = message.body.type; var records = Cache.Instance.GetRecords(start, end, type, objectIds.ToArray()).ToDynamic(); var ans = Helper.BuildMessage(what); ans.body.records = records; return(ans); } if (what == "records-get1") { var objectIds = new List <Guid>(); foreach (string target in message.body.targets) { var id = Guid.Parse(target); //if (StructureGraph.Instance.CanSee(id, Guid.Parse((string)session.userId))) objectIds.Add(id); } DateTime start = DateTime.Parse(message.body.start); DateTime end = DateTime.Parse(message.body.end); string type = message.body.type; var records = Cache.Instance.GetRecords(start, end, type, objectIds.ToArray()).ToDynamic(); var rec = records.OrderBy(x => x.date); var ans = Helper.BuildMessage(what); ans.body.records = rec; return(ans); } if (what == "records-get-with-ids-and-s1") { List <Guid> listIds = new List <Guid>(); Guid objectId = Guid.Parse((string)message.body.objectId); listIds.Add(objectId); if (message.body.cmd == "findAnotherTubes") { var objectIds = StructureGraph.Instance.GetIdsByTubeId(objectId); listIds.AddRange(objectIds); } else if (((string)message.body.cmd).Contains("ids:")) { listIds.Clear(); string[] strIds = ((string)message.body.cmd).Substring(4).Split(','); for (int i = 0; i < strIds.Length; i++) { if (Guid.TryParse(strIds[i], out Guid guidId)) { listIds.Add(guidId); } } } DateTime start = message.body.start; DateTime end = message.body.end; string type = message.body.type; string s1 = message.body.s1; var records = Cache.Instance.GetWithIdAndS1Records(listIds, start, end, type, s1).ToDynamic(); var ans = Helper.BuildMessage(what); ans.body.records = records; return(ans); } if (what == "records-get-only-with-type") { DateTime start = message.body.start; DateTime end = message.body.end; string type = message.body.type; var records = Cache.Instance.GetDataOnlyWithTypeRecords(start, end, type).ToDynamic(); var ans = Helper.BuildMessage(what); ans.body.records = records; return(ans); } if (what == "records-get-dates") { Guid id = Guid.Parse(message.body.id.ToString()); DateTime start = message.body.start; DateTime end = message.body.end; string type = message.body.type; DateTime[] records = Cache.Instance.GetDateSet(start, end, type, id).ToArray(); var ans = Helper.BuildMessage(what); ans.body.records = records; return(ans); } if (what == "records-save-count") { Guid objectId = Guid.Parse(message.body.objectId.ToString()); DateTime date = DateTime.Now; if (DateTime.TryParse(Convert.ToString(message.body.date), out DateTime tmpDate)) { date = tmpDate; } double count = Convert.ToDouble((string)message.body.count); string comment = message.body.comment.ToString(); var records = new List <DataRecord>(); records.Add(EntityExtensions.ToRecord(CountRecord(objectId, date, count, "Оплата", comment))); RecordAcceptor.Instance.Save(records); return(Helper.BuildMessage(what)); } if (what == "records-delete") { var records = new List <DataRecord>(); List <Guid> listIds = new List <Guid>(); foreach (var id in message.body.ids) { listIds.Add(Guid.Parse((string)id)); } string type = (string)message.body.type; Cache.Instance.DeleteRecords(listIds, type); var ans = Helper.BuildMessage(what); return(ans); } return(Helper.BuildMessage("unhandled")); }