using SJZY.InterfaceRelay.Application.Contracts; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; using Volo.Abp.Http.Client.DynamicProxying; namespace SJZY.Track.Application.Services.ProvideServices; /// /// 轨迹推送服务 /// [ApiExplorerSettings(GroupName = "提供接口")] [Route("/ProviderService")] public class TrackPushService : ApplicationService { private readonly ITrackDetailsRepository _trackDetailsRepository; private readonly IOrderRepository _orderRepository; private readonly ITrackPushCacheService _pushCacheService; private readonly IHttpClientProxy _httpClientProxy; public TrackPushService( IHttpClientProxy httpClientProxy, ITrackPushCacheService pushCacheService, ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository) { _httpClientProxy = httpClientProxy; _pushCacheService = pushCacheService; _trackDetailsRepository = trackDetailsRepository; _orderRepository = orderRepository; } /// /// 手工推送轨迹 /// /// /// [HttpPost("Track/Push")] public async Task PushTrackAsync(PushTrackInput input) { input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 var orders = await _orderRepository.GetListAsync(x => x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new { x.Id, x.OrderNo, x.SubSystemId, x.CustomId }); if (orders.Count == 0) { throw new BusinessException(message: "一个推送配置都不存在"); } var tracks = await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos, input.TrackCode); foreach (var order in orders) { // 如果没有轨迹,就不需要推 var track = tracks.FirstOrDefault(x => x.OrderId == order.Id); if (track == null) continue; // 手工推送不推断,直接无脑推 var config = await _pushCacheService.GetPushContentConfigAsync(order.SubSystemId, order.CustomId, track.TrackContentId); var data = new { order.OrderNo, data = new[] { new { // 推真实的发生地和发生时间 location = track.TrackPlace, date = track.TrackTime.AddHours(config.TrackTimeZone ?? track.TrackTimeZone - track.TrackTimeZone), timeZone = config.TrackTimeZone ?? track.TrackTimeZone, description = config.TrackEnContentValue, description_cn = config.TrackContentValue, code = config.TrackContentCodeValue, status = config.TrackStatusValue, extra = config.ExpandFieldsValue } } }; await _httpClientProxy.Service.ForwardWithSubscribeAsync("A024", config.ServiceProviderCode, data); } return true; } }