/// <summary> /// 添加若干个相同间隔时间和持续时间的拥堵事件 /// </summary> /// <param name="context"></param> /// <param name="region"></param> /// <param name="time"></param> /// <param name="durationMinutes"></param> /// <param name="count"></param> /// <param name="intervalMinutes"></param> /// <returns></returns> private DateTime AddInterval(DensityContext context, TrafficRegion region, DateTime time, int durationMinutes, int count, int intervalMinutes) { DateTime temp = time; for (int i = 0; i < count; ++i) { AddDuration(context, region, temp, durationMinutes); temp = temp.AddMinutes(durationMinutes + intervalMinutes); } return(temp.AddMinutes(-intervalMinutes)); }
/// <summary> /// 添加一个持续时长拥堵事件 /// </summary> /// <param name="context"></param> /// <param name="region"></param> /// <param name="time"></param> /// <param name="durationMinutes"></param> /// <returns></returns> private DateTime AddDuration(DensityContext context, TrafficRegion region, DateTime time, int durationMinutes) { TrafficEvent trafficEvent = new TrafficEvent { DataId = region.DataId, DateTime = time, EndTime = time.AddMinutes(durationMinutes) }; context.Events.Add(trafficEvent); return(time.AddMinutes(durationMinutes)); }
/// <summary> /// 填充密度集合缓存 /// </summary> /// <param name="memoryCache">缓存</param> /// <param name="density">密度数据</param> /// <returns>密度数据</returns> public static TrafficDensity FillDensity(this IMemoryCache memoryCache, TrafficDensity density) { if (density != null) { TrafficRegion region = memoryCache.GetRegion(density.DataId); if (region != null) { density.RegionName = region.RegionName; } } return(density); }
/// <summary> /// 填充事件缓存 /// </summary> /// <param name="memoryCache">缓存</param> /// <param name="trafficEvent">事件数据</param> /// <returns>事件</returns> public static TrafficEvent FillEvent(this IMemoryCache memoryCache, TrafficEvent trafficEvent) { if (trafficEvent != null) { TrafficRegion region = memoryCache.GetRegion(trafficEvent.DataId); if (region != null) { trafficEvent.RegionName = region.RegionName; trafficEvent.CrossingId = region.Channel.CrossingId ?? 0; trafficEvent.CrossingName = region.Channel.RoadCrossing?.CrossingName; } } return(trafficEvent); }
public List <TrafficChart <string, int> > StatisticsByRegion([FromRoute] string dataId, [FromQuery] DateTime startTime, [FromQuery] DateTime endTime) { dataId = Uri.UnescapeDataString(dataId); TrafficRegion region = _memoryCache.GetRegion(dataId); string remark = region == null?string.Empty:region.RegionName; DateTimeLevel level = DateTimeLevel.Hour; string timeFormat = TimePointConvert.TimeFormat(level); return(_context.Events .Where(e => e.DataId == dataId && e.DateTime >= startTime && e.DateTime <= endTime) .GroupBy(e => TimePointConvert.CurrentTimePoint(level, e.DateTime)) .OrderBy(g => g.Key) .Select(g => new TrafficChart <string, int> { Axis = g.Key.ToString(timeFormat), Value = g.Count(), Remark = remark }).ToList()); }
/// <summary> /// 获取区域 /// </summary> /// <param name="memoryCache">缓存</param> /// <param name="dataId">数据编号</param> /// <param name="defaultRegion">区域</param> /// <returns>区域</returns> public static TrafficRegion GetRegion(this IMemoryCache memoryCache, string dataId, TrafficRegion defaultRegion) { return(memoryCache.TryGetValue(GetRegionKey(dataId), out TrafficRegion region) ? region : defaultRegion); }
public void QueryVipRegions() { List <DensityDevice> devices = new List <DensityDevice>(); int deviceCount = 1; int channelCount = 1; int regionCount = 12; HashSet <string> vips = new HashSet <string>(); //随机创建重点区域 Random random = new Random(); using (IServiceScope serviceScope = TestInit.ServiceProvider.CreateScope()) { using (DensityContext context = serviceScope.ServiceProvider.GetRequiredService <DensityContext>()) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); int deviceId = 1; int crossingId = 1; int regionId = 1; int channelId = 1; for (int i = 0; i < deviceCount; ++i) { DensityDevice densityDevice = new DensityDevice { DeviceId = deviceId++, Ip = "192.168.200.204", Port = 18000 + i }; densityDevice.DeviceName = "设备" + densityDevice.Port; densityDevice.DensityDevice_DensityChannels = new List <DensityDevice_DensityChannel>(); for (int j = 0; j < channelCount; ++j) { RoadCrossing roadCrossing = new RoadCrossing { CrossingId = crossingId, CrossingName = "路口" + crossingId }; DensityChannel channel = new DensityChannel() { ChannelId = channelId.ToString(), ChannelName = $"通道 {densityDevice.DeviceId} {j+1}", ChannelIndex = j + 1, CrossingId = crossingId, Regions = new List <TrafficRegion>(), RoadCrossing = roadCrossing }; DensityDevice_DensityChannel relation = new DensityDevice_DensityChannel { ChannelId = channel.ChannelId, DeviceId = densityDevice.DeviceId, Channel = channel }; channelId++; crossingId++; densityDevice.DensityDevice_DensityChannels.Add(relation); for (int k = 0; k < regionCount; ++k) { int value = random.Next(1, 2); TrafficRegion region = new TrafficRegion { ChannelId = channel.ChannelId, Channel = channel, Region = "1", RegionIndex = k + 1, RegionName = "区域" + regionId++, IsVip = value == 1 }; if (value == 1) { vips.Add(region.DataId); } channel.Regions.Add(region); } } context.Devices.Add(densityDevice); devices.Add(densityDevice); } context.SaveChanges(); } DensityDbSimulator.CreateData(TestInit.ServiceProvider, devices, DataCreateMode.Fixed, DateTime.Today, DateTime.Today); TestInit.RefreshDensityCache(devices); DensitiesManager manager = TestInit.ServiceProvider.GetRequiredService <DensitiesManager>(); var v = manager.QueryVipRegions(); foreach (TrafficDensity density in v) { Assert.IsTrue(vips.Contains(density.DataId)); } } }