track/src/SJZY.Track.Application/Services/ProvideServices/TrackPushService.cs
2024-03-16 11:32:02 +08:00

93 lines
3.5 KiB
C#

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;
/// <summary>
/// 轨迹推送服务
/// </summary>
[ApiExplorerSettings(GroupName = "提供接口")]
[Route("/ProviderService")]
public class TrackPushService : ApplicationService
{
private readonly ITrackDetailsRepository _trackDetailsRepository;
private readonly IOrderRepository _orderRepository;
private readonly ITrackPushCacheService _pushCacheService;
private readonly IHttpClientProxy<IInterfaceForwardServiceV2> _httpClientProxy;
public TrackPushService(
IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy, ITrackPushCacheService pushCacheService,
ITrackDetailsRepository trackDetailsRepository, IOrderRepository orderRepository)
{
_httpClientProxy = httpClientProxy;
_pushCacheService = pushCacheService;
_trackDetailsRepository = trackDetailsRepository;
_orderRepository = orderRepository;
}
/// <summary>
/// 手工推送轨迹
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
[HttpPost("Track/Push")]
public async Task<bool> 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;
}
}