From e0e376404eac8483072e2cf7afba776a46123da7 Mon Sep 17 00:00:00 2001
From: xiaolipro <2357729423@qq.com>
Date: Sun, 15 Sep 2024 17:13:48 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Dtos/Forewarning/WarningDto.cs | 13 ++
.../TrackChangeAfterUpdateOrderEvent.cs | 20 ---
.../Events/TrackWarningCalcEvent.cs | 29 ++++
...TrackChangeAfterUpdateOrderEventHandler.cs | 47 +----
.../EventHandlers/TrackUpsertEventHandler.cs | 113 ++++++++-----
.../TrackWarningCalcEventHandler.cs | 75 ++++++++
.../ForewarningNotifyService.cs | 160 ++++++++++++------
.../ITrackDetailsEsRepository.cs | 2 +
.../Consts/GlobalConst.MQ.cs | 2 +-
.../Repositories/TrackDetailsEsRepository.cs | 51 ++++++
.../Repositories/WarningRecordEsRepository.cs | 2 +-
11 files changed, 348 insertions(+), 166 deletions(-)
create mode 100644 src/SJZY.Track.Application.Contract/Events/TrackWarningCalcEvent.cs
create mode 100644 src/SJZY.Track.Application/CAP/EventHandlers/TrackWarningCalcEventHandler.cs
diff --git a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningDto.cs b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningDto.cs
index 9ef9894b..b7249b2a 100644
--- a/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningDto.cs
+++ b/src/SJZY.Track.Application.Contract/Dtos/Forewarning/WarningDto.cs
@@ -7,9 +7,22 @@ public class WarningDto
///
public int TrackStatusId { get; set; }
+ ///
+ /// 子系统id
+ ///
public int SubSystemId { get; set; }
+ ///
+ /// 客户id
+ ///
public int CustomerId { get; set; }
public List Orders { get; set; } = new();
+
+
+ public override string ToString()
+ {
+ return $"子系统:{SubSystemId},客户:{CustomerId},订单:{Orders.Select(x => x.Id)
+ .JoinAsString(",")},发生轨迹状态{TrackStatusId}";
+ }
}
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs
index 0fa89c4b..037c5a8c 100644
--- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs
+++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs
@@ -2,16 +2,6 @@ namespace SJZY.Track.Application.Contract.Events;
public class TrackChangeAfterUpdateOrderEvent
{
- ///
- /// 子系统id
- ///
- public int SubSystemId { get; set; }
-
- ///
- /// 客户id
- ///
- public int CustomId { get; set; }
-
///
/// 订单Id
///
@@ -32,11 +22,6 @@ public class TrackChangeAfterUpdateOrderEvent
///
public string TrackEnContent { get; set; } = null!;
- ///
- /// 轨迹状态Id
- ///
- public int TrackStatusId { get; set; }
-
///
/// 轨迹发生地
///
@@ -52,11 +37,6 @@ public class TrackChangeAfterUpdateOrderEvent
///
public float TrackTimeZone { get; set; }
- ///
- /// 轨迹内容代码
- ///
- public string? TrackCode { get; set; }
-
///
/// 时区缺失和发生地缺失标记,1表示时区,2表示发生地,3表示两种
///
diff --git a/src/SJZY.Track.Application.Contract/Events/TrackWarningCalcEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackWarningCalcEvent.cs
new file mode 100644
index 00000000..3808ab2e
--- /dev/null
+++ b/src/SJZY.Track.Application.Contract/Events/TrackWarningCalcEvent.cs
@@ -0,0 +1,29 @@
+namespace SJZY.Track.Application.Contract.Events;
+
+public class TrackWarningCalcEvent
+{
+ ///
+ /// 子系统id
+ ///
+ public int SubSystemId { get; set; }
+
+ ///
+ /// 客户id
+ ///
+ public int CustomId { get; set; }
+
+ ///
+ /// 轨迹状态Id
+ ///
+ public int TrackStatusId { get; set; }
+
+ ///
+ /// 订单id
+ ///
+ public int[] OrderIds { get; set; } = null!;
+
+ ///
+ /// 轨迹发生时间
+ ///
+ public DateTime TrackTime { get; set; }
+}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
index 4b5d6cd9..153e9700 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs
@@ -1,8 +1,6 @@
using DotNetCore.CAP;
using SJZY.Expand.ABP.Core.Logger;
-using SJZY.Track.Application.Contract.Dtos.Forewarning;
using SJZY.Track.Application.Contract.Events;
-using SJZY.Track.Application.Contract.Services;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using Volo.Abp.DependencyInjection;
@@ -10,14 +8,11 @@ namespace SJZY.Track.Application.CAP.EventHandlers;
public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICapSubscribe
{
- private readonly IForewarningNotifyService _forewarningNotifyService;
private readonly IOrderRepository _orderRepository;
- public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository,
- IForewarningNotifyService forewarningNotifyService)
+ public TrackChangeAfterUpdateOrderEventHandler(IOrderRepository orderRepository)
{
_orderRepository = orderRepository;
- _forewarningNotifyService = forewarningNotifyService;
}
[CapSubscribe(GlobalConst.TrackChangeAfterUpdateOrderSubscribe)]
@@ -27,7 +22,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
if (orders.Count == 0)
{
- LogHelper.Warn("没有找到订单信息,无法更新轨迹信息");
+ LogHelper.Warn($"没有找到订单信息:{@event.OrderIds.JoinAsString(",")},无法更新轨迹信息");
return;
}
@@ -74,9 +69,6 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
x.LatestTrackTimeZone,
x.DeficiencyTag
});
-
- // 预警计算
- await _forewarningNotifyService.WarningCalculateAsync(BuiltWarningDto(orders, @event));
}
private async Task> GetOrdersAsync(int[] orderIds)
@@ -92,41 +84,6 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa
LatestTrackPlace = order.LatestTrackPlace,
LatestTrackTime = order.LatestTrackTime,
LatestTrackTimeZone = order.LatestTrackTimeZone,
-
- // 因素
- CargoType = order.CargoType,
- CreateTime = order.CreateTime,
- ArrivalCountry = order.ArrivalCountry,
- ArrivalProvince = order.ArrivalProvince,
- ArrivalCity = order.ArrivalCity,
- ArrivalPostCode = order.ArrivalPostCode,
- IsTransit = order.IsTransit,
- LeavePort = order.LeavePort,
- ProductCode = order.ProductCode,
});
}
-
- private WarningDto BuiltWarningDto(List orders, TrackChangeAfterUpdateOrderEvent @event)
- {
- return new WarningDto
- {
- TrackStatusId = @event.TrackStatusId,
- SubSystemId = @event.SubSystemId,
- CustomerId = @event.CustomId,
- Orders = orders.Select(order => new WarningOrderDto
- {
- Id = order.Id,
- TrackTime = @event.TrackTime,
- CargoType = order.CargoType,
- Month = order.CreateTime.Month,
- IsTransit = order.IsTransit,
- LeavePort = order.LeavePort,
- ProductCode = order.ProductCode,
- ArrivalCountry = order.ArrivalCountry,
- ArrivalProvince = order.ArrivalProvince,
- ArrivalCity = order.ArrivalCity,
- ArrivalPostCode = order.ArrivalPostCode,
- }).ToList()
- };
- }
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
index b8e6225a..5f666525 100644
--- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs
@@ -4,6 +4,7 @@ using SJZY.Expand.ABP.Core.PublicMethords;
using SJZY.Track.Application.Contract.Events;
using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
+using SJZY.Track.Domain.Dtos.TrackContents;
using SJZY.Track.Domain.Queries;
using Volo.Abp.DependencyInjection;
using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier;
@@ -135,12 +136,74 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
return;
}
+ var insertTracks = await UpsertTrackAsync(@event, canNextOrderIds, trackContent);
+
+ if (canNextOrderIds.Count == 0) return;
+
+ if (insertTracks.Any())
+ {
+ // 批量add to es
+ await _trackDetailsEsRepository.AddManyAsync(insertTracks);
+
+ // 添加轨迹触发订单拉取状态更新
+ await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(),
+ @event.TrackCode);
+
+ // 添加轨迹触发预警计算(异步)
+ await _capPublisher.PublishAsync(GlobalConst.TrackWarningCalcSubscribe, new TrackWarningCalcEvent
+ {
+ SubSystemId = @event.SubSystemId,
+ CustomId = @event.CustomId,
+ OrderIds = canNextOrderIds.ToArray(),
+ TrackStatusId = trackContent.TrackStatusId,
+ TrackTime = @event.TrackTime,
+ });
+ }
+
+ // 触发订单主表更新事件(异步)
+ await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
+ new TrackChangeAfterUpdateOrderEvent
+ {
+ OrderIds = canNextOrderIds.ToArray(),
+ IsCompleted = trackContent.IsCompleted,
+ TrackContent = trackContent.TrackContent,
+ TrackEnContent = trackContent.TrackEnContent,
+ TrackPlace = @event.TrackPlace,
+ TrackTime = @event.TrackTime,
+ TrackTimeZone = @event.TrackTimeZone,
+ DeficiencyTagValue = @event.DeficiencyTagValue
+ });
+
+ // 触发轨迹推送事件(异步)
+ var trackPushEvent = new TrackPushEvent
+ {
+ OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改,
+ SubSystemId = @event.SubSystemId,
+ CustomId = @event.CustomId,
+ OrderIds = canNextOrderIds.ToArray(),
+ TrackCode = @event.TrackCode,
+ SystemPushInfo = new SystemPushStruct
+ {
+ TrackStatus = trackContent.TrackStatus,
+ TrackContent = trackContent.TrackContent,
+ TrackPlace = @event.TrackPlace,
+ TrackTime = @event.TrackTime,
+ TrackTimeZone = @event.TrackTimeZone
+ }
+ };
+ await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent);
+ }
+
+ private async Task> UpsertTrackAsync(TrackUpsertEvent @event, List canNextOrderIds,
+ TrackContentVO trackContent)
+ {
var orderIds = @event.OrderIdentifiers.Select(x => x.OrderId).ToArray();
// important:轨迹code相同,时间、发生地不同的,可能存在多条!!
var tracks = await _trackDetailsEsRepository.GetListAsync(orderIds, @event.TrackCode, true);
var insertTracks = new List();
+ var updateTracks = new List();
foreach (var order in @event.OrderIdentifiers)
{
@@ -204,59 +267,17 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
track.UpdateUser = @event.OperationMan ?? GlobalConst.SystemUser;
track.UpdateTime = DateTime.Now;
- await _trackDetailsEsRepository.UpdateAsync(track);
+ updateTracks.Add(track);
}
canNextOrderIds.Add(order.OrderId);
}
- if (canNextOrderIds.Count == 0) return;
-
- if (insertTracks.Any())
+ if (updateTracks.Any())
{
- // 批量add to es
- await _trackDetailsEsRepository.AddManyAsync(insertTracks);
-
- // add track触发订单拉取状态更新
- await _orderRepository.UpdatePullStatusToSilenceAsync(insertTracks.Select(x => x.OrderId).ToList(),
- @event.TrackCode);
+ await _trackDetailsEsRepository.UpdateManyAsync(updateTracks);
}
- // 触发订单主表更新事件(异步)
- await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
- new TrackChangeAfterUpdateOrderEvent
- {
- SubSystemId = @event.SubSystemId,
- CustomId = @event.CustomId,
- OrderIds = canNextOrderIds.ToArray(),
- IsCompleted = trackContent.IsCompleted,
- TrackContent = trackContent.TrackContent,
- TrackEnContent = trackContent.TrackEnContent,
- TrackStatusId = trackContent.TrackStatusId,
- TrackPlace = @event.TrackPlace,
- TrackTime = @event.TrackTime,
- TrackTimeZone = @event.TrackTimeZone,
- TrackCode = @event.TrackCode,
- DeficiencyTagValue = @event.DeficiencyTagValue
- });
-
- // 触发轨迹推送事件(异步)
- var trackPushEvent = new TrackPushEvent
- {
- OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改,
- SubSystemId = @event.SubSystemId,
- CustomId = @event.CustomId,
- OrderIds = canNextOrderIds.ToArray(),
- TrackCode = @event.TrackCode,
- SystemPushInfo = new SystemPushStruct
- {
- TrackStatus = trackContent.TrackStatus,
- TrackContent = trackContent.TrackContent,
- TrackPlace = @event.TrackPlace,
- TrackTime = @event.TrackTime,
- TrackTimeZone = @event.TrackTimeZone
- }
- };
- await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent);
+ return insertTracks;
}
}
diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackWarningCalcEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackWarningCalcEventHandler.cs
new file mode 100644
index 00000000..acefee10
--- /dev/null
+++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackWarningCalcEventHandler.cs
@@ -0,0 +1,75 @@
+using DotNetCore.CAP;
+using SJZY.Expand.ABP.Core.Logger;
+using SJZY.Track.Application.Contract.Dtos.Forewarning;
+using SJZY.Track.Application.Contract.Events;
+using SJZY.Track.Application.Contract.Services;
+using SJZY.Track.Domain.Aggregates.OrderAggregate;
+using Volo.Abp.DependencyInjection;
+
+namespace SJZY.Track.Application.CAP.EventHandlers;
+
+public class TrackWarningCalcEventHandler : ITransientDependency, ICapSubscribe
+{
+ private readonly IForewarningNotifyService _forewarningNotifyService;
+ private readonly IOrderRepository _orderRepository;
+
+ public TrackWarningCalcEventHandler(IOrderRepository orderRepository,
+ IForewarningNotifyService forewarningNotifyService)
+ {
+ _orderRepository = orderRepository;
+ _forewarningNotifyService = forewarningNotifyService;
+ }
+
+ [CapSubscribe(GlobalConst.TrackWarningCalcSubscribe)]
+ public async Task ConsumerAsync(TrackWarningCalcEvent @event)
+ {
+ var orders = await _orderRepository.GetListAsync(order => @event.OrderIds.Contains(order.Id), order =>
+ new OrderEntity
+ {
+ Id = order.Id,
+ // 因素
+ CargoType = order.CargoType,
+ CreateTime = order.CreateTime,
+ ArrivalCountry = order.ArrivalCountry,
+ ArrivalProvince = order.ArrivalProvince,
+ ArrivalCity = order.ArrivalCity,
+ ArrivalPostCode = order.ArrivalPostCode,
+ IsTransit = order.IsTransit,
+ LeavePort = order.LeavePort,
+ ProductCode = order.ProductCode,
+ });
+
+ if (orders.Count == 0)
+ {
+ LogHelper.Warn($"没有找到订单信息:{@event.OrderIds.JoinAsString(",")},无法做轨迹预警计算");
+ return;
+ }
+
+ // 预警计算
+ await _forewarningNotifyService.WarningCalculateAsync(BuiltWarningDto(orders, @event));
+ }
+
+ private WarningDto BuiltWarningDto(List orders, TrackWarningCalcEvent @event)
+ {
+ return new WarningDto
+ {
+ TrackStatusId = @event.TrackStatusId,
+ SubSystemId = @event.SubSystemId,
+ CustomerId = @event.CustomId,
+ Orders = orders.Select(order => new WarningOrderDto
+ {
+ Id = order.Id,
+ TrackTime = @event.TrackTime,
+ CargoType = order.CargoType,
+ Month = order.CreateTime.Month,
+ IsTransit = order.IsTransit,
+ LeavePort = order.LeavePort,
+ ProductCode = order.ProductCode,
+ ArrivalCountry = order.ArrivalCountry,
+ ArrivalProvince = order.ArrivalProvince,
+ ArrivalCity = order.ArrivalCity,
+ ArrivalPostCode = order.ArrivalPostCode,
+ }).ToList()
+ };
+ }
+}
diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs
index 2859eda9..20764451 100644
--- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs
+++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs
@@ -89,25 +89,28 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
}
var redisKey = GetForewarningNotifySetKeyRedisKey(dto.SubSystemId);
+ long addCounter, delCounter = 0;
var tran = RedisHelper.Client.Multi();
- // 左区间加入预警队列
- await tran.ZAddAsync(redisKey, adds.Select(x =>
+ // 左区间加入预警队列,【只有第一次发生的才会被加入】
+ addCounter = await tran.ZAddNxAsync(redisKey, adds.Select(x =>
{
var entry = new WarningNotifyCacheEntry(x.ruleId, x.orderId, x.counter);
return new ZMember(entry.ToString(), x.ts);
}).ToArray());
- // 右区间移出预警队列
+ // 右区间移出预警队列,【只要发生了就移除】
var right = dels.Select(x => new WarningNotifyCacheEntry(x.ruleId, x.orderId, x.counter)).ToList();
if (!right.IsNullOrEmpty())
{
- await tran.ZRemAsync(redisKey, right.Select(x => x.ToString()).ToArray());
+ delCounter = await tran.ZRemAsync(redisKey, right.Select(x => x.ToString()).ToArray());
}
tran.Exec();
+ LogHelper.Info($"本次共计产生{addCounter}条预警,移除{delCounter}条预警,触发缘由是");
+
await _warningRecordEsRepository.BulkUpdateAsync(dels); // 标记处理完成
}
@@ -127,21 +130,21 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
var ruleIds = entries.Select(x => x.RuleId).Distinct().ToList();
var notifyRules = await _warningQueries.GetWarningNotifyRulesAsync(ruleIds);
- var userRules = new Dictionary>();
- foreach (var rule in notifyRules)
- {
- foreach (var userId in rule.NotifyUserIds)
- {
- if (!userRules.ContainsKey(userId))
- {
- userRules[userId] = new List();
- }
-
- userRules[userId].Add(rule);
- }
- }
-
// 写入es预警记录
+ var warningRecords = await WriteWarningRecordAsync(entries, notifyRules);
+
+ // 发通知
+ await SendCoreAsync(entries, notifyRules);
+
+ // 移除已处理的预警
+ await RedisHelper.Client.ZRemRangeByScoreAsync(redisKey, 0, timestamp);
+
+ return warningRecords.Count;
+ }
+
+ private async Task> WriteWarningRecordAsync(List entries,
+ List notifyRules)
+ {
var warningRecords = new List();
foreach (var entry in entries)
{
@@ -163,9 +166,25 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
}
await _warningRecordEsRepository.BulkInsertAsync(warningRecords);
+ return warningRecords;
+ }
+ private Task SendCoreAsync(List entries, List notifyRules)
+ {
+ var userRules = new Dictionary>();
+ foreach (var rule in notifyRules)
+ {
+ foreach (var userId in rule.NotifyUserIds)
+ {
+ if (!userRules.ContainsKey(userId))
+ {
+ userRules[userId] = new List();
+ }
+
+ userRules[userId].Add(rule);
+ }
+ }
- // 发通知
foreach (var userRule in userRules)
{
var siteInternalContent = BuildNotifyContent(userRule.Value, entries, NotifyMode.SiteInternal);
@@ -173,48 +192,62 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
if (!string.IsNullOrEmpty(siteInternalContent))
{
- // todo:发送站内通知
- _ = _requestSendMessageService.Service.SendMessageByEmptyTemplateAsync(
- new SendMessageByEmptyTemplateInput
+ _ = Task.Run(async () =>
+ {
+ // todo:发送站内通知
+ var res = await _requestSendMessageService.Service.SendMessageByEmptyTemplateAsync(
+ new SendMessageByEmptyTemplateInput
+ {
+ IsNeedToHandle = null,
+ BizId = null,
+ MsgSource = null,
+ SystemId = 0,
+ TemplateCode = null,
+ Channels = null,
+ MsgTitle = null,
+ MsgContent = null,
+ PcURl = null,
+ MobileURl = null,
+ FileUrl = null,
+ fileName = null,
+ receivers = null,
+ SiteLetterComponentStyle = (ComponentStyle) 0
+ });
+
+ if (res.Code != GlobalConst.SuccessCode)
{
- IsNeedToHandle = null,
- BizId = null,
- MsgSource = null,
- SystemId = 0,
- TemplateCode = null,
- Channels = null,
- MsgTitle = null,
- MsgContent = null,
- PcURl = null,
- MobileURl = null,
- FileUrl = null,
- fileName = null,
- receivers = null,
- SiteLetterComponentStyle = (ComponentStyle) 0
- });
+ LogHelper.Error($"发送站内通知失败,用户:{userRule.Key},内容:{siteInternalContent}");
+ }
+ });
}
if (!string.IsNullOrEmpty(feiShuContent))
{
- // 发送飞书通知
- _ = _messageClient.SendMessageAsync(new SendMessageInput
+ _ = Task.Run(async () =>
{
- AppId = null,
- AppSecret = null,
- ReceiveIdType = IdTypeEnums.user_id,
- MsgType = MsgTypeEnums.文本,
- ReceiveIds = new List
+ // 发送飞书通知
+ var res = await _messageClient.SendMessageAsync(new SendMessageInput
{
- userRule.Key.ToString()
- },
- Content = feiShuContent
+ AppId = null,
+ AppSecret = null,
+ ReceiveIdType = IdTypeEnums.user_id,
+ MsgType = MsgTypeEnums.文本,
+ ReceiveIds = new List
+ {
+ userRule.Key.ToString()
+ },
+ Content = feiShuContent
+ });
+
+ if (res.Code != GlobalConst.SuccessCode)
+ {
+ LogHelper.Error($"发送飞书通知失败,用户:{userRule.Key},内容:{feiShuContent}");
+ }
});
}
}
- await RedisHelper.Client.ZRemRangeByScoreAsync(redisKey, 0, timestamp);
-
- return warningRecords.Count;
+ return Task.CompletedTask;
}
private string GetForewarningNotifySetKeyRedisKey(int subSystemId) =>
@@ -259,6 +292,7 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
var res = new List();
foreach (var rule in rules)
{
+ // 规则至少有一个因素,如果订单任一因素不符合则不命中
if (rule.IsTransit != null)
{
if (order.IsTransit != rule.IsTransit) continue;
@@ -287,7 +321,8 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
if (!rule.Areas.IsNullOrEmpty())
{
var inArea = false;
- foreach (var area in rule.Areas!.Where(area => order.ArrivalCountry == area.Country))
+ var areas = rule.Areas!.Where(area => order.ArrivalCountry == area.Country).ToList();
+ foreach (var area in areas)
{
if (!area.LeftPostcode.IsNullOrEmpty() && !area.RightPostcode.IsNullOrEmpty())
{
@@ -296,12 +331,31 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep
string.CompareOrdinal(order.ArrivalPostCode, area.RightPostcode) > 0) continue;
}
- if (!area.City.IsNullOrEmpty() && order.ArrivalCity != area.City) continue;
- if (!area.Province.IsNullOrEmpty() && order.ArrivalProvince != area.Province) continue;
inArea = true;
break;
}
+ if (!inArea)
+ {
+ foreach (var area in areas)
+ {
+ if (!area.City.IsNullOrEmpty() && order.ArrivalCity != area.City) continue;
+ inArea = true;
+ break;
+ }
+ }
+
+ if (!inArea)
+ {
+ foreach (var area in areas)
+ {
+ if (!area.Province.IsNullOrEmpty() && order.ArrivalProvince != area.Province) continue;
+ inArea = true;
+ break;
+ }
+ }
+
+
if (!inArea) continue;
}
diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
index e7ba4c60..37e3d1d2 100644
--- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
+++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs
@@ -14,6 +14,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService indexes, int maxRetries = 3);
+
Task AddManyAsync(List index);
Task AddAsync(TrackDetailsIndex track);
diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs
index 29103d0d..d517bfc8 100644
--- a/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs
+++ b/src/SJZY.Track.Domain/Consts/GlobalConst.MQ.cs
@@ -50,5 +50,5 @@ public partial class GlobalConst
///
/// 预警计算任务
///
- public const string TrackWarningCalc = "SJZY.Track.TrackWarningCalc";
+ public const string TrackWarningCalcSubscribe = "SJZY.Track.TrackWarningCalc";
}
diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
index 6cf163ff..62070eea 100644
--- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs
@@ -154,6 +154,57 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract indexes, int maxRetries = 3)
+ {
+ var retryCount = 0;
+ var updateSuccessful = false;
+ var track = indexes.First();
+
+ while (retryCount < maxRetries && !updateSuccessful)
+ {
+ var response = await Context.UpdateByQueryAsync(u => u
+ .Index(GlobalConst.TrackDetailsIndex)
+ .Query(q => q
+ .Ids(t => t.Values(indexes.Select(x => x.Id)))
+ )
+ .Script(s => s
+ .Source(@"
+ ctx._source.TrackPlace = params.trackPlace;
+ ctx._source.TrackTime = params.trackTime;
+ ctx._source.TrackTimeZone = params.trackTimeZone;
+ ctx._source.UpdateUser = params.updateUser;
+ ctx._source.UpdateTime = params.updateTime;
+ ")
+ .Params(p => p
+ .Add("trackPlace", track.TrackPlace)
+ .Add("trackTime", track.TrackTime)
+ .Add("trackTimeZone", track.TrackTimeZone)
+ .Add("updateUser", track.UpdateUser)
+ .Add("updateTime", DateTime.Now)
+ )
+ )
+ );
+
+ if (response.IsValid)
+ {
+ updateSuccessful = true;
+ }
+ else if (response.ServerError?.Status == 409) // 409 表示版本冲突
+ {
+ retryCount++;
+ if (retryCount >= maxRetries)
+ {
+ throw new InvalidOperationException(
+ $"轨迹更新冲突达到最大次数,track:{indexes.Count}条,原因:{response.DebugInformation}。");
+ }
+ }
+ else
+ {
+ throw new InvalidOperationException($"轨迹更新失败,track:{indexes.Count}条,原因:{response.DebugInformation}。");
+ }
+ }
+ }
+
public async Task AddManyAsync(List tracks)
{
// 按天写入es
diff --git a/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs b/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs
index 0bc3d029..a3ffd54e 100644
--- a/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs
+++ b/src/SJZY.Track.Repository/Repositories/WarningRecordEsRepository.cs
@@ -49,7 +49,7 @@ public class WarningRecordEsRepository : ElasticSearchContextAbstract(u => u
- .Index($"{GlobalConst.TrackWarningRecordIndex}-*")
+ .Index(GlobalConst.TrackWarningRecordIndex)
.Query(q =>
q.Term(f => f.RuleId, rule.ruleId)
&& q.Term(f => f.OrderId, rule.orderId)