/// <summary> /// 添加设备 /// </summary> /// <param name="deviceInsert">设备信息</param> /// <param name="userName">用户名</param> /// <returns>添加结果</returns> public ObjectResult Add(DensityDeviceInsert deviceInsert, string userName = null) { DensityDevice device = new DensityDevice { DeviceId = 0, DeviceName = deviceInsert.DeviceName, DeviceModel = deviceInsert.DeviceModel, DeviceStatus = (int)DeviceStatus.异常, Ip = deviceInsert.Ip, Port = deviceInsert.Port, DataPort = deviceInsert.DataPort }; try { UpdateChannels(device, deviceInsert.Channels); _context.Devices.Add(device); _context.SaveChanges(); _logger.LogInformation(new EventId((int)LogEvent.编辑设备, userName), $"添加设备 {device}"); return(new OkObjectResult(device)); } catch (Exception) { ModelStateDictionary modelState = CheckError(device, deviceInsert.Channels); if (modelState.IsValid) { throw; } else { return(new BadRequestObjectResult(modelState)); } } }
/// <summary> /// 对设备包含的子项排序 /// </summary> /// <param name="device">设备</param> /// <param name="order">排序方式</param> /// <returns>设备</returns> private DensityDevice OrderInclude(DensityDevice device, string order) { if (order == "status") { device.DensityDevice_DensityChannels = device.DensityDevice_DensityChannels .OrderBy(r => r.Channel.ChannelStatus) .ThenBy(r => r.Channel.ChannelIndex) .ToList(); } else { device.DensityDevice_DensityChannels = device.DensityDevice_DensityChannels .OrderBy(c => c.Channel.ChannelIndex) .ToList(); } foreach (var relation in device.DensityDevice_DensityChannels) { _memoryCache.FillChannel(relation.Channel); } return(device); }
/// <summary> /// 填充设备缓存 /// </summary> /// <param name="memoryCache">缓存</param> /// <param name="device">设备</param> /// <returns>设备</returns> public static DensityDevice FillDevice(this IMemoryCache memoryCache, DensityDevice device) { if (device != null) { device.DeviceStatus_Desc = memoryCache.GetCode(typeof(DeviceStatus), device.DeviceStatus); device.DeviceModel_Desc = memoryCache.GetCode(typeof(DeviceModel), device.DeviceModel); } return(device); }
/// <summary> /// 删除流量设备 /// </summary> /// <param name="deviceId">设备编号</param> /// <param name="userName">用户名</param> /// <returns>删除结果</returns> public IStatusCodeActionResult Remove(int deviceId, string userName = null) { DensityDevice device = _context.Devices.SingleOrDefault(d => d.DeviceId == deviceId); if (device == null) { return(new NotFoundResult()); } _context.Devices.Remove(device); _context.SaveChanges(); _logger.LogInformation(new EventId((int)LogEvent.编辑设备, userName), $"删除设备 {device}"); return(new OkResult()); }
/// <summary> /// 更新设备状态 /// </summary> /// <param name="deviceUpdateStatus">设备状态</param> /// <returns>更新结果</returns> public IStatusCodeActionResult UpdateStatus(DensityDeviceUpdateStatus deviceUpdateStatus) { DensityDevice device = _context.Devices.SingleOrDefault(d => d.DeviceId == deviceUpdateStatus.DeviceId); if (device == null) { return(new NotFoundResult()); } device.DeviceStatus = deviceUpdateStatus.DeviceStatus; _context.Devices.Update(device); _context.SaveChanges(); return(new OkResult()); }
/// <summary> /// 更新设备标注状态 /// </summary> /// <param name="deviceUpdateLocation">设备标注状态</param> /// <returns>更新结果</returns> public IStatusCodeActionResult UpdateLocation(DensityDeviceUpdateLocation deviceUpdateLocation) { DensityDevice device = _context.Devices.SingleOrDefault(d => d.DeviceId == deviceUpdateLocation.DeviceId); if (device == null) { return(new NotFoundResult()); } device.Location = deviceUpdateLocation.Location; device.Marked = true; _context.Devices.Update(device); _context.SaveChanges(); return(new OkResult()); }
/// <summary> /// 查询流量设备 /// </summary> /// <param name="deviceId">设备编号</param> /// <returns>查询结果</returns> public IStatusCodeActionResult Get(int deviceId) { DensityDevice device = Include(_context.Devices) .SingleOrDefault(c => c.DeviceId == deviceId); if (device == null) { return(new NotFoundResult()); } else { _memoryCache.FillDevice(device); OrderInclude(device, null); return(new OkObjectResult(device)); } }
/// <summary> /// 检查设备添加或更新时的错误原因 /// </summary> /// <param name="device">设备</param> /// <param name="channels">通道集合</param> /// <returns>数据校验结果</returns> private ModelStateDictionary CheckError(DensityDevice device, List <DensityChannel> channels) { ModelStateDictionary modelState = new ModelStateDictionary(); if (_context.Devices.Count(d => d.Ip == device.Ip) > 0) { modelState.AddModelError("Ip", "设备IP重复"); } if (channels != null) { List <int> indexes = channels.Select(c => c.ChannelIndex).Distinct().ToList(); if (indexes.Count < channels.Count) { modelState.AddModelError("ChannelIndex", "通道序号重复"); } if (channels.Any(c => c.ChannelIndex <= 0)) { modelState.AddModelError("ChannelIndex", "通道序号应该大于0"); } foreach (DensityChannel newChannel in channels) { ModelStateDictionary channelModelState = ChannelsManager.CheckUpdateError(_context, newChannel); if (channelModelState.IsValid) { if (_context.Device_Channels.Count(dc => dc.ChannelId == newChannel.ChannelId && dc.DeviceId != device.DeviceId) != 0) { modelState.AddModelError("ChannelId", $"通道 {newChannel.ChannelId} 已经关联在其他设备"); } } else { foreach (var(key, value) in channelModelState) { foreach (var error in value.Errors) { modelState.AddModelError(key, error.ErrorMessage); } } } } } return(modelState); }
/// <summary> /// 更新设备下的通道集合 /// </summary> /// <param name="device">设备</param> /// <param name="channels">通道集合</param> private void UpdateChannels(DensityDevice device, List <DensityChannel> channels) { device.DensityDevice_DensityChannels = new List <DensityDevice_DensityChannel>(); if (channels != null) { foreach (var channel in channels) { DensityDevice_DensityChannel relation = new DensityDevice_DensityChannel { DeviceId = device.DeviceId, ChannelId = channel.ChannelId }; device.DensityDevice_DensityChannels.Add(relation); if (!ChannelsManager.UpdateChannel(_context, channel)) { ChannelsManager.AddChannel(_context, channel); } } } }
/// <summary> /// 更新设备 /// </summary> /// <param name="deviceUpdate">设备信息</param> /// <param name="userName">用户名</param> /// <returns>更新结果</returns> public IStatusCodeActionResult Update(DensityDeviceUpdate deviceUpdate, string userName = null) { DensityDevice device = _context.Devices .Include(d => d.DensityDevice_DensityChannels) .SingleOrDefault(d => d.DeviceId == deviceUpdate.DeviceId); if (device == null) { return(new NotFoundResult()); } device.DeviceName = deviceUpdate.DeviceName; device.DeviceModel = deviceUpdate.DeviceModel; device.Ip = deviceUpdate.Ip; device.Port = deviceUpdate.Port; device.DataPort = deviceUpdate.DataPort; try { UpdateChannels(device, deviceUpdate.Channels); _context.Devices.Update(device); _context.SaveChanges(); _logger.LogInformation(new EventId((int)LogEvent.编辑设备, userName), $"更新设备 {device}"); return(new OkResult()); } catch (Exception) { ModelStateDictionary modelState = CheckError(device, deviceUpdate.Channels); if (modelState.IsValid) { throw; } else { return(new BadRequestObjectResult(modelState)); } } }
/// <summary> /// 获取设备在客户端集合中的url /// </summary> /// <param name="device">设备</param> /// <returns>url</returns> private Uri GetDeviceUrl(DensityDevice device) { return(new Uri($"ws://{device.Ip}:{device.DataPort}/{Url}")); }
/// <summary> /// 获取设备在客户端集合中的key /// </summary> /// <param name="device">设备</param> /// <returns>key</returns> private string GetDeviceKey(DensityDevice device) { return(GetDeviceUrl(device).Authority); }
public static List <DensityDevice> CreateDensityDevice(IServiceProvider serviceProvider, int deviceCount, int channelCount, int regionCount, string ip = "127.0.0.1", bool initDatabase = false) { List <DensityDevice> devices = new List <DensityDevice>(); using (IServiceScope serviceScope = serviceProvider.CreateScope()) { using (DensityContext context = serviceScope.ServiceProvider.GetRequiredService <DensityContext>()) { if (initDatabase) { context.Database.EnsureDeleted(); context.Database.EnsureCreated(); } int deviceId = 20000; int crossingId = 20000; int regionId = 20000; int port = 17000; for (int i = 0; i < deviceCount; ++i) { DensityDevice device = new DensityDevice { DeviceId = deviceId, DeviceModel = (int)DeviceModel.MO_AF_A11_04_4X, Ip = ip, DataPort = port, Port = port }; device.DeviceName = "高点测试设备" + device.DataPort; device.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 = $"channel_{device.DeviceId}_{j + 1}", ChannelName = $"高点测试通道 { device.DeviceId} {j + 1}", ChannelType = (int)ChannelType.GB28181, ChannelIndex = j + 1, CrossingId = crossingId, Regions = new List <TrafficRegion>(), RoadCrossing = roadCrossing }; DensityDevice_DensityChannel relation = new DensityDevice_DensityChannel { ChannelId = channel.ChannelId, DeviceId = device.DeviceId, Channel = channel }; port++; deviceId++; crossingId++; device.DensityDevice_DensityChannels.Add(relation); for (int k = 0; k < regionCount; ++k) { channel.Regions.Add(new TrafficRegion { ChannelId = channel.ChannelId, Channel = channel, RegionIndex = k + 1, RegionName = "高点测试区域" + regionId++, Region = "[]", IsVip = true, CarCount = 1, DensityRange = 1, Density = 1, Frequency = 1, Warning = 1, Saturation = 1, WarningDuration = 1 }); } } context.Devices.Add(device); devices.Add(device); context.SaveChanges(); } } } return(devices); }
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)); } } }