From 9494ca2cb79111b6e47498aec7f885fa4425c05d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E5=96=9C=E6=97=BA?= Date: Fri, 26 Jul 2024 21:04:19 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=20=E8=BD=A8=E8=BF=B9=E6=98=A0=E5=B0=84?= =?UTF-8?q?-=E6=96=B0=E5=A2=9E=E6=8B=89=E5=8F=96=E7=95=8C=E9=9D=A2?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AD=97=E6=AE=B5=EF=BC=9A=E8=A7=A6=E5=8F=91?= =?UTF-8?q?=E6=8B=89=E5=8F=96=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dtos/TrackPull/TrackPullParamConfigDto.cs | 5 +++ .../Events/OrderIdentifier.cs | 2 + .../TrackChangeAfterUpdateOrderEvent.cs | 5 +++ ...ChangeBottomLineUpdateOrderEventHandler.cs | 5 ++- ...TrackChangeAfterUpdateOrderEventHandler.cs | 7 ++++ .../EventHandlers/TrackUpsertEventHandler.cs | 40 +++++++++++++++++-- .../Aggregates/OrderAggregate/OrderEntity.cs | 8 +++- .../TrackPushPullParamsConfigEntity.cs | 6 +++ .../Dtos/Order/OrderTransportDto.cs | 10 +++++ .../GetTrackPullConfigDetailOutputVO.cs | 5 +++ .../Queries/IProvideQueries.cs | 7 ++++ .../Queries/ProvideQueries.cs | 16 +++++++- .../Repositories/OrderRepository.cs | 5 ++- .../Repositories/TrackPullConfigRepository.cs | 3 +- 14 files changed, 115 insertions(+), 9 deletions(-) create mode 100644 src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs index 79af5185..c4f65d0b 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs @@ -46,4 +46,9 @@ public class TrackPullParamConfigDto /// 轨迹明细数组路径 /// public string TrackDetailsPath { get; set; } = null!; + + /// + /// 轨迹内容代码 + /// + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs index 158e64b1..48186952 100644 --- a/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs +++ b/src/SJZY.Track.Application.Contract/Events/OrderIdentifier.cs @@ -7,4 +7,6 @@ public struct OrderIdentifier 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 b52a95a3..526febd8 100644 --- a/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs +++ b/src/SJZY.Track.Application.Contract/Events/TrackChangeAfterUpdateOrderEvent.cs @@ -41,4 +41,9 @@ public class TrackChangeAfterUpdateOrderEvent /// 轨迹时区 /// public float TrackTimeZone { get; set; } + + /// + /// 根据配置规则,标记拉取时需要的订单Id + /// + public int[] TriggerPullOrderIds { get; set; } = Array.Empty(); } \ No newline at end of file diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs index 0365727d..cccaf7eb 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/PullChangeBottomLineUpdateOrderEventHandler.cs @@ -6,6 +6,9 @@ using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.CAP.EventHandlers; +/// +/// 拉去轨迹后,执行了兜底操作还是失败的标记操作 +/// public class PullChangeBottomLineUpdateOrderEventHandler :ITransientDependency, ICapSubscribe { private readonly IOrderRepository _orderRepository; @@ -18,6 +21,6 @@ public class PullChangeBottomLineUpdateOrderEventHandler :ITransientDependency, [CapSubscribe(GlobalConst.PullChangeBottomLineUpdateOrderSubscribe)] public async Task ConsumerAsync(PullChangeBottomLineUpdateOrderEvent @event) { - await _orderRepository.UpdateBatchIdsAsync(@event.OrderIds, @event.DeficiencyTagValue); + var rows =await _orderRepository.UpdateBatchIdsAsync(@event.OrderIds, @event.DeficiencyTagValue); } } \ 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 859fb666..f5766880 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackChangeAfterUpdateOrderEventHandler.cs @@ -28,6 +28,7 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa if (orders.Count == 0) return; var updateOrders = new List(); + foreach (var order in orders) { if (order.LatestTrackContent != @event.TrackContent) @@ -45,6 +46,12 @@ public class TrackChangeAfterUpdateOrderEventHandler : ITransientDependency, ICa order.IsCompleted = @event.IsCompleted; } + // 触发拉取节点 + if (@event.TriggerPullOrderIds.Contains(order.Id)) + { + order.IsTriggerPull = 1; + } + order.LatestTrackContent = @event.TrackContent; order.LatestTrackEnContent = @event.TrackEnContent; order.LatestTrackPlace = @event.TrackPlace; diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs index baa3d8b3..cee1dc82 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackUpsertEventHandler.cs @@ -2,11 +2,14 @@ using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using SJZY.Track.Domain.Consts; +using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; +using OrderIdentifier = SJZY.Track.Application.Contract.Events.OrderIdentifier; namespace SJZY.Track.Application.CAP.EventHandlers; @@ -16,14 +19,16 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe private readonly IProvideQueries _provideQueries; private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly ICapPublisher _capPublisher; + private readonly ITrackPullCacheService _trackPullCacheService; public TrackUpsertEventHandler(IOrderRepository orderRepository, ICapPublisher capPublisher, - IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository) + IProvideQueries provideQueries, ITrackDetailsRepository trackDetailsRepository, ITrackPullCacheService trackPullCacheService) { _orderRepository = orderRepository; _capPublisher = capPublisher; _provideQueries = provideQueries; _trackDetailsRepository = trackDetailsRepository; + _trackPullCacheService = trackPullCacheService; } [CapSubscribe(GlobalConst.TrackUpsertSubscribe, Group = GlobalConst.TrackUpsertSubscribe)] @@ -100,7 +105,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } } } - + private async Task HandleTrackAsync(TrackUpsertEvent @event, List canNextOrderIds) { var content = await _provideQueries.GetTrackContentAsync(@event.SubSystemId, @event.TrackCode); @@ -114,7 +119,9 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe var trackContents = await _provideQueries.MatchTrackContentAsync(newOrderIds, @event.TrackCode); var insertTracks = new List(); + var triggerPullOrder = new List(); + var providerDic=await GetProviderDic(orderIds); foreach (var order in @event.OrderIdentifiers) { var track = tracks.FirstOrDefault(x => x.OrderId == order.OrderId); @@ -170,13 +177,24 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe } canNextOrderIds.Add(order.OrderId); + + if(!providerDic.TryGetValue(order.OrderId,out var provider)) + continue; + + var config = + await _trackPullCacheService.GetPullParamWithContentConfigAsync(provider.SubSystemId, + provider.ServiceProviderId); + if (config!=null && config.ParamConfig!=null && config.ParamConfig.TrackContentCode == @event.TrackCode) + { + triggerPullOrder.Add(order.OrderId); + } } if (canNextOrderIds.Count == 0) return; // 批量add to es await _trackDetailsRepository.AddManyAsync(insertTracks); - + // 触发订单主表更新事件(异步) await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe, new TrackChangeAfterUpdateOrderEvent @@ -188,7 +206,8 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatusId = content.TrackStatusId, TrackPlace = @event.TrackPlace, TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone + TrackTimeZone = @event.TrackTimeZone, + TriggerPullOrderIds = triggerPullOrder.ToArray() }); // 触发轨迹推送事件(异步) @@ -215,4 +234,17 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe await _capPublisher.PublishAsync(GlobalConst.TrackPushSubscribe, trackPushEvent); } } + + /// + /// 获取服务商字典 + /// + /// + /// + private async Task> GetProviderDic(int[] orderIds) + { + var providerList = await _provideQueries.FindOrderWithServiceProviderAsync(orderIds); + return providerList.GroupBy(val => val.OrderId) + .ToDictionary(val => val.Key, val => val.First()); + } + } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs index 4aefeac6..51e8d0e6 100644 --- a/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/OrderAggregate/OrderEntity.cs @@ -167,7 +167,13 @@ public class OrderEntity : IFullAuditedBasicEntitys, IAggregateRoot /// [SugarColumn(ColumnName = "ArrivalProvince")] public string? ArrivalProvince { get; set; } - + + /// + /// 是否触发拉取,1表示触发 + /// + [SugarColumn(ColumnName = "IsTriggerPull")] + public short? IsTriggerPull { get; set; } + [SugarColumn(IsIgnore = true)] public List OrderFlights { get; set; } [SugarColumn(IsIgnore = true)] public List OrderTemplates { get; set; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs b/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs index 59ea07e1..9687307f 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPullAggregate/TrackPushPullParamsConfigEntity.cs @@ -89,4 +89,10 @@ public class TrackPushPullParamsConfigEntity : IFullAuditedBasicEntitys, IEntity /// [SugarColumn(ColumnName = "ExpandFieldsName")] public string? ExpandFieldsName { get; set; } + + /// + /// 轨迹内容代码 + /// + [SugarColumn(ColumnName = "TrackContentCode")] + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs new file mode 100644 index 00000000..d7d03691 --- /dev/null +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderTransportDto.cs @@ -0,0 +1,10 @@ +namespace SJZY.Track.Domain.Dtos.Order; + +public class OrderTransportDto +{ + public int OrderId { get; set; } + + public int ServiceProviderId { get; set; } + + public int SubSystemId { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs b/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs index c52c081b..dbe0b308 100644 --- a/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs +++ b/src/SJZY.Track.Domain/Dtos/TrackPull/GetTrackPullConfigDetailOutputVO.cs @@ -78,4 +78,9 @@ public class GetTrackPullConfigDetailOutputVO /// 轨迹明细路径 /// public string TrackDetailsPath { get; set; } + + /// + /// 轨迹内容代码 + /// + public string? TrackContentCode { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index e01e5a50..6392d05e 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -68,4 +68,11 @@ public interface IProvideQueries int pageSize = 1000); Task GetTrackContentAsync(int subSystemId, string trackCode); + + /// + /// 查找订单和服务商信息 + /// + /// 订单id + /// 订单和服务商信息 + Task> FindOrderWithServiceProviderAsync(int[] orderIds); } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index 5ffffe7a..60043689 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -122,7 +122,7 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, return await Context.Queryable() .RightJoin((a, b) => a.Id == b.OrderId) .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) - .Where((a, b) => b.ServiceProviderId == serviceProvider && !a.IsCompleted) + .Where((a, b) => b.ServiceProviderId == serviceProvider && !a.IsCompleted && a.IsTriggerPull==1) .Select((a, b, c) => new OrderWithServiceProviderVO { OrderNo = a.OrderNo, @@ -136,6 +136,20 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, .Take(pageSize) .ToListAsync(); } + + public async Task> FindOrderWithServiceProviderAsync(int[] orderIds) + { + return await Context.Queryable() + .InnerJoin((a, b) => a.Id == b.OrderId) + .Where((a, b) => orderIds.Contains( a.Id) && !a.IsCompleted) + .Select((a, b) => new OrderTransportDto + { + OrderId = a.Id, + ServiceProviderId = b.ServiceProviderId, + SubSystemId = a.SubSystemId + }) + .ToListAsync(); + } public async Task GetTrackContentAsync(int subSystemId, string trackCode) { diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index aa825973..6f2130ae 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -1,5 +1,6 @@ using SJZY.Track.Domain; using SJZY.Track.Domain.Aggregates.OrderAggregate; +using SJZY.Track.Domain.Consts; using SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Repository.Repositories; @@ -21,7 +22,9 @@ public class OrderRepository : BasicRepository, IOrderRepository, I public Task UpdateBatchIdsAsync(List ids, int newValue) { - return Context.Ado.ExecuteCommandAsync("UPDATE `t_order` SET `DeficiencyTag` = @newValue WHERE `Id` IN @ids", new { ids, newValue }); + var idsString = string.Join(",", ids); + return Context.Ado.ExecuteCommandAsync( + $"UPDATE `t_order` SET `DeficiencyTag` = @newValue ,UpdateTime= current_timestamp WHERE `Id` IN ({idsString})", new { newValue }); } public async Task UpdateOrderAsync(OrderEntity order) diff --git a/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs index b3267e8a..41d9053b 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPullConfigRepository.cs @@ -72,7 +72,8 @@ public class TrackPullConfigRepository : BasicRepository, { Id = trackPull.Id, SubSystem = system.CnName, - ServiceProvider = service.Name + ServiceProvider = service.Name, + TrackContentCode = paramsConfig.TrackContentCode }, true) .SingleAsync(); }