From 4ce1741f7e26def24d7391ac467aba603888d392 Mon Sep 17 00:00:00 2001 From: ChenYi <296215406@outlook.com> Date: Tue, 20 May 2025 21:55:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BasicScheduledMeterReadingService.cs | 236 +++++++++--------- .../Extensions/DateTimeExtensions.cs | 74 ++++++ .../Helpers/CommonHelper.cs | 52 +--- 3 files changed, 198 insertions(+), 164 deletions(-) diff --git a/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs b/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs index a4bee34..38166c7 100644 --- a/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs +++ b/services/JiShe.CollectBus.Application/ScheduledMeterReading/BasicScheduledMeterReadingService.cs @@ -137,115 +137,99 @@ namespace JiShe.CollectBus.ScheduledMeterReading //电表定时广播校时,一天一次。 string currentTimeStr = $"{currentTime:HH:mm:00}"; - //if (string.Equals(currentTimeStr, _applicationOptions.AutomaticVerificationTime, StringComparison.CurrentCultureIgnoreCase))//自动校时 - //{ - // //_logger.LogInformation($"{nameof(AmmeterScheduledAutomaticVerificationTime)} 电表自动校时,非自动校时时间"); - // //return; + if (string.Equals(currentTimeStr, _applicationOptions.AutomaticVerificationTime, StringComparison.CurrentCultureIgnoreCase))//自动校时 + { + //_logger.LogInformation($"{nameof(AmmeterScheduledAutomaticVerificationTime)} 电表自动校时,非自动校时时间"); + //return; - // _ = CreateMeterPublishTask( - // timeDensity: timeDensity, - // nextTaskTime: currentTime, - // meterType: MeterTypeEnum.Ammeter, - // taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); - // }); - //} - //else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase))//集中器版本号读取 - //{ - // _ = CreateMeterPublishTask( - // timeDensity: timeDensity, - // nextTaskTime: currentTime, - // meterType: MeterTypeEnum.Ammeter, - // taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); - // }); - //} - //else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//SIM卡读取 - //{ - // _ = CreateMeterPublishTask( - // timeDensity: timeDensity, - // nextTaskTime: currentTime, - // meterType: MeterTypeEnum.Ammeter, - // taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => - // { - // var tempTask = await ConcentratorScheduledAutomaticGetTelematicsModule(timeDensity, data, groupIndex, timestamps); - // if (tempTask == null || tempTask.Count <= 0) - // { - // _logger.LogWarning($"集中器SIM卡读取 {data.Name} 任务数据构建失败:{data.Serialize()}"); - // return; - // } - // _ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); - // }); - //} - //else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//月冻结 - //{ - // _ = CreateMeterPublishTask( - // timeDensity: timeDensity, - // nextTaskTime: currentTime, - // meterType: MeterTypeEnum.Ammeter, - // taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); - // }); - //} - //else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticDayFreezeTime, StringComparison.CurrentCultureIgnoreCase))//日冻结 - //{ - // _ = CreateMeterPublishTask( - // timeDensity: timeDensity, - // nextTaskTime: currentTime, - // meterType: MeterTypeEnum.Ammeter, - // taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); - // }); - //} - //else - //{ - // _logger.LogInformation($"{nameof(CreateToBeIssueTasks)} 不是自动校时、采集终端信息等时间,继续处理其他"); - //} - - - _ = CreateMeterPublishTask( - timeDensity: timeDensity, - nextTaskTime: currentTime, - meterType: MeterTypeEnum.Ammeter, - taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => - { - var tempTask = await ConcentratorScheduledAutomaticGetTelematicsModule(timeDensity, data, groupIndex, timestamps); - if (tempTask == null || tempTask.Count <= 0) + _ = CreateMeterPublishTask( + timeDensity: timeDensity, + nextTaskTime: currentTime, + meterType: MeterTypeEnum.Ammeter, + taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => { - _logger.LogWarning($"集中器SIM卡读取 {data.Name} 任务数据构建失败:{data.Serialize()}"); - return; - } - _ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); - }); + var tempTask = await AmmeterScheduledAutomaticVerificationTime(timeDensity, data, groupIndex, timestamps); + + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"电表自动校时 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); + }); + } + else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTerminalVersionTime, StringComparison.CurrentCultureIgnoreCase))//集中器版本号读取 + { + _ = CreateMeterPublishTask( + timeDensity: timeDensity, + nextTaskTime: currentTime, + meterType: MeterTypeEnum.Ammeter, + taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); + }); + } + else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticTelematicsModuleTime, StringComparison.CurrentCultureIgnoreCase))//SIM卡读取 + { + _ = CreateMeterPublishTask( + timeDensity: timeDensity, + nextTaskTime: currentTime, + meterType: MeterTypeEnum.Ammeter, + taskCreateAction: async (timeDensity, data, groupIndex, timestamps) => + { + var tempTask = await ConcentratorScheduledAutomaticGetTelematicsModule(timeDensity, data, groupIndex, timestamps); + if (tempTask == null || tempTask.Count <= 0) + { + _logger.LogWarning($"集中器SIM卡读取 {data.Name} 任务数据构建失败:{data.Serialize()}"); + return; + } + _ = _dataChannelManage.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); + }); + } + else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticMonthFreezeTime, StringComparison.CurrentCultureIgnoreCase))//月冻结 + { + _ = CreateMeterPublishTask( + timeDensity: timeDensity, + nextTaskTime: currentTime, + meterType: MeterTypeEnum.Ammeter, + taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); + }); + } + else if (string.Equals(currentTimeStr, _applicationOptions.AutomaticDayFreezeTime, StringComparison.CurrentCultureIgnoreCase))//日冻结 + { + _ = CreateMeterPublishTask( + timeDensity: timeDensity, + nextTaskTime: currentTime, + meterType: MeterTypeEnum.Ammeter, + taskCreateAction: async (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.ScheduledMeterTaskWriterAsync(DataChannelManage.TaskDataChannel.Writer, (ProtocolConst.AmmeterSubscriberWorkerOtherIssuedEventName, tempTask)); + }); + } + else + { + _logger.LogInformation($"{nameof(CreateToBeIssueTasks)} 不是自动校时、采集终端信息等时间,继续处理其他"); + } @@ -933,7 +917,13 @@ namespace JiShe.CollectBus.ScheduledMeterReading { FocusAddress = ammeterInfo.FocusAddress, Pn = ammeterInfo.MeteringCode, - ItemCode = item + ItemCode = item, + DataTimeMark = new Protocol.DataTimeMark() + { + Density = ammeterInfo.TimeDensity.GetFocusDensity(),//转换成协议的值 + Point = 1, + DataTime = currentTime.AddDays(-1),//日冻结抄读时间为昨天 + }, }); var meterReadingRecords = CreateAmmeterPacketInfo( @@ -978,12 +968,22 @@ namespace JiShe.CollectBus.ScheduledMeterReading { var currentTime = DateTime.Now; string currentTimeStr = $"{currentTime:HH:mm:00}"; - + try { - #if DEBUG #else + //需要检查是不是每月1号抄读上个月的数据 + if (currentTime.Date != currentTime.FirstDayOfMonth().Date) + { + _logger.LogInformation($"{nameof(AmmeterScheduledGetAutomaticMonthFreezeData)} 非月冻结数据抄读时间,暂不处理"); + return null; + } + else + { + timestamps = currentTime.LastDayOfPrdviousMonth(); + } + //判断是否是月冻结数据抄读 if (!string.Equals(currentTimeStr, _applicationOptions.AutomaticMonthFreezeTime, StringComparison.CurrentCultureIgnoreCase)) { @@ -1002,13 +1002,23 @@ namespace JiShe.CollectBus.ScheduledMeterReading return null; } - foreach (var item in DayFreezeCodes) + foreach (var item in MonthFreezeCodes) { ProtocolBuildResponse builderResponse = await protocolPlugin.BuildAsync(new ProtocolBuildRequest() { FocusAddress = ammeterInfo.FocusAddress, Pn = ammeterInfo.MeteringCode, - ItemCode = item + ItemCode = item, + DataTimeMark = new Protocol.DataTimeMark() + { + Density = ammeterInfo.TimeDensity.GetFocusDensity(),//转换成协议的值 + Point = 1, +#if DEBUG + DataTime = currentTime.AddMonths(-1),//月冻结抄读时间为上个月 +#else + DataTime = timestamps,//月冻结抄读时间为上个月 +#endif + }, }); var meterReadingRecords = CreateAmmeterPacketInfo( @@ -1108,7 +1118,7 @@ namespace JiShe.CollectBus.ScheduledMeterReading } } - #endregion +#endregion #region 水表采集处理 diff --git a/shared/JiShe.CollectBus.Common/Extensions/DateTimeExtensions.cs b/shared/JiShe.CollectBus.Common/Extensions/DateTimeExtensions.cs index 3254edc..2a7f037 100644 --- a/shared/JiShe.CollectBus.Common/Extensions/DateTimeExtensions.cs +++ b/shared/JiShe.CollectBus.Common/Extensions/DateTimeExtensions.cs @@ -265,5 +265,79 @@ namespace JiShe.CollectBus.Common.Extensions } return DateTime.TryParseExact(dateLong.ToString(), "yyyyMMdd HHmmssZZ", null, System.Globalization.DateTimeStyles.None, out DateTime date) ? date : throw new ArgumentException("Date must be between 10000101 and 99991231."); } + + + /// + /// 取得某月的第一天 + /// + /// 要取得月份第一天的时间 + /// + public static DateTime FirstDayOfMonth(this DateTime datetime) + { + return datetime.AddDays(1 - datetime.Day); + } + + /// + /// 取得某月的最后一天 + /// + /// 要取得月份最后一天的时间 + /// + public static DateTime LastDayOfMonth(this DateTime datetime) + { + return datetime.AddDays(1 - datetime.Day).AddMonths(1).AddDays(-1); + } + + /// + /// 取得上个月第一天 + /// + /// 要取得上个月第一天的当前时间 + /// + public static DateTime FirstDayOfPreviousMonth(this DateTime datetime) + { + return datetime.AddDays(1 - datetime.Day).AddMonths(-1); + } + + /// + /// 取得上个月的最后一天 + /// + /// 要取得上个月最后一天的当前时间 + /// + public static DateTime LastDayOfPrdviousMonth(this DateTime datetime) + { + return datetime.AddDays(1 - datetime.Day).AddDays(-1); + } + + + /// + /// 取得某月第一天0点以及最后一天的23:59:59时间范围 + /// + /// + /// + public static Tuple GetMonthDateRange(this DateTime datetime) + { + var lastDayOfMonthDate = LastDayOfMonth(datetime); + return new Tuple(datetime.FirstDayOfMonth(), new DateTime(lastDayOfMonthDate.Year, lastDayOfMonthDate.Month, lastDayOfMonthDate.Day, 23, 59, 59)); + } + + /// + /// 取得某一天0点到当月最后一天的23:59:59时间范围 + /// + /// + /// + public static Tuple GetCurrentDateToLastDayRange(this DateTime datetime) + { + var lastDayOfMonthDate = LastDayOfMonth(datetime); + return new Tuple(datetime.Date, new DateTime(lastDayOfMonthDate.Year, lastDayOfMonthDate.Month, lastDayOfMonthDate.Day, 23, 59, 59)); + } + + /// + /// 取得某一天0点到23:59:59时间范围 + /// + /// + /// + public static Tuple GetCurrentDateRange(this DateTime datetime) + { + return new Tuple(datetime.Date, new DateTime(datetime.Year, datetime.Month, datetime.Day, 23, 59, 59)); + } } } diff --git a/shared/JiShe.CollectBus.Common/Helpers/CommonHelper.cs b/shared/JiShe.CollectBus.Common/Helpers/CommonHelper.cs index e6cbafd..a7a65c6 100644 --- a/shared/JiShe.CollectBus.Common/Helpers/CommonHelper.cs +++ b/shared/JiShe.CollectBus.Common/Helpers/CommonHelper.cs @@ -136,57 +136,7 @@ namespace JiShe.CollectBus.Common.Helpers return objModel; } - /// - /// 取得某月的第一天 - /// - /// 要取得月份第一天的时间 - /// - public static DateTime FirstDayOfMonth(this DateTime datetime) - { - return datetime.AddDays(1 - datetime.Day); - } - - /// - /// 取得某月的最后一天 - /// - /// 要取得月份最后一天的时间 - /// - public static DateTime LastDayOfMonth(this DateTime datetime) - { - return datetime.AddDays(1 - datetime.Day).AddMonths(1).AddDays(-1); - } - - /// - /// 取得某月第一天0点以及最后一天的23:59:59时间范围 - /// - /// - /// - public static Tuple GetMonthDateRange(this DateTime datetime) - { - var lastDayOfMonthDate = LastDayOfMonth(datetime); - return new Tuple(datetime.FirstDayOfMonth(), new DateTime(lastDayOfMonthDate.Year, lastDayOfMonthDate.Month, lastDayOfMonthDate.Day, 23, 59, 59)); - } - - /// - /// 取得某一天0点到当月最后一天的23:59:59时间范围 - /// - /// - /// - public static Tuple GetCurrentDateToLastDayRange(this DateTime datetime) - { - var lastDayOfMonthDate = LastDayOfMonth(datetime); - return new Tuple(datetime.Date, new DateTime(lastDayOfMonthDate.Year, lastDayOfMonthDate.Month, lastDayOfMonthDate.Day, 23, 59, 59)); - } - - /// - /// 取得某一天0点到23:59:59时间范围 - /// - /// - /// - public static Tuple GetCurrentDateRange(this DateTime datetime) - { - return new Tuple(datetime.Date, new DateTime(datetime.Year, datetime.Month, datetime.Day, 23, 59, 59)); - } + /// /// 获取指定枚举的所有 Attribute 说明以及value组成的键值对