diff --git a/src/SJZY.Track.Api/Program.cs b/src/SJZY.Track.Api/Program.cs
index ecfd4dff..8d7f64af 100644
--- a/src/SJZY.Track.Api/Program.cs
+++ b/src/SJZY.Track.Api/Program.cs
@@ -2,21 +2,10 @@ using SJZY.Expand.ABP.Core.Configuration;
using SJZY.Expand.ABP.Core.Configuration.AutoRegistOptions;
using SJZY.Expand.ABP.Core.Logger;
using SJZY.Track.Api;
-using SJZY.Track.Application;
try
{
var builder = WebApplication.CreateBuilder(args);
- if (args.Length > 0)
- {
- _BUGOptions.EnablePref = "on".Equals(args[0]);
- Console.WriteLine($"是否启动优化模式:{_BUGOptions.EnablePref}");
- if (_BUGOptions.EnablePref)
- {
- var loadSuccess = Confluent.Kafka.Library.Load(null);
- Console.WriteLine($"加载{loadSuccess},版本号:{Confluent.Kafka.Library.VersionString}");
- }
- }
builder
.AddConfigurationContainer()
.AddOptionsFromConfiguration()
diff --git a/src/SJZY.Track.Api/SJZY.Track.Api.csproj b/src/SJZY.Track.Api/SJZY.Track.Api.csproj
index be47c0cf..ff97789d 100644
--- a/src/SJZY.Track.Api/SJZY.Track.Api.csproj
+++ b/src/SJZY.Track.Api/SJZY.Track.Api.csproj
@@ -1,6 +1,6 @@
-
+
net7.0
@@ -10,17 +10,18 @@
-
-
-
-
-
+
+
+
+
+
-
-
+
+
+
+
+
-
-
diff --git a/src/SJZY.Track.Api/kafkalib/librdkafka++.so.1 b/src/SJZY.Track.Api/kafkalib/librdkafka++.so.1
new file mode 100644
index 00000000..999f69c9
Binary files /dev/null and b/src/SJZY.Track.Api/kafkalib/librdkafka++.so.1 differ
diff --git a/src/SJZY.Track.Api/kafkalib/librdkafka.so.1 b/src/SJZY.Track.Api/kafkalib/librdkafka.so.1
new file mode 100644
index 00000000..f9fc0367
Binary files /dev/null and b/src/SJZY.Track.Api/kafkalib/librdkafka.so.1 differ
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs
index 804ad6d5..22e5fd37 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeEto.cs
@@ -135,6 +135,11 @@ public class TrackChangeEto
///
public DateTime? EstimatedDeliveryDate { get; set; }
+ ///
+ /// 目的地时区
+ ///
+ public float? DestinationTimeZone { get; set; }
+
///
/// 扩展信息字段,用与轨迹推送的附加字段
///
diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
index e8268247..23c2141f 100644
--- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
+++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj
@@ -5,7 +5,7 @@
net7.0
True
- 7.0.20
+ 7.0.22
True
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
index 33d65d4f..79e6998d 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs
@@ -6,7 +6,6 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Application.Kafka;
-using SJZY.Track.Application.Services.Warning.Handlers;
using SJZY.Track.Application.Services.Warning.Signals;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
@@ -25,8 +24,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
private readonly IProvideQueries _provideQueries;
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly IBroadcastingService _broadcastingService;
- // private readonly WarningSignalPublisher _warningSignalPublisher;
- private readonly IServiceProvider _serviceProvider;
+ private readonly WarningSignalPublisher _warningSignalPublisher;
public TrackDeleteEventHandler(
IProvideQueries provideQueries,
@@ -35,8 +33,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
ITrackDetailsEsRepository trackDetailsEsRepository,
IOrderOperationRecordEsRepository orderOperationRecordEsRepository,
IBroadcastingService broadcastingService,
- IServiceProvider serviceProvider
- //WarningSignalPublisher warningSignalPublisher
+ WarningSignalPublisher warningSignalPublisher
)
{
_provideQueries = provideQueries;
@@ -45,8 +42,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
_trackDetailsEsRepository = trackDetailsEsRepository;
_orderOperationRecordEsRepository = orderOperationRecordEsRepository;
_broadcastingService = broadcastingService;
- _serviceProvider = serviceProvider;
- //_warningSignalPublisher = warningSignalPublisher;
+ _warningSignalPublisher = warningSignalPublisher;
}
[CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)]
@@ -327,6 +323,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
_broadcastingService.TrackChangePublicTopic(new TrackChangeEto
{
EstimatedDeliveryDate = track.EstimatedDeliveryDate,
+ DestinationTimeZone = track.DestinationTimeZone,
TrackPlacePostcode = track.TrackPlacePostcode,
TrackPlaceNation = track.TrackPlaceNation,
TrackPlaceNationId = track.TrackPlaceNationId,
@@ -354,7 +351,7 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
OrderNo = track.OrderNo,
OrderIdentifiers = new[]
{
- new OrderIdentifier()
+ new OrderIdentifier
{
OrderId = track.OrderId,
OrderNo = track.OrderNo,
@@ -368,43 +365,8 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe
}
}
-
private void WarningCalc_DeletedTrack(List delTracks)
{
- if (_BUGOptions.EnablePref)
- {
- var scope = _serviceProvider.CreateScope();
- var _warningSignalPublisher = scope.ServiceProvider.GetRequiredService();
- _warningSignalPublisher.PublishWarningSignal(WarningSignalType.轨迹删除, delTracks);
- scope.Dispose();
- return;
- }
-
- //_warningSignalPublisher.PublishWarningSignal(WarningSignalType.轨迹删除, delTracks);
- var signals = WarningSignal.FromTrack(delTracks, WarningSignalType.轨迹删除);
-
- _ = Task.Run(async () =>
- {
- var scope = _serviceProvider.CreateAsyncScope();
- try
- {
- var handler = scope.ServiceProvider.GetRequiredService();
- var handler2 = scope.ServiceProvider.GetRequiredService();
- var handler3 = scope.ServiceProvider.GetRequiredService();
-
- await Task.Delay(1500); //确保落盘
- await handler.TrackDeletedHandleAsync(signals);
- await handler2.TrackDeletedHandleAsync(signals);
- await handler3.TrackUpdatedOrDeletedHandleAsync(signals);
- }
- catch (Exception ex)
- {
- LogHelper.Error(ex);
- }
- finally
- {
- await scope.DisposeAsync();
- }
- });
+ _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹删除, delTracks);
}
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
index 628c4d17..c6de6489 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackPushEventHandler.cs
@@ -463,7 +463,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (string.IsNullOrWhiteSpace(compareFields))
return trackIdentifies.Contains($"{code}{timeStr}");
- var extra = x.GetValueOrDefault("extra");
+ var extra = x.GetValueOrDefault("extra");
if (extra == null) return false;
if (((JsonElement) extra).TryGetProperty(compareFields, out var comparerValueJsonElement))
@@ -538,15 +538,22 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
if (config.DateTimeFormatType == (int) DateTimeFormatEnum.Timestamp)
return DateTimeHelper.ConvertToUnixTimestamp(dateTime).ToString();
- if (config.DateTimeFormatType == (int) DateTimeFormatEnum.DateTimeAndTimezone
- && !string.IsNullOrEmpty(config.DateTimeFormat)
- && !string.IsNullOrEmpty(config.TimezoneFormat))
+ if (config.DateTimeFormatType == (int) DateTimeFormatEnum.DateTimeAndTimezone)
{
- var zoneStr = DateTimeHelper.TimezoneFormat(timezone, config.TimezoneFormat);
- var datetimeStr = DateTimeHelper.FormatDateTime(dateTime, config.DateTimeFormat);
- return $"{datetimeStr} {zoneStr}";
+ // 只有时间
+ if (!string.IsNullOrWhiteSpace(config.DateTimeFormat) && string.IsNullOrWhiteSpace(config.TimezoneFormat))
+ return DateTimeHelper.FormatDateTime(dateTime, config.DateTimeFormat);
+
+ // 时间和时区
+ if (!string.IsNullOrWhiteSpace(config.DateTimeFormat) && !string.IsNullOrWhiteSpace(config.TimezoneFormat))
+ {
+ var zoneStr = DateTimeHelper.TimezoneFormat(timezone, config.TimezoneFormat);
+ var datetimeStr = DateTimeHelper.FormatDateTime(dateTime, config.DateTimeFormat);
+ return $"{datetimeStr} {zoneStr}";
+ }
}
+ // 默认为 时间+时区
return dateTime.ToString("yyyy-MM-ddTHH:mm:ss.fffK");
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
index 65070319..61cd543b 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
@@ -6,7 +6,6 @@ using SJZY.OTel;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Application.Kafka;
-using SJZY.Track.Application.Services.Warning.Handlers;
using SJZY.Track.Application.Services.Warning.Signals;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
@@ -26,11 +25,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
private readonly ITrackDetailsEsRepository _trackDetailsEsRepository;
private readonly IBroadcastingService _broadcastingService;
private readonly ILogger _logger;
-
private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository;
-
- //private readonly WarningSignalPublisher _warningSignalPublisher;
- private readonly IServiceProvider _serviceProvider;
+ private readonly WarningSignalPublisher _warningSignalPublisher;
public TrackUpsertEventHandler(
IOrderRepository orderRepository,
@@ -40,8 +36,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
IOrderOperationRecordEsRepository orderOperationRecordEsRepository,
IBroadcastingService broadcastingService,
ILogger logger,
- IServiceProvider serviceProvider
- //WarningSignalPublisher warningSignalPublisher
+ WarningSignalPublisher warningSignalPublisher
)
{
_orderRepository = orderRepository;
@@ -51,8 +46,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
_orderOperationRecordEsRepository = orderOperationRecordEsRepository;
_broadcastingService = broadcastingService;
_logger = logger;
- _serviceProvider = serviceProvider;
- //_warningSignalPublisher = warningSignalPublisher;
+ _warningSignalPublisher = warningSignalPublisher;
}
[CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)]
@@ -102,11 +96,10 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
// 不同子系统需要做内容映射
if (@event.SubSystemId != nextEvent.SubSystemId)
{
- var mapCode = (await _provideQueries
- .MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCode))
+ var mapCode = (await _provideQueries.MapTrackCodesAsync(@event.SubSystemId, nextEvent.SubSystemId, @event.TrackCode))
.FirstOrDefault();
- if (mapCode == default)
+ if (mapCode == null)
{
// 跨子系统没做映射的轨迹不处理
continue;
@@ -518,75 +511,12 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
private void WarningCalc_AddedTrack(List tracks)
{
- if (_BUGOptions.EnablePref)
- {
- var scope = _serviceProvider.CreateScope();
- var _warningSignalPublisher = scope.ServiceProvider.GetRequiredService();
- _warningSignalPublisher.PublishWarningSignal(WarningSignalType.轨迹新增, tracks);
- scope.Dispose();
- return;
- }
-
- //_warningSignalPublisher.PublishWarningSignal(WarningSignalType.轨迹新增, tracks);
- var signals = WarningSignal.FromTrack(tracks, WarningSignalType.轨迹新增);
- _ = Task.Run(async () =>
- {
- var scope = _serviceProvider.CreateAsyncScope();
- try
- {
- var handler = scope.ServiceProvider.GetRequiredService();
- var handler2 = scope.ServiceProvider.GetRequiredService();
-
- await Task.Delay(1500); //确保落盘
- await handler.TrackAddedHandleAsync(signals);
- await handler2.TrackAddedOrUpdatedHandleAsync(signals);
- }
- catch (Exception ex)
- {
- LogHelper.Error(ex);
- }
- finally
- {
- await scope.DisposeAsync();
- }
- });
+ _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹新增, tracks);
}
private void WarningCalc_UpdatedTrack(List tracks)
{
- if (_BUGOptions.EnablePref)
- {
- var scope = _serviceProvider.CreateScope();
- var _warningSignalPublisher = scope.ServiceProvider.GetRequiredService();
- _warningSignalPublisher.PublishWarningSignal(WarningSignalType.轨迹更新, tracks);
- scope.Dispose();
- return;
- }
-
- //_warningSignalPublisher.PublishWarningSignal(WarningSignalType.轨迹更新, tracks);
- var signals = WarningSignal.FromTrack(tracks, WarningSignalType.轨迹更新);
-
- _ = Task.Run(async () =>
- {
- var scope = _serviceProvider.CreateAsyncScope();
- try
- {
- var handler = scope.ServiceProvider.GetRequiredService();
- var handler2 = scope.ServiceProvider.GetRequiredService();
-
- await Task.Delay(1500); //确保落盘
- await handler.TrackAddedOrUpdatedHandleAsync(signals);
- await handler2.TrackUpdatedOrDeletedHandleAsync(signals);
- }
- catch (Exception ex)
- {
- LogHelper.Error(ex);
- }
- finally
- {
- await scope.DisposeAsync();
- }
- });
+ _warningSignalPublisher.PublishSignal(WarningSignalType.轨迹更新, tracks);
}
}
diff --git a/src/SJZY.Track.Application/Hangfire/NotifyConfig.cs b/src/SJZY.Track.Application/Hangfire/NotifyConfig.cs
deleted file mode 100644
index 861be32b..00000000
--- a/src/SJZY.Track.Application/Hangfire/NotifyConfig.cs
+++ /dev/null
@@ -1,63 +0,0 @@
-namespace SJZY.Track.Application.Hangfire;
-
-// 发送消息接口参数
-// https://centerapi.test.shijizhongyun.com/userApi/index.html?urls.primaryName=%E6%B6%88%E6%81%AF%E8%AE%A2%E9%98%85%E5%AE%9E%E4%BE%8B
-/// MsgSubscribeInstance/SendMessageByTemplate
-public class NotifyConfig
-{
- private const string ContentKey = "content"; //内容参数
-
- public bool IsNeedToHandle { get; set; } = true; //是否需要处理(默认为未处理,传false为无需处理,针对站内信是否处理功能)
- public int MsgSource { get; set; } = 1; // 消息来源:1.消息 2.任务 3.流程 4.消息提醒
- public int SystemId { get; set; } = 9498; //子系统id 业务中台
- public string TemplateCode { get; set; } = "TrackWarningNotify"; //模板code
- public List Channels { get; set; } //1:站内信 2.飞书 4.邮箱 8.短信 16.语音播报
- public List Variables { get; set; } //模板参数
- public List Receivers { get; set; }
-
- public sealed record Variable(string Key, string Value);
-
- public sealed record Receiver(
- int ReceiverId, //接收人id : 内部用户Id,外部用户Id,或只有邮箱跟短信时不需要接收人Id
- int RecipientType = 1, //接收人类型 (1:内部用户 2.外部用户)
- string? ReceiverName = null, //接收人姓名
- string? Mail = null, //邮箱
- string? MobilePhone = null //手机号
- );
-
- public static NotifyConfig CreateConfig(int userId, string message, List notifyModes)
- {
- return new NotifyConfig
- {
- Channels = notifyModes,
- Receivers = new List(1)
- {
- new Receiver(userId)
- },
- Variables = new List(1)
- {
- new Variable(ContentKey, message)
- }
- };
- }
-
- public static NotifyConfig CreateConfig(int userId, string message)
- {
- return new NotifyConfig
- {
- Channels = new List(2)
- {
- 1,
- 2
- },
- Receivers = new List
- {
- new Receiver(userId)
- },
- Variables = new List
- {
- new Variable(ContentKey, message)
- }
- };
- }
-}
diff --git a/src/SJZY.Track.Application/Hangfire/WarningNotifyAggregator.cs b/src/SJZY.Track.Application/Hangfire/WarningNotifyAggregator.cs
index ca1d81c3..c49df4aa 100644
--- a/src/SJZY.Track.Application/Hangfire/WarningNotifyAggregator.cs
+++ b/src/SJZY.Track.Application/Hangfire/WarningNotifyAggregator.cs
@@ -1,6 +1,5 @@
using Microsoft.Extensions.Options;
using SJZY.Track.Application.Contract.Dtos.Warning;
-using SJZY.Track.Application.Helpers;
using SJZY.Track.Application.Options;
using SJZY.Track.Application.Services.Warning.Model;
using SJZY.Track.Domain.Aggregates.KPIAreaAggregate;
@@ -43,7 +42,7 @@ public sealed class WarningNotifyAggregator : ITransientDependency
// 2.以人的维度聚合通知信息,并生成配置参数NotifyConfig
// 3.构建并调度一个调用通知接口的立即执行任务
// 4.绑定这个任务id(可能是多个)和jobId用户跟踪任务状态
- public async Task<(List NotifyConfigs, HashSet taskIds)> ScanNotifyAndAggregateAsync()
+ public async Task<(List NotifyConfigs, HashSet taskIds)> ScanNotifyAndAggregateAsync()
{
// 构建查询游标 todo:全量查询需要优化,直接存缓存?
// var options = _optionsMonitor.CurrentValue;
@@ -210,7 +209,7 @@ public sealed class WarningNotifyAggregator : ITransientDependency
// 2.检查明细中为人工介入的状态
var detailsIdSet = filtered.Select(x => x.WarningDetailsId).ToHashSet();
- var warningDetails = await _warningDetailsEsRepository.GetReturnWarningDetailsAsync(new GetReturnWarningDetailsVO()
+ var warningDetails = await _warningDetailsEsRepository.GetReturnWarningDetailsAsync(new GetReturnWarningDetailsVO
{
DetailsIds = detailsIdSet,
Status = new HashSet(1)
@@ -261,10 +260,9 @@ public sealed class WarningNotifyAggregator : ITransientDependency
return result;
}
- private List BuildNotifyConfigs(List needNotifyTasks)
+ private List BuildNotifyConfigs(List needNotifyTasks)
{
- var systemId = _optionsMonitor.CurrentValue.MiddleSystemId;
- var result = new List();
+ var result = new List();
if (needNotifyTasks.Count == 0) return result;
// 1.以人的维度对不同类别的预警通知分组聚合
@@ -293,109 +291,51 @@ public sealed class WarningNotifyAggregator : ITransientDependency
}
}
- // 2.使用消息模板构建通知消息,并发送通知
+ // 2.使用消息模板构建通知参数,稍后排队发送通知
foreach (var (userId, typeNotifyTaskDict) in userIdNotifyTaskDict)
{
- var notifyMessage = BuildNotifyMessage(typeNotifyTaskDict);
//聚合时出现 用户a
//接收回传预警,命中规则1,通知方式(飞书,站内信) ,命中规则2,通知方式(飞书)
//接收运输预警,命中规则1,通知方式(飞书,站内信) ,命中规则2,通知方式(飞书)
//接收完整预警,命中规则1,通知方式(飞书) ,命中规则2,通知方式(飞书,站内信)
//此时聚合后,消息为:总共6条预警消息,其中回传xx条,运输xx条,完整xx条
//同时使用飞书和站内信两种方式通知
- var config = NotifyConfig.CreateConfig(userId, notifyMessage, new List
- {
- 1,
- 2
- });
- config.SystemId = systemId;
- result.Add(config);
+ result.Add(BuildNotifyParam(userId, typeNotifyTaskDict));
}
return result;
}
- private string BuildNotifyMessage(Dictionary> typeNotifyTaskDict)
+ private WarningNotifyParam BuildNotifyParam(int userId, Dictionary> typeNotifyTaskDict)
{
var options = _optionsMonitor.CurrentValue;
var hours = options.ScanWarningNotifyTaskHourInterval;
- var transportCount = 0;
- var transportLastNHoursCount = 0;
- var returnCount = 0;
- var returnLastNHoursCount = 0;
- var completeCount = 0;
- var completeLastNHoursCount = 0;
- Func hoursNBefore = x => DateTime.Now - x.CreateTime <= TimeSpan.FromHours(hours);
+ var param = new WarningNotifyParam
+ {
+ UserId = userId,
+ Hours = hours
+ };
+ // tips:获取过去x小时的增量
+ Func hoursNBefore = x => DateTime.Now - x.CreateTime <= TimeSpan.FromHours(hours);
if (typeNotifyTaskDict.TryGetValue(WarningRuleType.运输时效预警.GetHashCode(), out var transportTimelinessNotifyTasks))
{
- transportLastNHoursCount = transportTimelinessNotifyTasks.Count(hoursNBefore);
- transportCount = transportTimelinessNotifyTasks.Count;
+ param.TransportLastNHoursCount = transportTimelinessNotifyTasks.Count(hoursNBefore);
+ param.TransportCount = transportTimelinessNotifyTasks.Count;
}
if (typeNotifyTaskDict.TryGetValue(WarningRuleType.回传时效预警.GetHashCode(), out var returnTimelinessNotifyTasks))
{
- returnLastNHoursCount = returnTimelinessNotifyTasks.Count(hoursNBefore);
- returnCount = returnTimelinessNotifyTasks.Count;
+ param.ReturnLastNHoursCount = returnTimelinessNotifyTasks.Count(hoursNBefore);
+ param.ReturnCount = returnTimelinessNotifyTasks.Count;
}
if (typeNotifyTaskDict.TryGetValue(WarningRuleType.完整预警.GetHashCode(), out var completeWarningNotifyTasks))
{
- completeLastNHoursCount = completeWarningNotifyTasks.Count(hoursNBefore);
- completeCount = completeWarningNotifyTasks.Count;
+ param.CompleteLastNHoursCount = completeWarningNotifyTasks.Count(hoursNBefore);
+ param.CompleteCount = completeWarningNotifyTasks.Count;
}
- return NotifyMessageBuilder.Build(
- hours,
- transportCount,
- transportLastNHoursCount,
- returnCount,
- returnLastNHoursCount,
- completeCount,
- completeLastNHoursCount
- );
- }
-}
-
-// 标题:预警通知
-// 内容:尊敬的用户,截止到2024-12-13 10:00:01(UTC +8:00),轨迹中心监测到与您相关的预警风险信息共计299 条,请及时处理,详情如下:
-// 运输时效预警共计100条,其中过去4小时内新增的预警10条,查看详情
-// 回传时效预警共计99条,其中过去4小时内新增的预警10条,查看详情
-// 轨迹完整预警共计100条,其中过去4小时内新增的预警10条,查看详情
-public static class NotifyMessageBuilder
-{
- public const string Title = "预警通知";
-
- public static string Build(int hours,
- int transportCount, int transportLastNHoursCount,
- int returnCount, int returnLastNHoursCount,
- int completeCount, int completeLastNHoursCount)
- {
- var dateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
- var totalCount = transportCount + returnCount + completeCount;
- // todo:无法使用a标签填充(可能是为了安全考虑),需要具体给定一个样式
- var url1 = "";
- var url2 = "";
- var url3 = "";
-
- var message = $"{Title}\n尊敬的用户,截止到{dateTime}({BuildLocalTimezoneStr()}),轨迹中心监测到与您相关的预警风险信息共计{totalCount} 条,请及时处理,详情如下:";
-
- if (transportCount > 0)
- message += $"\n运输时效预警共计{transportCount}条,其中过去{hours}小时内新增的预警{transportLastNHoursCount}条";
- if (returnCount > 0)
- message += $"\n回传时效预警共计{returnCount}条,其中过去{hours}小时内新增的预警{returnLastNHoursCount}条";
- if (completeCount > 0)
- message += $"\n轨迹完整预警共计{completeCount}条,其中过去{hours}小时内新增的预警{completeLastNHoursCount}条";
-
- return message;
- }
-
- // 构建本地时区字符串标识 e.g UTC +8:00
- private static string BuildLocalTimezoneStr()
- {
- var offset = TimeZoneInfo.Local.BaseUtcOffset;
- var flag = offset.Hours > 0 ? "+" : "";
- var offsetStr = offset.ToString().RemovePostFix(":00");
- return $"UTC {flag}{offsetStr}";
+ return param;
}
}
diff --git a/src/SJZY.Track.Application/Hangfire/WarningNotifyBuilder.cs b/src/SJZY.Track.Application/Hangfire/WarningNotifyBuilder.cs
new file mode 100644
index 00000000..997d3533
--- /dev/null
+++ b/src/SJZY.Track.Application/Hangfire/WarningNotifyBuilder.cs
@@ -0,0 +1,122 @@
+using FeishuNetSdk;
+using FeishuNetSdk.Im;
+using FeishuNetSdk.Im.Dtos;
+using SJZY.UserCenter.SharedModel.Dtos.Message;
+using SJZY.UserCenter.SharedModel.Enums;
+
+namespace SJZY.Track.Application.Hangfire;
+
+// 标题:预警通知
+// 内容:尊敬的用户,截止到2024-12-13 10:00:01(UTC +8:00),轨迹中心监测到与您相关的预警风险信息共计299 条,请及时处理,详情如下:
+// 运输时效预警共计100条,其中过去4小时内新增的预警10条,查看详情
+// 回传时效预警共计99条,其中过去4小时内新增的预警10条,查看详情
+// 轨迹完整预警共计100条,其中过去4小时内新增的预警10条,查看详情
+public static class WarningNotifyBuilder
+{
+ private const string Title = "预警通知";
+
+ // 构建站内信发消息请求体
+ public static SendMessageByTemplateInput BuildZhanNeiXinMessage(WarningNotifyParam param, int systemId)
+ {
+ const string templateCode = "TrackWarningNotify"; // 模板code
+ const string contentKey = "content"; //内容参数
+ var dateTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
+ var totalCount = param.TransportCount + param.ReturnCount + param.CompleteCount;
+
+ // todo:无法使用a标签填充(可能是为了安全考虑),需要具体给定一个样式
+ var url1 = "";
+ var url2 = "";
+ var url3 = "";
+
+ var content = $"{Title}\n尊敬的用户,截止到{dateTime}({BuildLocalTimezoneStr()}),轨迹中心监测到与您相关的预警风险信息共计{totalCount} 条,请及时处理,详情如下:";
+
+ if (param.TransportCount > 0)
+ content += $"\n运输时效预警共计{param.TransportCount}条,其中过去{param.Hours}小时内新增的预警{param.TransportLastNHoursCount}条";
+ if (param.ReturnCount > 0)
+ content += $"\n回传时效预警共计{param.ReturnCount}条,其中过去{param.Hours}小时内新增的预警{param.ReturnLastNHoursCount}条";
+ if (param.CompleteCount > 0)
+ content += $"\n轨迹完整预警共计{param.CompleteCount}条,其中过去{param.Hours}小时内新增的预警{param.CompleteLastNHoursCount}条";
+
+ // 构建用户中心发消息请求体对象
+ var dto = new SendMessageByTemplateInput
+ {
+ IsNeedToHandle = true,
+ MsgSource = MsgSourceEnum.消息,
+ SystemId = systemId,
+ templateCode = templateCode,
+ channels = new List(1)
+ {
+ ChannelEnum.站内信
+ },
+ variables = new List(1)
+ {
+ new VariableDto
+ {
+ Key = contentKey,
+ Value = content
+ }
+ },
+ receivers = new List(1)
+ {
+ new MsgInstanceReceiverInput
+ {
+ RecipientType = 1, //接收人类型 (1:内部用户 2.外部用户)
+ ReceiverId = param.UserId, //接收人id
+ ReceiverName = null, //接收人名称
+ Mail = null, // 邮箱
+ MobilePhone = null, // 手机号
+ }
+ },
+ };
+
+ return dto;
+ }
+
+ // 构建飞书卡片发消息请求体
+ public static PostImV1MessagesBodyDto BuildFeiShuCard(WarningNotifyParam param, string fsUserId)
+ {
+ var totalCount = param.TransportCount + param.ReturnCount + param.CompleteCount;
+ var body = new List