临时提交

This commit is contained in:
李鹏军 2024-03-09 16:15:04 +08:00
parent 0e8af92756
commit e17eb425a4
14 changed files with 224 additions and 114 deletions

View File

@ -0,0 +1,8 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackPull;
public class TrackPullConfigDto
{
public TrackPullParamConfigDto ParamConfig { get; set; }
public List<TrackPullContentConfigDto> ContentConfigs { get; set; }
}

View File

@ -1,11 +1,16 @@
namespace SJZY.Track.Domain.Dtos.Order; namespace SJZY.Track.Application.Contract.Dtos.TrackPull;
public class TrackPullContentConfigVO public class TrackPullContentConfigDto
{ {
/// <summary> /// <summary>
/// 轨迹内容id /// 轨迹内容代码
/// </summary> /// </summary>
public int TrackContentId { get; set; } public string TrackContentCode { get; set; } = null!;
/// <summary>
/// 服务商轨迹状态参数值
/// </summary>
public string? TrackStatusValue { get; set; }
/// <summary> /// <summary>
/// 服务商轨迹代码参数值 /// 服务商轨迹代码参数值
@ -32,13 +37,8 @@ public class TrackPullContentConfigVO
/// </summary> /// </summary>
public int? TrackPlaceValue { get; set; } public int? TrackPlaceValue { get; set; }
/// <summary>
/// 服务商轨迹状态参数值
/// </summary>
public string? TrackStatusValue { get; set; }
/// <summary> /// <summary>
/// 轨迹时区GMT /// 轨迹时区GMT
/// </summary> /// </summary>
public double? TrackTimeZone { get; set; } public float? TrackTimeZone { get; set; }
} }

View File

@ -0,0 +1,49 @@
namespace SJZY.Track.Application.Contract.Dtos.TrackPull;
public class TrackPullParamConfigDto
{
/// <summary>
/// 单号参数名
/// </summary>
public string OrderNoName { get; set; } = null!;
/// <summary>
/// 轨迹时区参数名
/// </summary>
public string TackTimeZoneName { get; set; } = null!;
/// <summary>
/// 轨迹代码参数名
/// </summary>
public string TrackContentCodeName { get; set; } = null!;
/// <summary>
/// 轨迹内容参数名
/// </summary>
public string TrackContentName { get; set; } = null!;
/// <summary>
/// 轨迹发生地参数名
/// </summary>
public string TrackPlaceName { get; set; } = null!;
/// <summary>
/// 轨迹状态参数名
/// </summary>
public string TrackStatusName { get; set; } = null!;
/// <summary>
/// 轨迹发生时间参数名
/// </summary>
public string TrackTimeName { get; set; } = null!;
/// <summary>
/// 订单数组路径
/// </summary>
public string OrderPath { get; set; } = null!;
/// <summary>
/// 轨迹明细数组路径
/// </summary>
public string TrackDetailsPath { get; set; } = null!;
}

View File

@ -0,0 +1,13 @@
using SJZY.Track.Application.Contract.Dtos.TrackPull;
namespace SJZY.Track.Application.Contract.Services;
public interface ITrackPullCacheService
{
/// <summary>
/// 获取服务商拉取配置
/// </summary>
/// <param name="serviceProviderId"></param>
/// <returns></returns>
Task<TrackPullConfigDto> GetPullConfigAsync(int serviceProviderId);
}

View File

@ -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<OrderNoInfo> requestParams)
{
var orderNos = requestParams.Select(x => x.OrderNo).ToList();
// tips:attach返回的是服务商id,必有
var pullContentConfigs = await _provideQueries.GetPullContentConfigsAsync(int.Parse(@event.Attach));
// 轨迹清洗入库
}
}
}

View File

@ -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<int>();
var orderType = attach["OrderType"]!.Value<int>();
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<string>();
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);
}
}

View File

@ -88,6 +88,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
TrackStatus = trackContent.Status, TrackStatus = trackContent.Status,
TrackCode = @event.TrackCode, TrackCode = @event.TrackCode,
TrackContent = trackContent.Content, TrackContent = trackContent.Content,
TrackEnContent = trackContent.EnContent, TrackEnContent = trackContent.EnContent,
TrackPlace = @event.TrackPlace, TrackPlace = @event.TrackPlace,
TrackTime = @event.TrackTime!.Value, TrackTime = @event.TrackTime!.Value,

View File

@ -1,7 +1,5 @@
using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate;
using SJZY.Track.Domain.Dtos.Order;
using SJZY.UserCenter.HttpApi.Services; using SJZY.UserCenter.HttpApi.Services;
namespace SJZY.Track.Application.Services.ProvideServices; namespace SJZY.Track.Application.Services.ProvideServices;
@ -14,14 +12,10 @@ namespace SJZY.Track.Application.Services.ProvideServices;
public class OrderService : ApplicationService public class OrderService : ApplicationService
{ {
private readonly IOrderRepository _orderRepository; private readonly IOrderRepository _orderRepository;
private readonly ITrackDetailsRepository _trackDetailsRepository;
public OrderService(IOrderRepository orderRepository, public OrderService(IOrderRepository orderRepository)
ITrackDetailsRepository trackDetailsRepository
)
{ {
_orderRepository = orderRepository; _orderRepository = orderRepository;
_trackDetailsRepository = trackDetailsRepository;
} }
/// <summary> /// <summary>

View File

@ -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.Application.Contract.Dtos.ProvideServices;
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using Volo.Abp.Http.Client.DynamicProxying; using Volo.Abp.Http.Client.DynamicProxying;
@ -39,17 +40,19 @@ public class TrackPullService : ApplicationService
var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderNos); var orderTemplates = await _orderRepository.GetOrderTemplatesAsync(input.OrderNos);
foreach (var group in orderTemplates.GroupBy(x => x.ServiceProviderId)) foreach (var group in orderTemplates.GroupBy(x => new
{ {
var data = group.Select(x => new OrderNoInfo x.ServiceProviderId, x.OrderType, x.ServiceProviderCode
}))
{ {
OrderType = x.OrderType, var data = group.Select(x => new
OrderNo = x.OrderNo {
x.OrderNo
}).ToList(); }).ToList();
await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync( await _httpClientProxy.Service.BatchForwardThenPushToQueueAsync(
"A012", "yicang", 42, data, GlobalConst.InterfaceRelayTrackRefreshSubscribe "A012", group.Key.ServiceProviderCode, 42, data,
, group.Key.ToString()); GlobalConst.TrackRefreshSubscribe, JsonConvert.SerializeObject(group.Key));
} }
return true; return true;

View File

@ -12,4 +12,9 @@ public class OrderTemplateVO
public int TemplateId { get; set; } public int TemplateId { get; set; }
public int ServiceProviderId { get; set; } public int ServiceProviderId { get; set; }
/// <summary>
/// 服务商code
/// </summary>
public string ServiceProviderCode { get; set; } = null!;
} }

View File

@ -20,7 +20,7 @@ public class GlobalConst
/// <summary> /// <summary>
/// 接口通批量轨迹刷新 mq订阅名称 /// 接口通批量轨迹刷新 mq订阅名称
/// </summary> /// </summary>
public const string InterfaceRelayTrackRefreshSubscribe = "SJZY.Track.TrackRefresh"; public const string TrackRefreshSubscribe = "SJZY.Track.TrackRefresh";
/// <summary> /// <summary>
/// 轨迹新增/更新后触发更新订单轨迹 mq订阅名称 /// 轨迹新增/更新后触发更新订单轨迹 mq订阅名称

View File

@ -48,11 +48,4 @@ public interface IProvideQueries
/// <param name="trackCodes"></param> /// <param name="trackCodes"></param>
/// <returns></returns> /// <returns></returns>
Task<List<string>> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes); Task<List<string>> MapTrackCodesAsync(int upSubSystemId, int subSystemId, params string[] trackCodes);
/// <summary>
/// 获取服务商模板配置
/// </summary>
/// <param name="serviceProviderId"></param>
/// <returns></returns>
Task<List<TrackPullContentConfigVO>> GetPullContentConfigsAsync(int serviceProviderId);
} }

View File

@ -1,6 +1,5 @@
using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.OrderAggregate;
using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate;
using SJZY.Track.Domain.Aggregates.TrackPullAggregate;
using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate;
using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate;
using SJZY.Track.Domain.Dtos.Order; using SJZY.Track.Domain.Dtos.Order;
@ -105,22 +104,4 @@ public class ProvideQueries : ISugarRepository, IProvideQueries,
.Select(x => x.TrackContentCode) .Select(x => x.TrackContentCode)
.ToListAsync(); .ToListAsync();
} }
public async Task<List<TrackPullContentConfigVO>> GetPullContentConfigsAsync(int serviceProviderId)
{
return await Context.Queryable<TrackPullConfigEntity>()
.LeftJoin<TrackPullContentConfigEntity>((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();
}
} }

View File

@ -16,7 +16,7 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
ITrackDetailsRepository trackDetailsRepository ITrackDetailsRepository trackDetailsRepository
) )
{ {
this._trackDetailsRepository=trackDetailsRepository; this._trackDetailsRepository = trackDetailsRepository;
} }
public async Task CreateOrderAsync(OrderEntity order) public async Task CreateOrderAsync(OrderEntity order)
@ -172,44 +172,45 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
var orderIds = pageList.List.Select(a => a.Id).ToList(); var orderIds = pageList.List.Select(a => a.Id).ToList();
//查询轨迹模版 //查询轨迹模版
var trackTemplateList = await Context.Queryable<OrderTemplateEntity>() var trackTemplateList = await Context.Queryable<OrderTemplateEntity>()
.LeftJoin<TrackTemplateEntity>((a, b) => a.TrackTemplateId==b.Id) .LeftJoin<TrackTemplateEntity>((a, b) => a.TrackTemplateId == b.Id)
.Where((a, b) => orderIds.Contains(a.OrderId)) .Where((a, b) => orderIds.Contains(a.OrderId))
.Select((a, b) => new { OrderId = a.OrderId, Name = b.Name, TemplateId = b.Id }) .Select((a, b) => new { OrderId = a.OrderId, Name = b.Name, TemplateId = b.Id })
.ToListAsync(); .ToListAsync();
var esTrackDetails = await _trackDetailsRepository.GetListAsync(orderIds); var esTrackDetails = await _trackDetailsRepository.GetListAsync(orderIds);
pageList.List.ForEach(a => 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(); 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.TrackTemplateNames = trackTemplateList.Where(b => b.OrderId == a.Id).Select(a => a.Name)
a.TrackTemplateIds = trackTemplateList.Where(b => b.OrderId== a.Id).Select(a => a.TemplateId).ToList(); .JoinAsString(",");
a.TrackTemplateIds = trackTemplateList.Where(b => b.OrderId == a.Id).Select(a => a.TemplateId).ToList();
}); });
} }
#region 暂时注释 #region 暂时注释
//if (pageList.List.Any()) //if (pageList.List.Any())
@ -243,13 +244,15 @@ public class OrderRepository : BasicRepository<OrderEntity>, IOrderRepository, I
{ {
return await Context.Queryable<OrderEntity>() return await Context.Queryable<OrderEntity>()
.LeftJoin<OrderTemplateEntity>((a, b) => a.Id == b.OrderId) .LeftJoin<OrderTemplateEntity>((a, b) => a.Id == b.OrderId)
.LeftJoin<VServiceProviderEntity>((a, b, c) => b.ServiceProviderId == c.Id)
.Where(a => orderNos.Contains(a.OrderNo)) .Where(a => orderNos.Contains(a.OrderNo))
.Select((a, b) => new OrderTemplateVO .Select((a, b, c) => new OrderTemplateVO
{ {
OrderNo = a.OrderNo, OrderNo = a.OrderNo,
OrderType = a.OrderType, OrderType = a.OrderType,
TemplateId = b.TrackTemplateId, TemplateId = b.TrackTemplateId,
ServiceProviderId = b.ServiceProviderId ServiceProviderId = b.ServiceProviderId,
ServiceProviderCode = c.Code
}) })
.ToListAsync(); .ToListAsync();
} }