diff --git a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs index 48186952..49e79b04 100644 --- a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs +++ b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs @@ -5,8 +5,4 @@ public struct OrderIdentifier public int OrderId { get; set; } public string OrderNo { get; set; } public int OrderType { get; set; } - - public int CustomId { get; set; } - - public bool IsTrigger { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs index 526febd8..8ef46e77 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -2,6 +2,16 @@ public class TrackChangeAfterUpdateOrderEvent { + /// + /// 子系统id + /// + public int SubSystemId { get; set; } + + /// + /// 客户id + /// + public int CustomId { get; set; } + /// /// 订单Id /// diff --git a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs index 905060ea..621a441c 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackUpsertEvent.cs @@ -3,9 +3,14 @@ public class TrackUpsertEvent { /// - /// 子系统id(操作的订单都是相同子系统下的) + /// 子系统id /// public int SubSystemId { get; set; } + + /// + /// 客户id + /// + public int CustomId { get; set; } /// /// 订单id diff --git a/src/SJZY.Track.Application.Contract/Services/IForewarningCacheService.cs b/src/SJZY.Track.Application.Contract/Services/IForewarningCacheService.cs index ce6550f1..8ee8c321 100644 --- a/src/SJZY.Track.Application.Contract/Services/IForewarningCacheService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IForewarningCacheService.cs @@ -4,5 +4,19 @@ namespace SJZY.Track.Application.Contract.Services; public interface IForewarningCacheService { - Task> GetRulesAsync(int subSystemId); + /// + /// 获取预警规则,如果没有则返回null + /// + /// 子系统id + /// 客户id + /// + Task?> GetRulesAsync(int subSystemId, int customerId); + + /// + /// 删除规则 + /// + /// + /// + /// + Task DeleteRulesAsync(int subSystemId, int customerId); } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/INotifyService.cs b/src/SJZY.Track.Application.Contract/Services/INotifyService.cs deleted file mode 100644 index 54b8a368..00000000 --- a/src/SJZY.Track.Application.Contract/Services/INotifyService.cs +++ /dev/null @@ -1,6 +0,0 @@ -namespace SJZY.Track.Application.Contract.Services; - -public interface INotifyService -{ - void SendNotification(string body); -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs index 0b657f6c..52f1d535 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -67,7 +67,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa }); // 预警计算 - var warningOrders = orders.Select(order => MapWarningOrderDto(order, @event.TrackStatusId)).ToList(); + var warningOrders = orders.Select(order => MapWarningOrderDto(order, @event)).ToList(); _forewarningNotifyService.WarningCalculateAsync(warningOrders); } @@ -77,8 +77,6 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa return new OrderEntity { Id = order.Id, - SubSystemId = order.SubSystemId, - CustomId = order.CustomId, // 轨迹 IsCompleted = order.IsCompleted, @@ -101,14 +99,14 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa }; } - private WarningOrderDto MapWarningOrderDto(OrderEntity order, int trackStatusId) + private WarningOrderDto MapWarningOrderDto(OrderEntity order, TrackChangeAfterUpdateOrderEvent @event) { return new WarningOrderDto { Id = order.Id, - TrackStatusId = trackStatusId, - SubSystemId = order.SubSystemId, - CustomerId = order.CustomId, + TrackStatusId = @event.TrackStatusId, + SubSystemId = @event.SubSystemId, + CustomerId = @event.CustomId, CargoType = order.CargoType, Month = order.CreateTime.Month, diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs index 26380b66..8afe8e0c 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackRefreshEventHandler.cs @@ -235,7 +235,6 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe OrderId = context.OrderId, OrderNo = context.OrderNo, OrderType = context.OrderType, - CustomId = context.CustomId } }, TrackRefreshData = new TrackRefreshStruct diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index cee1dc82..41808e11 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -58,6 +58,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var nextEvent = @event.DeepCopy(); nextEvent.Visited.AddRange(orderIds); nextEvent.SubSystemId = group.Key.SubSystemId; + nextEvent.CustomId = group.Key.CustomId; nextEvent.TrackRefreshData = new TrackRefreshStruct { ServiceProviderName = @event.TrackRefreshData.ServiceProviderName, @@ -88,7 +89,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe OrderId = x.OrderId, OrderNo = x.OrderNo, OrderType = x.OrderType, - CustomId = x.CustomId }).ToList(); var idx = 0; while (idx < identifiers.Count) @@ -181,6 +181,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe if(!providerDic.TryGetValue(order.OrderId,out var provider)) continue; + // todo:不要在upsert事件计算order的状态 var config = await _trackPullCacheService.GetPullParamWithContentConfigAsync(provider.SubSystemId, provider.ServiceProviderId); @@ -199,6 +200,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent { + SubSystemId = @event.SubSystemId, + CustomId = @event.CustomId, OrderIds = canNextOrderIds.ToArray(), IsCompleted = @event.TrackRefreshData.IsCompleted, TrackContent = content.TrackContent, @@ -211,28 +214,23 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe }); // 触发轨迹推送事件(异步) - foreach (var group in @event.OrderIdentifiers - .Where(x => x.OrderId.IsIn(canNextOrderIds)) - .GroupBy(x => x.CustomId)) + var trackPushEvent = new TrackPushEvent { - var trackPushEvent = new TrackPushEvent + OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改, + SubSystemId = @event.SubSystemId, + CustomId = @event.CustomId, + OrderIds = canNextOrderIds.ToArray(), + TrackCode = @event.TrackCode, + SystemPushInfo = new SystemPushStruct { - OptionType = @event.IsAdd ? OptionType.新增 : OptionType.修改, - SubSystemId = @event.SubSystemId, - CustomId = group.Key, - OrderIds = group.Select(x => x.OrderId).ToArray(), - TrackCode = @event.TrackCode, - SystemPushInfo = new SystemPushStruct - { - TrackStatus = content.TrackStatus, - TrackContent = content.TrackContent, - TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone - } - }; - await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); - } + TrackStatus = content.TrackStatus, + TrackContent = content.TrackContent, + TrackPlace = @event.TrackPlace, + TrackTime = @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone + } + }; + await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); } /// diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningCacheService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningCacheService.cs index 289f3bbf..fdd4463c 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningCacheService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningCacheService.cs @@ -6,8 +6,29 @@ namespace SJZY.Track.Application.Services.ForewarningServices; public class ForewarningCacheService: IForewarningCacheService, ISingletonDependency { - public Task> GetRulesAsync(int subSystemId) + private Dictionary> _rules = new(); + string AreaKey(int subSystemId) => $"TrackArea:{subSystemId}"; + string WarningKey(int subSystemId, int customerId) => $"TrackWarning:{subSystemId}:{customerId}"; + + // 30w => 1w => local + public async Task?> GetRulesAsync(int subSystemId, int customerId) { - throw new NotImplementedException(); + var rules = _rules.GetValueOrDefault(WarningKey(subSystemId, customerId)); + + if (rules == null) + { + // todo: 写入缓存 set str + await Task.Delay(1); + } + + return rules; + } + + // a b c del local cusomer 3 del redis cache pub del redis cache + public Task DeleteRulesAsync(int subSystemId, int customerId) + { + _rules.Remove(WarningKey(subSystemId, customerId)); + + return Task.CompletedTask; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs index f4b2c418..f438a9cd 100644 --- a/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs +++ b/src/SJZY.Track.Application/Services/ForewarningServices/ForewarningNotifyService.cs @@ -1,10 +1,8 @@ using FreeRedis; using SJZY.Expand.ABP.Core; using SJZY.Track.Application.Contract.Services; -using SJZY.Track.Domain.Aggregates.ForewarningAggregate; using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Dtos.Forewarning; -using SJZY.Track.Domain.Enums; using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Services.ForewarningServices; @@ -14,16 +12,12 @@ namespace SJZY.Track.Application.Services.ForewarningServices; /// public class ForewarningNotifyService : IForewarningNotifyService, ITransientDependency { - IReadOnlyDictionary> _ruleGroupDict; - IReadOnlyDictionary> _factorDict; - private IReadOnlyDictionary _rules; - readonly INotifyService _notifyService; + private readonly ForewarningCacheService _cacheService; - public ForewarningNotifyService(INotifyService notifyService) + public ForewarningNotifyService(ForewarningCacheService cacheService) { - _notifyService = notifyService; + _cacheService = cacheService; } - /// /// 创建预警通知 /// @@ -31,7 +25,7 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep /// 创建的通知总量,0表示没有规则 public async Task WarningCalculateAsync(List order) { - throw new NotImplementedException(); + var rules = await _cacheService.GetRulesAsync(order[0].SubSystemId, order[0].CustomerId); } public Task DeleteForewarningNotify(WarningOrderDto order) @@ -50,21 +44,9 @@ public class ForewarningNotifyService : IForewarningNotifyService, ITransientDep var notifyValues = notifyMembers.Select(val => new RuleNotifyValue(val)); foreach (var notifyValue in notifyValues) { - if (!_rules.TryGetValue(notifyValue.RuleId, out var rule)) - continue; - - //todo 发送通知 - _notifyService.SendNotification(""); } } - public void ClearCache() - { - _ruleGroupDict = null; - _factorDict = null; - _rules = null; - } - private List DeleteNotifyValue(ForewarningRuleItem ruleItem, int orderId) { var members = new List(); diff --git a/src/SJZY.Track.Application/Services/Notifies/NotifyService.cs b/src/SJZY.Track.Application/Services/Notifies/NotifyService.cs deleted file mode 100644 index 9365fbc9..00000000 --- a/src/SJZY.Track.Application/Services/Notifies/NotifyService.cs +++ /dev/null @@ -1,12 +0,0 @@ -using SJZY.Track.Application.Contract.Services; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.Services.Notifies; - -public class NotifyService:INotifyService, ITransientDependency -{ - public void SendNotification(string body) - { - throw new NotImplementedException(); - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs index e9554da2..1e6cb204 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.Link.cs @@ -101,7 +101,6 @@ public partial class OrderService OrderId = x.Id, OrderNo = x.OrderNo, OrderType = x.OrderType, - CustomId = x.CustomId }).ToArray(), TrackCode = track.TrackCode, TrackPlace = track.TrackPlace, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index f3d63ca2..3d76bd98 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -73,7 +73,6 @@ public partial class TrackService : ApplicationService, ITrackService OrderId = order.Id, OrderNo = order.OrderNo, OrderType = order.OrderType, - CustomId = order.CustomId } }; @event.OperationMan = name; @@ -111,18 +110,19 @@ public partial class TrackService : ApplicationService, ITrackService var name = userInfo.Data.UserName; - foreach (var group in orders.GroupBy(x => x.SubSystemId)) + foreach (var group in orders.GroupBy(x => new { x.SubSystemId, x.CustomId })) { // 新增/更新轨迹 var @event = new TrackUpsertEvent { - SubSystemId = group.Key, + SubSystemId = group.Key.SubSystemId, + CustomId = group.Key.CustomId, + OrderIdentifiers = group.Select(order => new OrderIdentifier { OrderId = order.Id, OrderNo = order.OrderNo, OrderType = input.OrderType, - CustomId = order.CustomId }).ToArray(), IsAdd = input.IsAdd, TrackCode = input.TrackCode, diff --git a/src/SJZY.Track.Domain/Consts/GlobalConst.Redis.cs b/src/SJZY.Track.Domain/Consts/GlobalConst.Redis.cs index 6f49c80d..376af72f 100644 --- a/src/SJZY.Track.Domain/Consts/GlobalConst.Redis.cs +++ b/src/SJZY.Track.Domain/Consts/GlobalConst.Redis.cs @@ -22,10 +22,6 @@ public partial class GlobalConst /// public const string TrackPullContentKeyPrefix = "TrackPullContent"; - /// - /// 规则因素缓存redis key前缀 - /// - public const string RuleFactorKeyPrefix = "RuleFactor"; /// /// 预警通知redis key前缀