public async Task SuggestAddressLocationsKladrTest() { var query = new AddressSuggestQuery("ватутина"); var location = new AddressData { KladrId = "65" }; query.Locations = new AddressData[] { location }; var response = await Api.QueryAddress(query); Assert.Equal("693022", response.Suggestions[0].Data.PostalCode); }
public async Task SuggestAddressLocationsFiasCityTest() { var query = new AddressSuggestQuery("ватутина"); // Южно-Сахалинск var location = new AddressData { CityFiasId = "44388ad0-06aa-49b0-bbf9-1704629d1d68" }; query.Locations = new AddressData[] { location }; var response = await Api.QueryAddress(query); Assert.Equal("693022", response.Suggestions[0].Data.PostalCode); }
public async Task SuggestAddressGeolocationWhenNeedRestrictResultCount() { var query = new AddressSuggestQuery("Ярославская область Октябрьский 12") { Count = 1 }; var response = await Api.QueryAddress(query); var addressData = response.Suggestions.FirstOrDefault().Data; Assert.Equal("57.9847437", addressData.GeoLat); Assert.Equal("39.110142", addressData.GeoLon); Assert.Equal("0", addressData.QcGeo); }
public async Task <ICollection <AddressEM> > Geocode(string request, int maxResultCount = 5) { var result = new List <AddressEM>(); var client = new SuggestClient(ApiKey, HostUrl); var clientRequst = new AddressSuggestQuery(request) { Count = maxResultCount }; var response = await client.QueryAddress(clientRequst); foreach (var suggest in response.Suggestions) { var address = CreateAddressByAddressData(suggest.Data); result.Add(address); } return(result); }
public SuggestAddressResponse QueryAddress(AddressSuggestQuery query) { var request = new RestRequest(ADDRESS_RESOURCE, Method.POST); return(Execute <SuggestAddressResponse>(request, query)); }
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)); }