diff --git a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs index 837fc960..15232caf 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackPushEventHandler.cs @@ -1,4 +1,6 @@ using DotNetCore.CAP; +using Newtonsoft.Json.Linq; +using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.TrackPush; using SJZY.Track.Application.Contract.Events; @@ -37,17 +39,36 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var order = await _orderRepository.GetFirstAsync(x => x.Id == @event.OrderId, x => new { - x.SubSystemId, x.LatestPushTrackCode, x.CustomId, x.OrderType + x.SubSystemId, x.LatestPushTrackCode, x.CustomId }); if (order == null) return; TrackPushContentConfigDto? config = null; + + var log = new TrackPushRecordIndex + { + IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}", + RequestId = res.RequestId, + Message = res.Msg, + OptionType = @event.OptionType.ToString(), + OrderId = @event.OrderId, + TrackStatus = @event.TrackStatus, + TrackCode = @event.TrackCode, + TrackContent = @event.TrackContent, + TrackPlace = @event.TrackPlace, + TrackTime = @event.TrackTime, + TrackTimeZone = @event.TrackTimeZone, + CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, + CreateTime = DateTime.Now + }; + + var allPush = false; switch (@event.OptionType) { case OptionType.无: return; case OptionType.新增: - if (@event.OperationMan == null) // 系统推送需要推断 + if (@event.OperationMan == null) { // 推送新增,需要根据上一次的推送 推断 本次推送 是否可行 config = await _trackPushCacheService.IsValidPushAsync(order.SubSystemId, order.CustomId, @@ -55,16 +76,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe } else { - // 手工推送不推断,直接无脑推 + // 手工推送单条不推断,直接无脑推 config = await _trackPushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId, @event.TrackCode); + if (config is { IsAllPush: true }) + { + } } if (config == null) return; - - // 当前发生的轨迹不是要推送的,直接结束 - if (config.TrackCode != @event.TrackCode) return; - res = await DoAddAsync(@event, config); + await DoAddAsync(@event, config, log, allPush); break; case OptionType.删除: break; @@ -72,41 +93,16 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe config = await _trackPushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId, @event.TrackCode); if (config == null || !config.IsCanUpdate) return; - res = await DoUpdateAsync(@event, config); + await DoUpdateAsync(@event, config, log); break; default: throw new ArgumentOutOfRangeException(); } - var isSuccess = res.Code == InterfaceRelayConst.SuccessCode; - if (config == null) return; // 往es 写推送日志 - await _trackPushRecordsRepository.AddAsync(new TrackPushRecordIndex - { - IndexName = $"{GlobalConst.TrackPushRecordsIndex}-{DateTime.Now:yyyy.MM.dd}", - RequestId = res.RequestId, - Message = res.Msg, - OptionType = @event.OptionType.ToString(), - OrderId = @event.OrderId, - OrderType = order.OrderType, - OrderNo = @event.OrderNo, - TrackStatus = @event.TrackStatus, - TrackCode = @event.TrackCode, - TrackContent = @event.TrackContent, - TrackPlace = @event.TrackPlace, - TrackTime = @event.TrackTime, - TrackTimeZone = @event.TrackTimeZone, - TrackContentCodeValue = config.TrackContentCodeValue, - TrackContentValue = config.TrackContentValue, - TrackEnContentValue = config.TrackEnContentValue, - TrackStatusValue = config.TrackStatusValue, - ExpandFieldsValue = config.ExpandFieldsValue, - IsSuccess = isSuccess, - CreateUser = @event.OperationMan ?? GlobalConst.SystemUser, - CreateTime = DateTime.Now - }); + await _trackPushRecordsRepository.AddAsync(log); // 同步去更新订单主表 await TrackPushAfterUpdateOrderAsync(new TrackPushAfterUpdateOrderDto @@ -114,7 +110,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe OptionType = @event.OptionType, OrderId = @event.OrderId, TrackCode = @event.TrackCode, - IsSuccess = isSuccess, + IsSuccess = log.IsSuccess, Message = res.Msg }); } @@ -149,39 +145,48 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe }); } - private async Task DoAddAsync(TrackPushEvent @event, - TrackPushContentConfigDto config) + private async Task DoAddAsync(TrackPushEvent @event, + TrackPushContentConfigDto config, TrackPushRecordIndex log, bool allPush) { - var data = new + var track = new { - orderNo = @event.OrderNo, - data = new[] - { - new - { - // 推真实的发生地和发生时间(时间是计算后的) - location = @event.TrackPlace, - date = @event.TrackTime.AddHours( - config.TrackTimeZone ?? @event.TrackTimeZone - @event.TrackTimeZone), - timeZone = config.TrackTimeZone ?? @event.TrackTimeZone, - description = config.TrackEnContentValue, - description_cn = config.TrackContentValue, - code = config.TrackContentCodeValue, - status = config.TrackStatusValue, - extra = config.ExpandFieldsValue - } - } + // 推真实的发生地和发生时间(时间是计算后的) + location = @event.TrackPlace, + date = @event.TrackTime.AddHours( + config.TrackTimeZone ?? @event.TrackTimeZone - @event.TrackTimeZone), + timeZone = config.TrackTimeZone ?? @event.TrackTimeZone, + description = config.TrackEnContentValue, + description_cn = config.TrackContentValue, + code = config.TrackContentCodeValue, + status = config.TrackStatusValue, + extra = config.ExpandFieldsValue }; + JObject body = JObject.FromObject(new + { + orderNo = @event.OrderNo, + data = new[] { track } + }); + + if (allPush) + { + var history = await _trackPushRecordsRepository.GetLatestTrackPushRecordAsync(@event.OrderId); + if (history != default) + { + body = JObject.Parse(history.PushContent); + ((JArray)body["data"]!).Add(track); + } + } var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.PushTrackInterfaceCode, - config.ServiceProviderCode, data); + config.ServiceProviderCode, body); - return res; + log.PushContent = body.ToJson(); + log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode; } - private async Task DoUpdateAsync(TrackPushEvent @event, - TrackPushContentConfigDto config) + private async Task DoUpdateAsync(TrackPushEvent @event, + TrackPushContentConfigDto config, TrackPushRecordIndex log) { var data = new { @@ -208,6 +213,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe var res = await _httpClientProxy.Service.ForwardWithSubscribeAsync(InterfaceRelayConst.TrackUpdateInterfaceCode, config.ServiceProviderCode, data); - return res; + log.PushContent = data.ToJson(); + log.IsSuccess = res.Code == InterfaceRelayConst.SuccessCode; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs index 30f51fe6..ac2d5277 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs @@ -109,6 +109,13 @@ public class TrackPushService : ApplicationService [HttpGet("Track/GetTrackPushRecords")] public async Task> GetTrackPushRecordsAsync(OrderNoInfo input) { - return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(input.OrderNo, input.OrderType); + var orderId = await _orderRepository.GetFirstAsync(x => + x.OrderType == input.OrderType && input.OrderNo == x.OrderNo, x => x.Id); + if (orderId == default) + { + throw new BusinessException(message: "订单不存在"); + } + + return await _trackPushRecordsRepository.GetTrackPushRecordsAsync(orderId); } } \ No newline at end of file diff --git a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs index b0bb479b..00d03f48 100644 --- a/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs +++ b/src/SJZY.Track.Application/Services/TrackPush/TrackPushCacheService.cs @@ -66,7 +66,7 @@ public class TrackPushCacheService : ITrackPushCacheService } } - return matched != null && matched.TrackCode == trackCode ? matched : default; + return matched != null && matched.TrackCode == trackCode && matched.IsAutoPush ? matched : default; } public async Task?> SetPushContentConfigsAsync(int? id = null, diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs index e776b1f4..8783078d 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/ITrackPushRecordsRepository.cs @@ -16,5 +16,10 @@ public interface ITrackPushRecordsRepository /// Task> GetTrackPushRecordsAsync(int orderId); - Task> GetTrackPushRecordsAsync(string inputOrderNo, int inputOrderType); + /// + /// 获取最新轨迹推送记录 + /// + /// + /// + Task GetLatestTrackPushRecordAsync(int orderId); } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs index 6efa70b5..8f877463 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackPushAggregate/TrackPushRecordIndex.cs @@ -17,16 +17,6 @@ public class TrackPushRecordIndex : IdBaseIndex /// public int OrderId { get; set; } - /// - /// 订单号 - /// - public string OrderNo { get; set; } = null!; - - /// - /// 订单类型(主数据枚举TrackOrderType) - /// - public int OrderType { get; set; } - /// /// 接口通请求Id /// @@ -78,29 +68,9 @@ public class TrackPushRecordIndex : IdBaseIndex public bool IsSuccess { get; set; } /// - /// 轨迹代码参数值 + /// 推送内容(json) /// - public string? TrackContentCodeValue { get; set; } - - /// - /// 轨迹内容参数值 - /// - public string? TrackContentValue { get; set; } - - /// - /// 轨迹内容英文参数值 - /// - public string? TrackEnContentValue { get; set; } - - /// - /// 轨迹状态参数值 - /// - public string? TrackStatusValue { get; set; } - - /// - /// 扩展字段参数值 - /// - public string? ExpandFieldsValue { get; set; } + public string PushContent { get; set; } = null!; /// 创建人 public string? CreateUser { get; set; } diff --git a/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs index 3847d786..a2745e96 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackPushRecordsRepository.cs @@ -41,17 +41,16 @@ public class TrackPushRecordsRepository : ElasticSearchContextAbstract> GetTrackPushRecordsAsync(string orderNo, int orderType) + public async Task GetLatestTrackPushRecordAsync(int orderId) { var data = await Context.SearchAsync(x => x .Index(GlobalConst.TrackPushRecordsIndex) .Query(q => - q.Term(t => t.OrderNo.Suffix("keyword"), orderNo) - && q.Term(f => f.OrderType, orderType) + q.Term(t => t.OrderId, orderId) ) .Size(1000) .Sort(s => s.Field(f => f.CreateTime, SortOrder.Descending))); - return data.Documents.ToList(); + return data.Documents.FirstOrDefault(); } } \ No newline at end of file