From f63cf8abe88bf7fa1cd2aa67ffa29643771763cd Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Wed, 30 Apr 2025 12:36:54 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=BB=E5=8A=A1=E6=95=B0=E6=8D=AE=E6=9E=84?= =?UTF-8?q?=E5=BB=BA=E6=94=B9=E4=B8=BA=E9=80=9A=E9=81=93=E5=AE=9E=E7=8E=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DataChannels/IDataChannelManageService.cs | 19 +- .../Options/DataMigrationOptions.cs | 2 +- .../IScheduledMeterReadingService.cs | 13 +- .../CollectBusApplicationModule.cs | 10 +- .../DataChannels/DataChannelManage.cs | 18 ++ .../DataChannels/DataChannelManageService.cs | 96 ++++++- .../BasicScheduledMeterReadingService.cs | 249 ++++++++---------- ...nergySystemScheduledMeterReadingService.cs | 39 +-- .../DeviceGroupBalanceControl.cs | 6 +- .../Pages/Monitor.cshtml | 2 +- 10 files changed, 280 insertions(+), 174 deletions(-) create mode 100644 services/JiShe.CollectBus.Application/DataChannels/DataChannelManage.cs diff --git a/services/JiShe.CollectBus.Application.Contracts/DataChannels/IDataChannelManageService.cs b/services/JiShe.CollectBus.Application.Contracts/DataChannels/IDataChannelManageService.cs index 150b6f9..e247796 100644 --- a/services/JiShe.CollectBus.Application.Contracts/DataChannels/IDataChannelManageService.cs +++ b/services/JiShe.CollectBus.Application.Contracts/DataChannels/IDataChannelManageService.cs @@ -1,7 +1,10 @@ -using System; +using JiShe.CollectBus.IotSystems.MeterReadingRecords; +using Microsoft.AspNetCore.Mvc; +using System; using System.Collections.Generic; using System.Linq; using System.Text; +using System.Threading.Channels; using System.Threading.Tasks; namespace JiShe.CollectBus.DataChannels @@ -11,5 +14,19 @@ namespace JiShe.CollectBus.DataChannels /// public interface IDataChannelManageService { + #region 下发任务通道 + + /// + /// 定时任务数据通道写入 + /// + /// + Task ScheduledMeterTaskWriter(ChannelWriter>> _telemetryPacketInfoWriter, Tuple> dataItems); + + /// + /// 定时任务数据入库和Kafka推送通道 + /// + /// + Task ScheduledMeterTaskReadding(ChannelReader>> _telemetryPacketInfoReader); + #endregion } } diff --git a/services/JiShe.CollectBus.Application.Contracts/DataMigration/Options/DataMigrationOptions.cs b/services/JiShe.CollectBus.Application.Contracts/DataMigration/Options/DataMigrationOptions.cs index 7174cad..db6cfcc 100644 --- a/services/JiShe.CollectBus.Application.Contracts/DataMigration/Options/DataMigrationOptions.cs +++ b/services/JiShe.CollectBus.Application.Contracts/DataMigration/Options/DataMigrationOptions.cs @@ -19,7 +19,7 @@ namespace JiShe.CollectBus.DataMigration.Options /// /// 批量处理通道容量 /// - public int ChannelCapacity { get; set; } = 100; + public int ChannelCapacity { get; set; } = 100_00; /// /// 数据库 每批处理量 diff --git a/services/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs b/services/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs index 4dde0be..66cbf2f 100644 --- a/services/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs +++ b/services/JiShe.CollectBus.Application.Contracts/ScheduledMeterReading/IScheduledMeterReadingService.cs @@ -4,6 +4,7 @@ using System.Threading.Tasks; using JiShe.CollectBus.Ammeters; using JiShe.CollectBus.GatherItem; using JiShe.CollectBus.IotSystems.Ammeters; +using JiShe.CollectBus.IotSystems.MeterReadingRecords; using JiShe.CollectBus.IotSystems.Watermeter; using Volo.Abp.Application.Services; @@ -71,7 +72,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 电表自动阀控 /// /// - Task AmmeterScheduledAutoValveControl(); + Task> AmmeterScheduledAutoValveControl(); /// /// 电表自动校时 @@ -81,7 +82,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - Task AmmeterScheduledAutomaticVerificationTime(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); + Task> AmmeterScheduledAutomaticVerificationTime(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); /// /// 日冻结抄读 @@ -91,7 +92,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - Task AmmeterScheduledGetAutomaticDayFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); + Task> AmmeterScheduledGetAutomaticDayFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); /// /// 月冻结数据抄读 @@ -101,7 +102,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - Task AmmeterScheduledGetAutomaticMonthFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); + Task> AmmeterScheduledGetAutomaticMonthFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); #endregion @@ -138,7 +139,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - Task ConcentratorScheduledAutomaticGetTerminalVersion(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); + Task> ConcentratorScheduledAutomaticGetTerminalVersion(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); /// /// 自动获取远程通信模块(SIM)版本信息 @@ -148,7 +149,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - Task ConcentratorScheduledAutomaticGetTelematicsModule(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); + Task> ConcentratorScheduledAutomaticGetTelematicsModule(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps); #endregion diff --git a/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs b/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs index 8b3da38..592d7e5 100644 --- a/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs +++ b/services/JiShe.CollectBus.Application/CollectBusApplicationModule.cs @@ -1,12 +1,18 @@ -using System.Linq; +using System; +using System.Collections.Generic; +using System.Linq; using System.Reflection; +using System.Threading.Channels; using System.Threading.Tasks; using Cassandra.Mapping; using JiShe.CollectBus.Cassandra; +using JiShe.CollectBus.DataChannels; +using JiShe.CollectBus.DataMigration.Options; using JiShe.CollectBus.FreeRedis; using JiShe.CollectBus.FreeSql; using JiShe.CollectBus.Interceptors; using JiShe.CollectBus.IoTDB; +using JiShe.CollectBus.IotSystems.MeterReadingRecords; using JiShe.CollectBus.Kafka; using JiShe.CollectBus.Mappers; using JiShe.CollectBus.Protocol; @@ -74,6 +80,8 @@ public class CollectBusApplicationModule : AbpModule // //await dbContext.InitWatermeterCacheData(); //}).ConfigureAwait(false); + //下发任务通道构建 + DataChannelManage.TaskDataChannel = Channel.CreateUnbounded>>(); //默认初始化表计信息 var dbContext = context.ServiceProvider.GetRequiredService(); diff --git a/services/JiShe.CollectBus.Application/DataChannels/DataChannelManage.cs b/services/JiShe.CollectBus.Application/DataChannels/DataChannelManage.cs new file mode 100644 index 0000000..e1f3979 --- /dev/null +++ b/services/JiShe.CollectBus.Application/DataChannels/DataChannelManage.cs @@ -0,0 +1,18 @@ +using JiShe.CollectBus.IotSystems.MeterReadingRecords; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Channels; +using System.Threading.Tasks; + +namespace JiShe.CollectBus.DataChannels +{ + public static class DataChannelManage + { + /// + /// 下发任务通道 + /// + public static Channel>> TaskDataChannel; + } +} diff --git a/services/JiShe.CollectBus.Application/DataChannels/DataChannelManageService.cs b/services/JiShe.CollectBus.Application/DataChannels/DataChannelManageService.cs index 03cb24f..c335597 100644 --- a/services/JiShe.CollectBus.Application/DataChannels/DataChannelManageService.cs +++ b/services/JiShe.CollectBus.Application/DataChannels/DataChannelManageService.cs @@ -1,27 +1,37 @@ -using JiShe.CollectBus.Application.Contracts; +using DnsClient.Protocol; +using JiShe.CollectBus.Application.Contracts; using JiShe.CollectBus.Common; +using JiShe.CollectBus.Common.DeviceBalanceControl; using JiShe.CollectBus.IoTDB.Context; using JiShe.CollectBus.IoTDB.Interface; +using JiShe.CollectBus.IotSystems.MeterReadingRecords; using JiShe.CollectBus.Kafka.Internal; using JiShe.CollectBus.Kafka.Producer; using JiShe.CollectBus.Protocol.Interfaces; using JiShe.CollectBus.Protocol.Services; using JiShe.CollectBus.RedisDataCache; using JiShe.CollectBus.ScheduledMeterReading; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; using System.Text; +using System.Threading; +using System.Threading.Channels; using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Timing; namespace JiShe.CollectBus.DataChannels { /// /// 数据通道管理服务 /// - public class DataChannelManageService: CollectBusAppService, IDataChannelManageService + public class DataChannelManageService : IDataChannelManageService, ITransientDependency { private readonly ILogger _logger; private readonly IIoTDbProvider _dbProvider; @@ -46,5 +56,87 @@ namespace JiShe.CollectBus.DataChannels _applicationOptions = applicationOptions.Value; _runtimeContext.UseTableSessionPool = true; } + + /// + /// 定时任务数据通道写入 + /// + /// + public async Task ScheduledMeterTaskWriter(ChannelWriter>> _telemetryPacketInfoWriter, Tuple> dataItems) + { + await _telemetryPacketInfoWriter.WriteAsync(dataItems); + } + + /// + /// 定时任务数据入库和Kafka推送通道 + /// + /// + public async Task ScheduledMeterTaskReadding(ChannelReader>> _telemetryPacketInfoReader) + { + var metadata = await _dbProvider.GetMetadata(); + var batchSize = 10000; + var timeout = TimeSpan.FromSeconds(5); // 默认超时时间为5秒 + + List taskInfoList = new List(); + var startTime = DateTime.Now; + var timer = new Stopwatch(); + while (true) + { + var canRead = await _telemetryPacketInfoReader.WaitToReadAsync(); + if (!canRead) + { + continue; + } + + while (taskInfoList != null && taskInfoList.Count < batchSize && (DateTime.Now - startTime) < timeout) + { + if (_telemetryPacketInfoReader.TryRead(out var dataItem)) + { + taskInfoList.AddRange(dataItem.Item2); + } + else + { + //无消息时短暂等待 + await Task.Delay(5); + } + } + + if (taskInfoList != null && taskInfoList.Count > 0) + { + await _dbProvider.BatchInsertAsync(metadata, taskInfoList); + + await DeviceGroupBalanceControl.ProcessWithThrottleAsync( + items: taskInfoList.ToList(), + deviceIdSelector: data => data.DeviceId, + processor: (data, groupIndex) => + { + // _ = KafkaProducerIssuedMessageAction(dateItem.Item1, data, groupIndex); + } + ); + + taskInfoList.Clear(); + } + + startTime = DateTime.Now; + } + } + + /// + /// Kafka 推送消息 + /// + /// 主题名称 + /// 任务记录 + /// 对应分区,也就是集中器号所在的分组序号 + /// + protected async Task KafkaProducerIssuedMessageAction(string topicName, + T taskRecord, int partition) where T : class + { + if (string.IsNullOrWhiteSpace(topicName) || taskRecord == null) + { + throw new Exception($"{nameof(KafkaProducerIssuedMessageAction)} 推送消息失败,参数异常,-101"); + } + + await _producerService.ProduceAsync(topicName, taskRecord, partition); + } + } } diff --git a/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs b/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs index 639a9c3..6d5e01a 100644 --- a/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs +++ b/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs @@ -28,6 +28,10 @@ using System.Linq; using System.Threading.Tasks; using JiShe.CollectBus.Protocol.Models; using System.Threading.Channels; +using static IdentityModel.ClaimComparer; +using JiShe.CollectBus.DataChannels; +using JiShe.CollectBus.DataMigration.Options; +using static System.Runtime.InteropServices.JavaScript.JSType; namespace JiShe.CollectBus.ScheduledMeterReading { @@ -38,35 +42,35 @@ namespace JiShe.CollectBus.ScheduledMeterReading { private readonly ILogger _logger; private readonly IIoTDbProvider _dbProvider; - private readonly IProducerService _producerService; + private readonly IDataChannelManageService _dataChannelManage; private readonly IRedisDataCacheService _redisDataCacheService; - private readonly KafkaOptionConfig _kafkaOptions; - private readonly ServerApplicationOptions _applicationOptions; - private readonly IoTDBRuntimeContext _runtimeContext; private readonly IProtocolService _protocolService; + private readonly DataMigrationOptions _dataMigrationOptions; + private readonly KafkaOptionConfig _kafkaOptions; + private readonly ServerApplicationOptions _applicationOptions; int pageSize = 10000; public BasicScheduledMeterReadingService( ILogger logger, - IProducerService producerService, + IDataChannelManageService dataChannelManage, IRedisDataCacheService redisDataCacheService, IIoTDbProvider dbProvider, - IoTDBRuntimeContext runtimeContext, IProtocolService protocolService, + IOptions dataMigrationOptions, IOptions kafkaOptions, IOptions applicationOptions) { _logger = logger; _dbProvider = dbProvider; - _runtimeContext = runtimeContext; - _producerService = producerService; + _dataChannelManage = dataChannelManage; _redisDataCacheService = redisDataCacheService; - _kafkaOptions = kafkaOptions.Value; - _applicationOptions = applicationOptions.Value; _protocolService = protocolService; - _runtimeContext.UseTableSessionPool = true; + _dataMigrationOptions = dataMigrationOptions.Value; + _kafkaOptions = kafkaOptions.Value; + _applicationOptions = applicationOptions.Value; + } /// @@ -111,8 +115,8 @@ namespace JiShe.CollectBus.ScheduledMeterReading _logger.LogWarning($"{nameof(CreateToBeIssueTasks)} 构建待处理的下发指令任务处理时没有缓存数据,-101"); return; } - var currentTime = DateTime.Now; + //定时抄读 foreach (var item in taskInfos) @@ -147,7 +151,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading meterType: MeterTypeEnum.Ammeter, taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => { - await AmmeterScheduledAutomaticVerificationTime(timeDensity, data, groupIndex, timestamps); + var tempTask = await AmmeterScheduledAutomaticVerificationTime(timeDensity, data, groupIndex, timestamps); + + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"电表自动校时 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); }); } else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase))//集中器版本号读取 @@ -158,7 +169,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading meterType: MeterTypeEnum.Ammeter, taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => { - await ConcentratorScheduledAutomaticGetTerminalVersion(timeDensity, data, groupIndex, timestamps); + var tempTask = await ConcentratorScheduledAutomaticGetTerminalVersion(timeDensity, data, groupIndex, timestamps); + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"集中器 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); }); } else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//SIM卡读取 @@ -169,7 +186,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading meterType: MeterTypeEnum.Ammeter, taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => { - await ConcentratorScheduledAutomaticGetTelematicsModule(timeDensity, data, groupIndex, timestamps); + var tempTask = await ConcentratorScheduledAutomaticGetTelematicsModule(timeDensity, data, groupIndex, timestamps); + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"集中器 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); }); } else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//月冻结 @@ -180,7 +203,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading meterType: MeterTypeEnum.Ammeter, taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => { - await AmmeterScheduledGetAutomaticDayFreezeData(timeDensity, data, groupIndex, timestamps); + var tempTask = await AmmeterScheduledGetAutomaticDayFreezeData(timeDensity, data, groupIndex, timestamps); + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); }); } else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticDayFreezeTime, StringComparison.CurrentCultureIgnoreCase))//日冻结 @@ -191,7 +220,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading meterType: MeterTypeEnum.Ammeter, taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => { - await AmmeterScheduledGetAutomaticMonthFreezeData(timeDensity, data, groupIndex, timestamps); + var tempTask = await AmmeterScheduledGetAutomaticMonthFreezeData(timeDensity, data, groupIndex, timestamps); + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); }); } else @@ -211,7 +246,6 @@ namespace JiShe.CollectBus.ScheduledMeterReading //tasksToBeIssueModel.NextTaskTime; - var metadata = await _dbProvider.GetMetadata(); if (meteryType == MeterTypeEnum.Ammeter.ToString()) { _ = CreateMeterPublishTask( @@ -226,7 +260,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading _logger.LogWarning($"电表 {data.Name} 任务数据构建失败:{data.Serialize()}"); return; } - _ = _dbProvider.BatchInsertAsync(metadata, tempTask); + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerAutoValveControlIssuedEventName, tempTask)); }); } else if (meteryType == MeterTypeEnum.WaterMeter.ToString()) @@ -245,7 +279,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading _logger.LogWarning($"水表 {data.Name} 任务数据构建失败:{data.Serialize()}"); return; } - _ = _dbProvider.BatchInsertAsync(metadata, tempTask); + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.WatermeterSubscriberWorkerAutoReadingIssuedEventName, tempTask)); }); } else @@ -264,8 +298,14 @@ namespace JiShe.CollectBus.ScheduledMeterReading } //电表定时阀控任务处理。 - _ = AmmeterScheduledAutoValveControl(); + var autoValveControlTask = await AmmeterScheduledAutoValveControl(); + if (autoValveControlTask == null || autoValveControlTask.Count <= 0) + { + _logger.LogWarning($"{nameof(AmmeterScheduledAutoValveControl)}电表定时阀控没有可操作的任务"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriter(DataChannelManage.TaskDataChannel.Writer, Tuple.Create(ProtocolConst.AmmeterSubscriberWorkerAutoValveControlIssuedEventName, autoValveControlTask)); } #region 电表采集处理 @@ -287,6 +327,8 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// public virtual async Task InitAmmeterCacheData(string gatherCode = "") { + _ = _dataChannelManage.ScheduledMeterTaskReadding(DataChannelManage.TaskDataChannel.Reader); + //此处代码不要删除 #if DEBUG var timeDensity = "15"; @@ -327,7 +369,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading timer1.Stop(); - _logger.LogError($"读取数据总共花费时间{timer1.ElapsedMilliseconds}毫秒"); + _logger.LogError($"电表初始化读取数据总共花费时间{timer1.ElapsedMilliseconds}毫秒"); DeviceGroupBalanceControl.InitializeCache(focusAddressDataLista, _kafkaOptions.NumPartitions); return; #else @@ -583,26 +625,26 @@ namespace JiShe.CollectBus.ScheduledMeterReading var protocolPlugin = await _protocolService.GetProtocolServiceAsync(ammeterInfo.BrandType); if (protocolPlugin == null) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 创建电表待发送的任务数据{currentTime}没有找到对应的协议组件,-105"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 创建电表待发送的任务数据{currentTime}没有找到对应的协议组件,-105"); return null; } if (string.IsNullOrWhiteSpace(ammeterInfo.ItemCodes)) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 集中器{ammeterInfo.FocusAddress}的电表{ammeterInfo.Name}数据采集指令生成失败,采集项为空,-101"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 集中器{ammeterInfo.FocusAddress}的电表{ammeterInfo.Name}数据采集指令生成失败,采集项为空,-101"); return null; } //载波的不处理 if (ammeterInfo.MeteringPort == (int)MeterLinkProtocolEnum.Carrierwave) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 集中器{ammeterInfo.FocusAddress}的电表{ammeterInfo.Name}数据采集指令生成失败,载波不处理,-102"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 集中器{ammeterInfo.FocusAddress}的电表{ammeterInfo.Name}数据采集指令生成失败,载波不处理,-102"); return null; } if (ammeterInfo.State.Equals(2)) { - _logger.LogWarning($"{nameof(AmmerterCreatePublishTaskAction)} {ammeterInfo.Name} 集中器{ammeterInfo.FocusAddress}的电表{ammeterInfo.Name}状态为禁用,不处理"); + //_logger.LogWarning($"{nameof(AmmerterCreatePublishTaskAction)} {ammeterInfo.Name} 集中器{ammeterInfo.FocusAddress}的电表{ammeterInfo.Name}状态为禁用,不处理"); return null; } @@ -615,22 +657,22 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (string.IsNullOrWhiteSpace(ammeterInfo.AreaCode)) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},集中器通信区号为空"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},集中器通信区号为空"); return null; } if (string.IsNullOrWhiteSpace(ammeterInfo.Address)) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},集中器通信地址为空"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},集中器通信地址为空"); return null; } if (Convert.ToInt32(ammeterInfo.Address) > 65535) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},集中器通信地址无效,确保大于65535"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},集中器通信地址无效,确保大于65535"); return null; } if (ammeterInfo.MeteringCode <= 0 || ammeterInfo.MeteringCode > 33) { - _logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},非有效测量点号({ammeterInfo.MeteringCode})"); + //_logger.LogError($"{nameof(AmmerterCreatePublishTaskAction)} 表ID:{ammeterInfo.MeterId},非有效测量点号({ammeterInfo.MeteringCode})"); return null; } @@ -728,7 +770,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 电表自动阀控 /// /// - public virtual Task AmmeterScheduledAutoValveControl() + public virtual Task> AmmeterScheduledAutoValveControl() { throw new NotImplementedException($"{nameof(AmmeterScheduledAutoValveControl)}请根据不同系统类型进行实现"); } @@ -741,7 +783,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - public virtual async Task AmmeterScheduledAutomaticVerificationTime(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) + public virtual async Task> AmmeterScheduledAutomaticVerificationTime(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm:00}"; @@ -752,11 +794,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (!string.Equals(currentTimeStr, _applicationOptions.AutomaticVerificationTime, StringComparison.CurrentCultureIgnoreCase)) { _logger.LogInformation($"{nameof(AmmeterScheduledAutomaticVerificationTime)} 电表自动校时,非自动校时时间"); - return; + return null; } List taskList = new List(); - var metadata = await _dbProvider.GetMetadata(); var itemCode = T37612012PacketItemCodeConst.AFN10HFN01H; var subItemCode = T6452007PacketItemCodeConst.C08; @@ -766,7 +807,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (protocolPlugin == null) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有找到对应的协议组件,-105"); - return; + return null; } ProtocolBuildResponse builderResponse = await protocolPlugin.BuildAsync(new ProtocolBuildRequest() @@ -796,21 +837,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (taskList == null || taskList.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有自动阀控任务生成,-106"); - return; + return null; } - //任务记录入库 - await _dbProvider.BatchInsertAsync(metadata, taskList); - - //任务信息推送Kafka - _ = DeviceGroupBalanceControl.ProcessWithThrottleAsync( - items: taskList, - deviceIdSelector: data => data.DeviceId, - processor: (data, groupIndex) => - { - _ = KafkaProducerIssuedMessageAction(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, data, groupIndex); - } - ); + return null; //todo 阀控记录入库,推送到新的服务 } @@ -829,7 +859,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - public virtual async Task AmmeterScheduledGetAutomaticDayFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) + public virtual async Task> AmmeterScheduledGetAutomaticDayFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm:00}"; @@ -840,19 +870,17 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (!string.Equals(currentTimeStr, _applicationOptions.AutomaticVerificationTime, StringComparison.CurrentCultureIgnoreCase)) { _logger.LogInformation($"{nameof(AmmeterScheduledAutomaticVerificationTime)} 电表自动校时,非自动校时时间"); - return; + return null; } List taskList = new List(); - var metadata = await _dbProvider.GetMetadata(); - //根据电表型号获取协议插件 var protocolPlugin = await _protocolService.GetProtocolServiceAsync(ammeterInfo.BrandType); if (protocolPlugin == null) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有找到对应的协议组件,-105"); - return; + return null; } foreach (var item in DayFreezeCodes) @@ -880,21 +908,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (taskList == null || taskList.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 日冻结抄读时间{currentTime}没有任务生成,-106"); - return; + return null; } - //任务记录入库 - await _dbProvider.BatchInsertAsync(metadata, taskList); - - //任务信息推送Kafka - _ = DeviceGroupBalanceControl.ProcessWithThrottleAsync( - items: taskList, - deviceIdSelector: data => data.DeviceId, - processor: (data, groupIndex) => - { - _ = KafkaProducerIssuedMessageAction(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, data, groupIndex); - } - ); + return taskList; } catch (Exception) @@ -912,7 +929,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - public virtual async Task AmmeterScheduledGetAutomaticMonthFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) + public virtual async Task> AmmeterScheduledGetAutomaticMonthFreezeData(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm:00}"; @@ -923,19 +940,17 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (!string.Equals(currentTimeStr, _applicationOptions.AutomaticVerificationTime, StringComparison.CurrentCultureIgnoreCase)) { _logger.LogInformation($"{nameof(AmmeterScheduledAutomaticVerificationTime)} 电表自动校时,非自动校时时间"); - return; + return null; } List taskList = new List(); - var metadata = await _dbProvider.GetMetadata(); - //根据电表型号获取协议插件 var protocolPlugin = await _protocolService.GetProtocolServiceAsync(ammeterInfo.BrandType); if (protocolPlugin == null) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有找到对应的协议组件,-105"); - return; + return null; } foreach (var item in DayFreezeCodes) @@ -963,21 +978,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (taskList == null || taskList.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 日冻结抄读时间{currentTime}没有任务生成,-106"); - return; + return null; } - //任务记录入库 - await _dbProvider.BatchInsertAsync(metadata, taskList); - - //任务信息推送Kafka - _ = DeviceGroupBalanceControl.ProcessWithThrottleAsync( - items: taskList, - deviceIdSelector: data => data.DeviceId, - processor: (data, groupIndex) => - { - _ = KafkaProducerIssuedMessageAction(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, data, groupIndex); - } - ); + return taskList; } catch (Exception) @@ -1034,13 +1038,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading IsNumber = false, Value = false }); - await CreateMeterKafkaTaskMessage(ProtocolConst.AmmeterSubscriberWorkerRetryEventName, new IoTDBQueryOptions() - { - TableNameOrTreePath = DevicePathBuilder.GetTableName(), - PageIndex = 1, - PageSize = pageSize, - Conditions = conditions, - }); + //await CreateMeterKafkaTaskMessage(ProtocolConst.AmmeterSubscriberWorkerRetryEventName, new IoTDBQueryOptions() + //{ + // TableNameOrTreePath = DevicePathBuilder.GetTableName(), + // PageIndex = 1, + // PageSize = pageSize, + // Conditions = conditions, + //}); // 释放锁 tryLock.Unlock(); } @@ -1105,7 +1109,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading TasksToBeIssueModel nextTask = new TasksToBeIssueModel() { LastTaskTime = _applicationOptions.FirstCollectionTime.Value.CalculateNextCollectionTime(item.Key), - TimeDensity = item.Key, + TimeDensity = item.Key, }; nextTask.NextTaskTime = nextTask.LastTaskTime.CalculateNextCollectionTime(item.Key);//使用首次采集时间作为下一次采集时间 @@ -1191,13 +1195,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading Value = pendingCopyReadTime }); - _ = CreateMeterKafkaTaskMessage(ProtocolConst.WatermeterSubscriberWorkerAutoReadingIssuedEventName, new IoTDBQueryOptions() - { - TableNameOrTreePath = DevicePathBuilder.GetTableName(), - PageIndex = 1, - PageSize = pageSize, - Conditions = conditions, - }); + //_ = CreateMeterKafkaTaskMessage(ProtocolConst.WatermeterSubscriberWorkerAutoReadingIssuedEventName, new IoTDBQueryOptions() + //{ + // TableNameOrTreePath = DevicePathBuilder.GetTableName(), + // PageIndex = 1, + // PageSize = pageSize, + // Conditions = conditions, + //}); _logger.LogInformation($"{nameof(WatermeterScheduledMeterAutoReadding)} {timeDensity}分钟采集水表数据处理完成"); } @@ -1321,7 +1325,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - public virtual async Task ConcentratorScheduledAutomaticGetTerminalVersion(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) + public virtual async Task> ConcentratorScheduledAutomaticGetTerminalVersion(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm:00}"; @@ -1332,7 +1336,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (!string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase)) { _logger.LogInformation($"{nameof(ConcentratorScheduledAutomaticGetTerminalVersion)} 集中器自动获取版本号,非自动处理时间"); - return; + return null; } List taskList = new List(); @@ -1346,7 +1350,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (protocolPlugin == null) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 集中器自动获取版本号{currentTime}没有找到对应的协议组件,-105"); - return; + return null; } ProtocolBuildResponse builderResponse = await protocolPlugin.BuildAsync(new ProtocolBuildRequest() @@ -1376,21 +1380,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (taskList == null || taskList.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有自动阀控任务生成,-106"); - return; + return null; } - //任务记录入库 - await _dbProvider.BatchInsertAsync(metadata, taskList); - - //任务信息推送Kafka - _ = DeviceGroupBalanceControl.ProcessWithThrottleAsync( - items: taskList, - deviceIdSelector: data => data.DeviceId, - processor: (data, groupIndex) => - { - _ = KafkaProducerIssuedMessageAction(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, data, groupIndex); - } - ); + return taskList; } catch (Exception) { @@ -1407,7 +1400,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 集中器所在分组 /// 采集频率对应的时间戳 /// - public virtual async Task ConcentratorScheduledAutomaticGetTelematicsModule(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) + public virtual async Task> ConcentratorScheduledAutomaticGetTelematicsModule(int timeDensity, AmmeterInfo ammeterInfo, int groupIndex, DateTime timestamps) { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm:00}"; @@ -1418,11 +1411,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (!string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase)) { _logger.LogInformation($"{nameof(ConcentratorScheduledAutomaticGetTelematicsModule)} 自动获取远程通信模块(SIM)版本信息,非自动处理时间"); - return; + return null; } List taskList = new List(); - var metadata = await _dbProvider.GetMetadata(); var itemCode = T37612012PacketItemCodeConst.AFN09HFN09H; @@ -1431,7 +1423,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (protocolPlugin == null) { _logger.LogError($"{nameof(ConcentratorScheduledAutomaticGetTelematicsModule)} 自动获取远程通信模块(SIM)版本信息{currentTime}没有找到对应的协议组件,-105"); - return; + return null; } ProtocolBuildResponse builderResponse = await protocolPlugin.BuildAsync(new ProtocolBuildRequest() @@ -1455,21 +1447,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (taskList == null || taskList.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有自动阀控任务生成,-106"); - return; + return null; } - //任务记录入库 - await _dbProvider.BatchInsertAsync(metadata, taskList); - - //任务信息推送Kafka - _ = DeviceGroupBalanceControl.ProcessWithThrottleAsync( - items: taskList, - deviceIdSelector: data => data.DeviceId, - processor: (data, groupIndex) => - { - _ = KafkaProducerIssuedMessageAction(ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, data, groupIndex); - } - ); + return taskList; } catch (Exception) { @@ -1549,7 +1530,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading _logger.LogError($"{nameof(CreateMeterPublishTask)} {meterType}的{timeDensity}分钟采集待下发任务创建失败,没有获取到缓存信息,-105"); return; } - _logger.LogError($"{nameof(CreateMeterPublishTask)} 采集待下发任务,缓存获取信息共花费{timer.ElapsedMilliseconds}毫秒"); + _logger.LogError($"{nameof(CreateMeterPublishTask)} 构建采集待下发任务,缓存获取信息共花费{timer.ElapsedMilliseconds}毫秒"); await DeviceGroupBalanceControl.ProcessWithThrottleAsync( items: meterInfos, @@ -1624,7 +1605,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading throw new Exception($"{nameof(KafkaProducerIssuedMessageAction)} 推送消息失败,参数异常,-101"); } - await _producerService.ProduceAsync(topicName, taskRecord, partition); + // await _dataChannelManage.ProduceAsync(topicName, taskRecord, partition); } /// diff --git a/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs b/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs index 455f4c2..2a96f64 100644 --- a/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs +++ b/services/JiShe.CollectBus.Application/ScheduledMeterReading/EnergySystemScheduledMeterReadingService.cs @@ -5,6 +5,8 @@ using JiShe.CollectBus.Common.DeviceBalanceControl; using JiShe.CollectBus.Common.Enums; using JiShe.CollectBus.Common.Extensions; using JiShe.CollectBus.Common.Helpers; +using JiShe.CollectBus.DataChannels; +using JiShe.CollectBus.DataMigration.Options; using JiShe.CollectBus.FreeSql; using JiShe.CollectBus.GatherItem; using JiShe.CollectBus.IoTDB.Context; @@ -42,19 +44,19 @@ namespace JiShe.CollectBus.ScheduledMeterReading public EnergySystemScheduledMeterReadingService( ILogger logger, + IDataChannelManageService dataChannelManage, + IRedisDataCacheService redisDataCacheService, IIoTDbProvider dbProvider, - IOptions kafkaOptions, - IOptions applicationOptions, - IoTDBRuntimeContext runtimeContext, - IProducerService producerService, IProtocolService protocolService, - IRedisDataCacheService redisDataCacheService) + IOptions dataMigrationOptions, + IOptions kafkaOptions, + IOptions applicationOptions) : base(logger, - producerService, + dataChannelManage, redisDataCacheService, dbProvider, - runtimeContext, protocolService, + dataMigrationOptions, kafkaOptions, applicationOptions) { @@ -181,7 +183,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading /// 电表自动阀控 /// /// - public override async Task AmmeterScheduledAutoValveControl() + public override async Task> AmmeterScheduledAutoValveControl() { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm}"; @@ -194,13 +196,12 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (settingInfos == null || settingInfos.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 电表自动阀控时,阀控数据为空, -101"); - return; + return null; } //批量获取对应的缓存电表信息 var ammeterInfos = new List(); List taskList = new List(); - var metadata = await _dbProvider.GetMetadata(); foreach (var settingInfo in settingInfos) { @@ -259,7 +260,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (protocolPlugin == null) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有找到对应的协议组件,-105"); - return; + return null; } ProtocolBuildResponse builderResponse = await protocolPlugin.BuildAsync(new ProtocolBuildRequest() @@ -290,22 +291,10 @@ namespace JiShe.CollectBus.ScheduledMeterReading if (taskList == null || taskList.Count <= 0) { _logger.LogError($"{nameof(AmmeterScheduledAutoValveControl)} 定时阀控运行时间{currentTime}没有自动阀控任务生成,-106"); - return; + return null; } - //任务记录入库 - await _dbProvider.BatchInsertAsync(metadata, taskList); - - //任务信息推送Kafka - _ = DeviceGroupBalanceControl.ProcessWithThrottleAsync( - items: taskList, - deviceIdSelector: data => data.DeviceId, - processor: (data, groupIndex) => - { - _ = KafkaProducerIssuedMessageAction(ProtocolConst.AmmeterSubscriberWorkerAutoValveControlIssuedEventName, data, groupIndex); - } - ); - + return taskList; //todo 阀控记录入库,推送到新的服务 } catch (Exception) diff --git a/shared/JiShe.CollectBus.Common/DeviceBalanceControl/DeviceGroupBalanceControl.cs b/shared/JiShe.CollectBus.Common/DeviceBalanceControl/DeviceGroupBalanceControl.cs index 1734f69..4149afd 100644 --- a/shared/JiShe.CollectBus.Common/DeviceBalanceControl/DeviceGroupBalanceControl.cs +++ b/shared/JiShe.CollectBus.Common/DeviceBalanceControl/DeviceGroupBalanceControl.cs @@ -193,7 +193,7 @@ namespace JiShe.CollectBus.Common.DeviceBalanceControl int? maxConcurrency = null) { var cache = _currentCache ?? throw new InvalidOperationException("缓存未初始化"); - var timer = Stopwatch.StartNew(); + //var timer = Stopwatch.StartNew(); // 自动计算最佳并发度 int recommendedThreads = CalculateOptimalThreadCount(); @@ -227,8 +227,8 @@ namespace JiShe.CollectBus.Common.DeviceBalanceControl }); await Task.WhenAll(tasks); - timer.Stop(); - Console.WriteLine($"任务处理完成,耗时:{timer.ElapsedMilliseconds}ms"); + //timer.Stop(); + //Console.WriteLine($"任务处理完成,耗时:{timer.ElapsedMilliseconds}ms"); } /// diff --git a/web/JiShe.CollectBus.Host/Pages/Monitor.cshtml b/web/JiShe.CollectBus.Host/Pages/Monitor.cshtml index 8328847..30e91e8 100644 --- a/web/JiShe.CollectBus.Host/Pages/Monitor.cshtml +++ b/web/JiShe.CollectBus.Host/Pages/Monitor.cshtml @@ -5,7 +5,7 @@ @{ Layout = null; -} +}