public List <HubMessage> Generate(IEnumerable <Flat> flats) { var groups = flats.GroupBy(x => x.House); var rnd = new Random(); var hubMessages = new List <HubMessage>(); Parallel.ForEach(groups, group => { MeterHub hub = null; IEnumerable <Meter> meters = null; IEnumerable <Flat> flts = null; lock (_lock) { hub = _db.MeterHubs.FirstOrDefault(p => p.House.id == group.Key.id); meters = _db.Meters.Include(p => p.Flat).Where(p => p.Hub.id == hub.id).ToList(); flts = meters.Select(p => p.Flat).Distinct().OrderBy(p => p.Num).ToList(); } var hubMessage = new HubMessage() { HubId = hub.id, Messages = new List <MeterMessage>() }; foreach (var flat in group) { var f = flts.FirstOrDefault(x => x.Id == flat.Id); foreach (var meter in f.Meters) { var meterMsg = new MeterMessage() { Id = meter.id, Address = Int32.Parse(f.Num), Env = 1, Maker = "lora", SerialNumber = meter.id, SetupIdentity = 1, Body = new StateMessage { MeasureUnit = GetMeterType(meter.type), Message = "OK", State = 1, MeterDt = DateTime.Now, Volume = float.Parse((200 + rnd.NextDouble() * rnd.Next(0, 800)).ToString()) } }; hubMessage.Messages.Add(meterMsg); } } hubMessages.Add(hubMessage); }); return(hubMessages); }
public async Task RunAsync() { var housesUrl = @"http://dom.mingkh.ru"; var housesResponse = await LoadData(housesUrl + "/api/houses"); var housesJObject = JsonConvert.DeserializeObject <DataGO>(housesResponse); var housesList = new List <House>(); foreach (var house in housesJObject.rows) { var h = new House { id = house.rownumber, square = house.square != "Незаполнено" ? Convert.ToDouble(house.square.Replace(".", ",")) : 0, fullAddress = house.address, year = house.year != "Не заполнено" ? Convert.ToInt32(house.year) : 0, manageStartDate = house.managestartdate != "Не заполнено" ? Convert.ToDateTime(house.managestartdate) : DateTime.MinValue, number = house.url.Split('/').Last(), floors = house.floors != "Не заполнено" ? Convert.ToInt32(house.floors) : 0 }; var result = await LoadPage(housesUrl + house.url) as string; HtmlDocument hap = new HtmlDocument(); hap.LoadHtml(result); var dtnodes = hap.DocumentNode.SelectNodes("//dt"); var ddnodes = hap.DocumentNode.SelectNodes("//dd"); var idx = 0; for (int i = 0; i < dtnodes.Count; i++) { if (dtnodes[i].InnerHtml == "Жилых помещений") { idx = i; break; } } int flats = 0; var isConverted = Int32.TryParse(ddnodes[idx].InnerHtml, out flats); if (isConverted) { h.flatsCount = flats; housesList.Add(h); } } using (var db = new NpgDbContext(conn)) { foreach (var h in housesList) { var(streetStr, houseStr) = GetStreetAndHouse(h.fullAddress); var streetDal = db.Streets.FirstOrDefault(p => p.name == streetStr); if (streetDal != null) { var house = new House { number = houseStr, square = Convert.ToDouble(h.square), year = Convert.ToInt32(h.year), code = Convert.ToInt32(h.code), floors = Convert.ToInt32(h.floors), flatsCount = Convert.ToInt32(h.flatsCount), manageStartDate = Convert.ToDateTime(h.manageStartDate), Street = streetDal }; db.Houses.Add(house); db.SaveChanges(); } else { var street = new Street { name = streetStr }; db.Streets.Add(street); db.SaveChanges(); var house = new House { number = houseStr, square = Convert.ToDouble(h.square), year = Convert.ToInt32(h.year), code = Convert.ToInt32(h.code), floors = Convert.ToInt32(h.floors), flatsCount = Convert.ToInt32(h.flatsCount), manageStartDate = Convert.ToDateTime(h.manageStartDate), Street = db.Streets.FirstOrDefault(p => p.name == streetStr) }; db.Houses.Add(house); db.SaveChanges(); } } foreach (var house in db.Houses.ToList()) { var meterHub = new MeterHub { House = house, code = Guid.NewGuid().ToString() }; db.MeterHubs.Add(meterHub); for (int i = 0; i < house.flatsCount; i++) { var flat = new Flat { Num = (i + 1).ToString(), House = house }; db.Flats.Add(flat); var energyMeter = new Meter { code = Guid.NewGuid().ToString(), type = "energy", Flat = flat, Hub = meterHub }; var heat_water = new Meter { code = Guid.NewGuid().ToString(), type = "heat_water", Flat = flat, Hub = meterHub }; var cold_water = new Meter { code = Guid.NewGuid().ToString(), type = "cold_water", Flat = flat, Hub = meterHub }; db.Meters.Add(energyMeter); db.Meters.Add(heat_water); db.Meters.Add(cold_water); } } db.SaveChanges(); } }