示例#1
0
        private async Task Success(IDeviceService deviceService, IDeviceWarnService deviceWarnService,
                                   DeviceStateGroupModel protocolModel)
        {
            await Task.Delay(1000);

            if (_kj1012Setting.CurrentValue.IsUseDeviceLinkage2)
            {
                //恢复时判定所有上级是否存在断线情况,如果上级存在断线情况,下级不恢复
                var deviceList = await deviceService.BaseRepository.Table
                                 .FromSqlRaw("EXEC GetParentErrorDevice @deviceNum", new SqlParameter("deviceNum", protocolModel.DeviceNum))
                                 .ToListAsync();

                if (deviceList.Count > 0)
                {
                    return;
                }
            }

            var device = await deviceService.UpdateStateAsync(protocolModel.DeviceType,
                                                              protocolModel.DeviceNum, protocolModel.DeviceState);

            if (device != null)
            {
                await deviceWarnService.Recovery(device.Id);
            }
        }
示例#2
0
        public async Task ExecReceive(DeviceStateGroupModel protocolModel)
        {
            try
            {
                if (protocolModel != null)
                {
                    using (var serviceScope = _serviceProvider.CreateScope())
                    {
                        IDeviceService deviceService =
                            serviceScope.ServiceProvider.GetService <IDeviceService>();
                        IDeviceWarnService deviceWarnService =
                            serviceScope.ServiceProvider.GetService <IDeviceWarnService>();
                        var setting = _kj1012Setting.CurrentValue;
                        //修改设备最后监测时间
                        await deviceService.UpdateCheckTime(protocolModel.DeviceType, protocolModel.DeviceNum);

                        //如果配置容许屏蔽设备异常信息则屏蔽掉非电池供电和低电量状态
                        if (setting.CloseDeviceWarn)
                        {
                            if (protocolModel.DeviceState != 0)
                            {
                                _logger.LogInformation($"设备异常原始信息,{protocolModel.DeviceNum}:{protocolModel.DeviceState}");
                                var state = protocolModel.DeviceState & 5;
                                if (state == 0)
                                {
                                    return;
                                }
                                protocolModel.DeviceState = state;
                            }
                        }

                        if (protocolModel.DeviceState == 0)
                        {
                            await Success(deviceService, deviceWarnService, protocolModel);
                        }
                        else
                        {
                            await Error(serviceScope, deviceService, deviceWarnService, protocolModel);
                        }
                    }
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e.InnerException?.Message ?? e.Message);
            }
        }
示例#3
0
        private async Task Error(IServiceScope serviceScope, IDeviceService deviceService, IDeviceWarnService deviceWarnService,
                                 DeviceStateGroupModel protocolModel)
        {
            async Task PublishAsync(Guid id)
            {
                var delayTimes = _kj1012Setting.CurrentValue.DeviceWarnDelay;

                //延迟推送大于10秒才执行延迟推送,否则延迟推送没什么意义,延迟推送则在数据处理端处理推送
                if (delayTimes > 0)
                {
                    //对应已恢复的部分状态实时恢复设备表状态
                    if (protocolModel.DeviceState != 2)
                    {
                        var device = await deviceService.BaseRepository.Table.FirstOrDefaultAsync(f => f.Id == id);

                        if (device != null)
                        {
                            if (_kj1012Setting.CurrentValue.IsUseDeviceLinkage2)
                            {
                                if ((device.DeviceState & 2) == 2)
                                {
                                    //恢复时判定所有上级是否存在断线情况,如果上级存在断线情况,下级不恢复
                                    var deviceList = await deviceService.BaseRepository.Table
                                                     .FromSqlRaw("EXEC GetParentErrorDevice @deviceNum", new SqlParameter("deviceNum", protocolModel.DeviceNum))
                                                     .ToListAsync();

                                    if (deviceList.Count > 0)
                                    {
                                        return;
                                    }
                                }
                            }
                            device.DeviceState   = device.DeviceState & protocolModel.DeviceState;
                            device.LastCheckTime = DateTime.Now;
                            await deviceService.SaveAsync(device);
                        }
                    }
                }
                else
                {
                    await deviceService.UpdateStateAsync(id, protocolModel.DeviceState);
                }
            }

            //状态为2由上级单独上报,单独处理
            if (protocolModel.DeviceState == 2)
            {
                var warnDevice = deviceWarnService.BaseRepository.TableNoTracking.FirstOrDefault(f =>
                                                                                                 f.Device.DeviceType == protocolModel.DeviceType &&
                                                                                                 f.Device.DeviceNum == protocolModel.DeviceNum && !f.RecoveryTime.HasValue &&
                                                                                                 f.DeviceState == protocolModel.DeviceState);
                if (warnDevice == null)
                {
                    async Task DeviceError()
                    {
                        var device = await deviceService.GetDeviceByTypeAndNumAsync(protocolModel.DeviceType,
                                                                                    protocolModel.DeviceNum);

                        if (device != null)
                        {
                            var newDeviceWarn = new DeviceWarn
                            {
                                DeviceId    = device.Id,
                                DeviceState = 2,
                                DelayTime   = _kj1012Setting.CurrentValue.DeviceWarnDelay
                            };
                            await deviceWarnService.SaveAsync(newDeviceWarn);
                            await PublishAsync(device.Id);
                        }
                    }

                    if (_kj1012Setting.CurrentValue.IsUseDeviceLinkage)
                    {
                        //基站和分站断线时,上级设备断线,下级设备全部处理为断线
                        if (protocolModel.DeviceType == DeviceTypeEnum.BaseStation ||
                            protocolModel.DeviceType == DeviceTypeEnum.Substation)
                        {
                            var deviceList = await deviceService.BaseRepository.Table
                                             .FromSqlRaw("EXEC GetChildrenSuccessDevice @deviceNum", new SqlParameter("@deviceNum", protocolModel.DeviceNum))
                                             .ToListAsync();

                            if (deviceList.Count == 0)
                            {
                                await DeviceError();
                            }
                            else
                            {
                                foreach (var device in deviceList)
                                {
                                    var newDeviceWarn = new DeviceWarn
                                    {
                                        DeviceId    = device.Id,
                                        DeviceState = 2,
                                        DelayTime   = _kj1012Setting.CurrentValue.DeviceWarnDelay
                                    };
                                    await deviceWarnService.BaseRepository.Table.AddAsync(newDeviceWarn);
                                }
                                var unitOfWork = serviceScope.ServiceProvider.GetService <IUnitOfWork>();
                                var result     = await unitOfWork.SaveChangesAsync();

                                if (result > 0)
                                {
                                    foreach (var device in deviceList)
                                    {
                                        await PublishAsync(device.Id);
                                    }
                                }
                            }
                        }
                        else
                        {
                            await DeviceError();
                        }
                    }
                    else
                    {
                        await DeviceError();
                    }
                }
            }
            else
            {
                var deviceWarns = await deviceWarnService.BaseRepository.Table.Where(f =>
                                                                                     f.Device.DeviceType == protocolModel.DeviceType && f.DeviceState != -1 &&
                                                                                     f.Device.DeviceNum == protocolModel.DeviceNum && !f.RecoveryTime.HasValue).ToListAsync();

                if (deviceWarns.Count > 0)
                {
                    var totalOldState = deviceWarns.Sum(d => d.DeviceState);

                    if (totalOldState != protocolModel.DeviceState)
                    {
                        var totalState = totalOldState | protocolModel.DeviceState;

                        var bitString = CommonHelper.IntToBit(totalState).Reverse().ToArray();

                        var nowBitString = CommonHelper.IntToBit(protocolModel.DeviceState)
                                           .PadLeft(bitString.Length, '0').Reverse().ToArray();
                        bool isPublish = false;
                        for (int i = 0; i < bitString.Length; i++)
                        {
                            if (bitString[i] == '1')
                            {
                                var deviceWarn = deviceWarns.FirstOrDefault(f =>
                                                                            f.DeviceState == Convert.ToInt32(Math.Pow(2, i)));
                                if (deviceWarn == null)
                                {
                                    var newDeviceWarn = new DeviceWarn
                                    {
                                        DeviceId    = deviceWarns.First().DeviceId,
                                        DeviceState = Convert.ToInt32(Math.Pow(2, i))
                                    };
                                    await deviceWarnService.SaveAsync(newDeviceWarn);

                                    isPublish = true;
                                }
                                else
                                {
                                    //恢复异常
                                    if (nowBitString[i] == '0')
                                    {
                                        if (_kj1012Setting.CurrentValue.IsUseDeviceLinkage2)
                                        {
                                            if (deviceWarn.DeviceState == 2)
                                            {
                                                //恢复时判定所有上级是否存在断线情况,如果上级存在断线情况,下级不恢复
                                                var deviceList = await deviceService.BaseRepository.Table
                                                                 .FromSqlRaw("EXEC GetParentErrorDevice @deviceNum", new SqlParameter("deviceNum", protocolModel.DeviceNum))
                                                                 .ToListAsync();

                                                if (deviceList.Count > 0)
                                                {
                                                    return;
                                                }
                                            }
                                        }
                                        deviceWarn.RecoveryTime   = DateTime.Now;
                                        deviceWarn.RecoveryType   = 0;
                                        deviceWarn.RecoveryRemark = "自动检测";
                                        await deviceWarnService.SaveAsync(deviceWarn);

                                        isPublish = true;
                                    }
                                }
                            }
                        }

                        if (isPublish)
                        {
                            await PublishAsync(deviceWarns.First().DeviceId.GetValueOrDefault());
                        }
                    }
                }
                else
                {
                    var device = await deviceService.GetDeviceByTypeAndNumAsync(protocolModel.DeviceType,
                                                                                protocolModel.DeviceNum);

                    if (device != null)
                    {
                        var bitString = CommonHelper.IntToBit(protocolModel.DeviceState).Reverse().ToArray();
                        for (int i = 0; i < bitString.Length; i++)
                        {
                            if (bitString[i] == '1')
                            {
                                var newDeviceWarn = new DeviceWarn
                                {
                                    DeviceId    = device.Id,
                                    DeviceState = Convert.ToInt32(Math.Pow(2, i))
                                };
                                await deviceWarnService.SaveAsync(newDeviceWarn);
                            }
                        }

                        await PublishAsync(device.Id);
                    }
                }
            }
        }