diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs new file mode 100644 index 00000000..f6020d9f --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullConfigDto.cs @@ -0,0 +1,8 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackPull; + +public class TrackPullConfigDto +{ + public TrackPullParamConfigDto ParamConfig { get; set; } + + public List ContentConfigs { get; set; } +} \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/TrackPullContentConfigVO.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs similarity index 79% rename from src/SJZY.Track.Domain/Dtos/Order/TrackPullContentConfigVO.cs rename to src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs index 1f82cbe6..fd0fae59 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/TrackPullContentConfigVO.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullContentConfigDto.cs @@ -1,12 +1,17 @@ -namespace SJZY.Track.Domain.Dtos.Order; +namespace SJZY.Track.Application.Contract.Dtos.TrackPull; -public class TrackPullContentConfigVO +public class TrackPullContentConfigDto { /// - /// 轨迹内容id + /// 轨迹内容代码 /// - public int TrackContentId { get; set; } - + public string TrackContentCode { get; set; } = null!; + + /// + /// 服务商轨迹状态参数值 + /// + public string? TrackStatusValue { get; set; } + /// /// 服务商轨迹代码参数值 /// @@ -32,13 +37,8 @@ public class TrackPullContentConfigVO /// public int? TrackPlaceValue { get; set; } - /// - /// 服务商轨迹状态参数值 - /// - public string? TrackStatusValue { get; set; } - /// /// 轨迹时区GMT /// - public double? TrackTimeZone { get; set; } + public float? TrackTimeZone { get; set; } } \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs new file mode 100644 index 00000000..37c18332 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Dtos/TrackPull/TrackPullParamConfigDto.cs @@ -0,0 +1,49 @@ +namespace SJZY.Track.Application.Contract.Dtos.TrackPull; + +public class TrackPullParamConfigDto +{ + /// + /// 单号参数名 + /// + public string OrderNoName { get; set; } = null!; + + /// + /// 轨迹时区参数名 + /// + public string TackTimeZoneName { get; set; } = null!; + + /// + /// 轨迹代码参数名 + /// + public string TrackContentCodeName { get; set; } = null!; + + /// + /// 轨迹内容参数名 + /// + public string TrackContentName { get; set; } = null!; + + /// + /// 轨迹发生地参数名 + /// + public string TrackPlaceName { get; set; } = null!; + + /// + /// 轨迹状态参数名 + /// + public string TrackStatusName { get; set; } = null!; + + /// + /// 轨迹发生时间参数名 + /// + public string TrackTimeName { get; set; } = null!; + + /// + /// 订单数组路径 + /// + public string OrderPath { get; set; } = null!; + + /// + /// 轨迹明细数组路径 + /// + public string TrackDetailsPath { get; set; } = null!; +} \ No newline at end of file diff --git a/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs b/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs new file mode 100644 index 00000000..3ff68a49 --- /dev/null +++ b/src/SJZY.Track.Application.Contract/Services/ITrackPullCacheService.cs @@ -0,0 +1,13 @@ +using SJZY.Track.Application.Contract.Dtos.TrackPull; + +namespace SJZY.Track.Application.Contract.Services; + +public interface ITrackPullCacheService +{ + /// + /// 获取服务商拉取配置 + /// + /// + /// + Task GetPullConfigAsync(int serviceProviderId); +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/InterfaceRelayTrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/InterfaceRelayTrackRefreshEventHandler.cs deleted file mode 100644 index 099b1b99..00000000 --- a/src/SJZY.Track.Application/EventHandlers/InterfaceRelayTrackRefreshEventHandler.cs +++ /dev/null @@ -1,35 +0,0 @@ -using DotNetCore.CAP; -using Newtonsoft.Json; -using SJZY.InterfaceRelay.Application.Contracts; -using SJZY.Track.Application.Contract.Dtos.ProvideServices; -using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Queries; -using Volo.Abp.DependencyInjection; - -namespace SJZY.Track.Application.EventHandlers; - -public class InterfaceRelayTrackRefreshEventHandler : ITransientDependency, ICapSubscribe -{ - private readonly IOrderRepository _orderRepository; - private readonly IProvideQueries _provideQueries; - - public InterfaceRelayTrackRefreshEventHandler(IOrderRepository orderRepository, IProvideQueries provideQueries) - { - _orderRepository = orderRepository; - _provideQueries = provideQueries; - } - - [CapSubscribe(GlobalConst.InterfaceRelayTrackRefreshSubscribe)] - public async Task ConsumerAsync(InterfaceRelayTrackRefreshEvent @event) - { - if (@event.RequestParams is List requestParams) - { - var orderNos = requestParams.Select(x => x.OrderNo).ToList(); - - // tips:attach返回的是服务商id,必有 - var pullContentConfigs = await _provideQueries.GetPullContentConfigsAsync(int.Parse(@event.Attach)); - - // 轨迹清洗入库 - } - } -} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs new file mode 100644 index 00000000..5d2187cb --- /dev/null +++ b/src/SJZY.Track.Application/EventHandlers/TrackRefreshEventHandler.cs @@ -0,0 +1,95 @@ +using DotNetCore.CAP; +using Newtonsoft.Json.Linq; +using SJZY.InterfaceRelay.Application.Contracts; +using SJZY.Track.Application.Contract.Dtos.TrackPull; +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.EventHandlers; + +public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe +{ + private readonly IOrderRepository _orderRepository; + private readonly ICapPublisher _capPublisher; + private readonly ITrackPullCacheService _trackPullCacheService; + + public TrackRefreshEventHandler(IOrderRepository orderRepository, + ICapPublisher capPublisher, ITrackPullCacheService trackPullCacheService) + { + _orderRepository = orderRepository; + _capPublisher = capPublisher; + _trackPullCacheService = trackPullCacheService; + } + + [CapSubscribe(GlobalConst.TrackRefreshSubscribe)] + public async Task ConsumerAsync(InterfaceRelayTrackRefreshEvent @event) + { + // tips:attach返回的是服务商id,必有 + var attach = JObject.Parse(@event.Attach); + var serviceProviderId = attach["ServiceProviderId"]!.Value(); + var orderType = attach["OrderType"]!.Value(); + var config = await _trackPullCacheService.GetPullConfigAsync(serviceProviderId); + + var data = JObject.FromObject(@event.Data)["Data"]!; + var orderToken = data[config.ParamConfig.OrderPath]; + if (orderToken is JArray orderTokens) + { + foreach (var token in orderTokens) + { + await HandleOrderAsync(token, config, orderType); + } + } + else if (orderToken is JObject) + { + await HandleOrderAsync(orderToken, config, orderType); + } + } + + private async Task HandleOrderAsync(JToken token, TrackPullConfigDto config, int orderType) + { + var paramConfig = config.ParamConfig; + var orderNo = token[paramConfig.OrderNoName]?.Value(); + if (orderNo.IsNullOrWhiteSpace()) return; + + var order = await _orderRepository.GetFirstAsync(x => + x.OrderType == orderType && x.OrderNo == orderNo, x => new + { + x.Id, x.SubSystemId, x.IsPushCompleted, x.CustomId + }); + if (order == default) return; + + var trackToken = token[paramConfig.TrackDetailsPath]; + if (trackToken is null) return; + var trackUpsertEvent = new TrackUpsertEvent + { + OrderId = order.Id, + SubSystemId = order.SubSystemId, + IsPushCompleted = order.IsPushCompleted, + CustomId = order.CustomId, + OrderType = orderType, + OrderNo = orderNo!, + }; + + if (trackToken is JArray trackTokens) + { + foreach (var item in trackTokens) + { + await HandleTrackAsync(item, config, trackUpsertEvent); + } + } + } + + private async Task HandleTrackAsync(JToken token, TrackPullConfigDto config, + TrackUpsertEvent trackUpsertEvent) + { + // 新增/更新轨迹 + trackUpsertEvent.TrackCode = null; + trackUpsertEvent.TrackPlace = null; + trackUpsertEvent.TrackTime = null; + trackUpsertEvent.TrackTimeZone = null; + trackUpsertEvent.UpSubSystemId = 0; + await _capPublisher.PublishAsync(GlobalConst.TrackUpsertSubscribe, trackUpsertEvent); + } +} \ No newline at end of file diff --git a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs index db60129a..5784d125 100644 --- a/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs +++ b/src/SJZY.Track.Application/EventHandlers/TrackUpsertEventHandler.cs @@ -88,6 +88,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe TrackStatus = trackContent.Status, TrackCode = @event.TrackCode, TrackContent = trackContent.Content, + TrackEnContent = trackContent.EnContent, TrackPlace = @event.TrackPlace, TrackTime = @event.TrackTime!.Value, diff --git a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs index a021cd41..1de07174 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/OrderService.cs @@ -1,7 +1,5 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -using SJZY.Track.Domain.Dtos.Order; using SJZY.UserCenter.HttpApi.Services; namespace SJZY.Track.Application.Services.ProvideServices; @@ -14,14 +12,10 @@ namespace SJZY.Track.Application.Services.ProvideServices; public class OrderService : ApplicationService { private readonly IOrderRepository _orderRepository; - private readonly ITrackDetailsRepository _trackDetailsRepository; - public OrderService(IOrderRepository orderRepository, - ITrackDetailsRepository trackDetailsRepository - ) + public OrderService(IOrderRepository orderRepository) { _orderRepository = orderRepository; - _trackDetailsRepository = trackDetailsRepository; } /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs index 53cdfd57..840ccba7 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackPullService.cs @@ -1,4 +1,5 @@ -using SJZY.InterfaceRelay.Application.Contracts; +using Newtonsoft.Json; +using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; using Volo.Abp.Http.Client.DynamicProxying; @@ -39,19 +40,21 @@ public class TrackPullService : ApplicationService var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderNos); - foreach (var group in orderTemplates.GroupBy(x => x.ServiceProviderId)) + foreach (var group in orderTemplates.GroupBy(x => new + { + x.ServiceProviderId, x.OrderType, x.ServiceProviderCode + })) { - var data = group.Select(x => new OrderNoInfo + var data = group.Select(x => new { - OrderType = x.OrderType, - OrderNo = x.OrderNo + x.OrderNo }).ToList(); - + await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( - "A012", "yicang", 42, data, GlobalConst.InterfaceRelayTrackRefreshSubscribe - , group.Key.ToString()); + "A012", group.Key.ServiceProviderCode, 42, data, + GlobalConst.TrackRefreshSubscribe, JsonConvert.SerializeObject(group.Key)); } - + return true; } } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs index 9360db40..723ed89e 100644 --- a/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs +++ b/src/SJZY.Track.Domain/Dtos/Order/OrderTemplateVO.cs @@ -8,8 +8,13 @@ public class OrderTemplateVO /// 订单类型(主数据枚举TrackOrderType) /// public int OrderType { get; set; } - + public int TemplateId { get; set; } - + public int ServiceProviderId { get; set; } + + /// + /// 服务商code + /// + public string ServiceProviderCode { get; set; } = null!; } \ No newline at end of file diff --git a/src/SJZY.Track.Domain/GlobalConst.cs b/src/SJZY.Track.Domain/GlobalConst.cs index 78fdd6a8..2768048e 100644 --- a/src/SJZY.Track.Domain/GlobalConst.cs +++ b/src/SJZY.Track.Domain/GlobalConst.cs @@ -20,7 +20,7 @@ public class GlobalConst /// /// 接口通批量轨迹刷新 mq订阅名称 /// - public const string InterfaceRelayTrackRefreshSubscribe = "SJZY.Track.TrackRefresh"; + public const string TrackRefreshSubscribe = "SJZY.Track.TrackRefresh"; /// /// 轨迹新增/更新后触发更新订单轨迹 mq订阅名称 diff --git a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs index 710cb3f4..a3f8450c 100644 --- a/src/SJZY.Track.Domain/Queries/IProvideQueries.cs +++ b/src/SJZY.Track.Domain/Queries/IProvideQueries.cs @@ -48,11 +48,4 @@ public interface IProvideQueries /// /// Task> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes); - - /// - /// 获取服务商模板配置 - /// - /// - /// - Task> GetPullContentConfigsAsync(int serviceProviderId); } \ 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 78639986..a84a28f5 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -1,6 +1,5 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; -using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Dtos.Order; @@ -105,22 +104,4 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, .Select(x => x.TrackContentCode) .ToListAsync(); } - - public async Task> GetPullContentConfigsAsync(int serviceProviderId) - { - return await Context.Queryable() - .LeftJoin((a, b) => a.Id == b.TrackPullConfigId) - .Where(a => a.ServiceProviderId == serviceProviderId) - .Select(x => new TrackPullContentConfigVO - { - TrackContentId = 0, - TrackContentCodeValue = null, - TrackContentValue = null, - TrackKeyword = null, - TrackKeywordReverse = null, - TrackPlaceValue = null, - TrackStatusValue = null, - TrackTimeZone = null - }).ToListAsync(); - } } \ No newline at end of file diff --git a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs index 481a5c87..1a7383f1 100644 --- a/src/SJZY.Track.Repository/Repositories/OrderRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/OrderRepository.cs @@ -14,9 +14,9 @@ public class OrderRepository : BasicRepository, IOrderRepository, I public OrderRepository( ITrackDetailsRepository trackDetailsRepository - ) + ) { - this._trackDetailsRepository=trackDetailsRepository; + this._trackDetailsRepository = trackDetailsRepository; } public async Task CreateOrderAsync(OrderEntity order) @@ -172,44 +172,45 @@ public class OrderRepository : BasicRepository, IOrderRepository, I var orderIds = pageList.List.Select(a => a.Id).ToList(); //查询轨迹模版 var trackTemplateList = await Context.Queryable() - .LeftJoin((a, b) => a.TrackTemplateId==b.Id) - .Where((a, b) => orderIds.Contains(a.OrderId)) - .Select((a, b) => new { OrderId = a.OrderId, Name = b.Name, TemplateId = b.Id }) - .ToListAsync(); + .LeftJoin((a, b) => a.TrackTemplateId == b.Id) + .Where((a, b) => orderIds.Contains(a.OrderId)) + .Select((a, b) => new { OrderId = a.OrderId, Name = b.Name, TemplateId = b.Id }) + .ToListAsync(); var esTrackDetails = await _trackDetailsRepository.GetListAsync(orderIds); pageList.List.ForEach(a => { - var esDetails = esTrackDetails?.Where(b => b.OrderId== a.Id).OrderByDescending(b => b.TrackTime); + var esDetails = esTrackDetails?.Where(b => b.OrderId == a.Id).OrderByDescending(b => b.TrackTime); var trackDetail = esDetails?.FirstOrDefault(); - if (trackDetail!=null) + if (trackDetail != null) { - if (trackDetail.TrackContent!=a.NewestTrackContent) + if (trackDetail.TrackContent != a.NewestTrackContent) { - a.NewestTrackContent=trackDetail.TrackContent; + a.NewestTrackContent = trackDetail.TrackContent; } - if (trackDetail.TrackEnContent!=a.NewestTrackEnContent) + + if (trackDetail.TrackEnContent != a.NewestTrackEnContent) { - a.NewestTrackEnContent=trackDetail.TrackEnContent; + a.NewestTrackEnContent = trackDetail.TrackEnContent; } - if (trackDetail.TrackPlace!=a.NewestTrackPlace) + + if (trackDetail.TrackPlace != a.NewestTrackPlace) { - a.NewestTrackPlace=trackDetail.TrackPlace; + a.NewestTrackPlace = trackDetail.TrackPlace; } - if (trackDetail.TrackTime!= a.NewestTrackTime) + + if (trackDetail.TrackTime != a.NewestTrackTime) { - a.NewestTrackTime=trackDetail.TrackTime; + a.NewestTrackTime = trackDetail.TrackTime; } } - a.TrackTemplateNames =trackTemplateList.Where(b => b.OrderId== a.Id).Select(a => a.Name).JoinAsString(","); - a.TrackTemplateIds = trackTemplateList.Where(b => b.OrderId== a.Id).Select(a => a.TemplateId).ToList(); + a.TrackTemplateNames = trackTemplateList.Where(b => b.OrderId == a.Id).Select(a => a.Name) + .JoinAsString(","); + a.TrackTemplateIds = trackTemplateList.Where(b => b.OrderId == a.Id).Select(a => a.TemplateId).ToList(); }); - } - - #region 暂时注释 //if (pageList.List.Any()) @@ -243,13 +244,15 @@ public class OrderRepository : BasicRepository, IOrderRepository, I { return await Context.Queryable() .LeftJoin((a, b) => a.Id == b.OrderId) + .LeftJoin((a, b, c) => b.ServiceProviderId == c.Id) .Where(a => orderNos.Contains(a.OrderNo)) - .Select((a, b) => new OrderTemplateVO + .Select((a, b, c) => new OrderTemplateVO { OrderNo = a.OrderNo, OrderType = a.OrderType, TemplateId = b.TrackTemplateId, - ServiceProviderId = b.ServiceProviderId + ServiceProviderId = b.ServiceProviderId, + ServiceProviderCode = c.Code }) .ToListAsync(); }