Beispiel #1
0
        /// <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));
                }
            }
        }
Beispiel #2
0
        /// <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);
        }
Beispiel #3
0
 /// <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);
 }
Beispiel #4
0
        /// <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());
        }
Beispiel #5
0
        /// <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());
        }
Beispiel #6
0
        /// <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());
        }
Beispiel #7
0
        /// <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));
            }
        }
Beispiel #8
0
        /// <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);
        }
Beispiel #9
0
 /// <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);
             }
         }
     }
 }
Beispiel #10
0
        /// <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));
                }
            }
        }
Beispiel #11
0
 /// <summary>
 /// 获取设备在客户端集合中的url
 /// </summary>
 /// <param name="device">设备</param>
 /// <returns>url</returns>
 private Uri GetDeviceUrl(DensityDevice device)
 {
     return(new Uri($"ws://{device.Ip}:{device.DataPort}/{Url}"));
 }
Beispiel #12
0
 /// <summary>
 /// 获取设备在客户端集合中的key
 /// </summary>
 /// <param name="device">设备</param>
 /// <returns>key</returns>
 private string GetDeviceKey(DensityDevice device)
 {
     return(GetDeviceUrl(device).Authority);
 }
Beispiel #13
0
        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);
        }
Beispiel #14
0
        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));
                }
            }
        }