Merge remote-tracking branch 'origin/S03-轨迹中台优化项' into test
This commit is contained in:
commit
1b6d426550
@ -5,7 +5,7 @@ public class TrackChangeAfterUpdateOrderEvent
|
|||||||
/// <summary>
|
/// <summary>
|
||||||
/// 订单Id
|
/// 订单Id
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public int[] OrderIds { get; set; }
|
public int[] OrderIds { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否删除引起的更新
|
/// 是否删除引起的更新
|
||||||
|
|||||||
@ -2,6 +2,11 @@
|
|||||||
|
|
||||||
public class TrackPushEvent
|
public class TrackPushEvent
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 重试次数
|
||||||
|
/// </summary>
|
||||||
|
public int RetryNum { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 操作类型
|
/// 操作类型
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -20,15 +20,17 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
private readonly ITrackPushRecordsRepository _trackPushRecordsRepository;
|
private readonly ITrackPushRecordsRepository _trackPushRecordsRepository;
|
||||||
private readonly IOrderRepository _orderRepository;
|
private readonly IOrderRepository _orderRepository;
|
||||||
private readonly ITrackPushCacheService _trackPushCacheService;
|
private readonly ITrackPushCacheService _trackPushCacheService;
|
||||||
|
private readonly ICapPublisher _capPublisher;
|
||||||
|
|
||||||
public TrackPushEventHandler(IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
public TrackPushEventHandler(IHttpClientProxy<IInterfaceForwardServiceV2> httpClientProxy,
|
||||||
ITrackPushRecordsRepository trackPushRecordsRepository,
|
ITrackPushRecordsRepository trackPushRecordsRepository,
|
||||||
IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService)
|
IOrderRepository orderRepository, ITrackPushCacheService trackPushCacheService, ICapPublisher capPublisher)
|
||||||
{
|
{
|
||||||
_httpClientProxy = httpClientProxy;
|
_httpClientProxy = httpClientProxy;
|
||||||
_trackPushRecordsRepository = trackPushRecordsRepository;
|
_trackPushRecordsRepository = trackPushRecordsRepository;
|
||||||
_orderRepository = orderRepository;
|
_orderRepository = orderRepository;
|
||||||
_trackPushCacheService = trackPushCacheService;
|
_trackPushCacheService = trackPushCacheService;
|
||||||
|
_capPublisher = capPublisher;
|
||||||
}
|
}
|
||||||
|
|
||||||
[CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)]
|
[CapSubscribe(GlobalConst.TrackPushSubscribe, Group = GlobalConst.TrackPushSubscribe)]
|
||||||
@ -103,6 +105,19 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
throw new ArgumentOutOfRangeException();
|
throw new ArgumentOutOfRangeException();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!log.IsSuccess)
|
||||||
|
{
|
||||||
|
if (@event.RetryNum < 3)
|
||||||
|
{
|
||||||
|
// 1, 2, 4min
|
||||||
|
await _capPublisher.PublishDelayAsync(
|
||||||
|
TimeSpan.FromSeconds((1 << @event.RetryNum) * 60),
|
||||||
|
GlobalConst.TrackPushSubscribe, @event);
|
||||||
|
@event.RetryNum++;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 往es 写推送日志
|
// 往es 写推送日志
|
||||||
await _trackPushRecordsRepository.AddAsync(log);
|
await _trackPushRecordsRepository.AddAsync(log);
|
||||||
|
|
||||||
@ -169,7 +184,7 @@ public class TrackPushEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
Extra = config.ExpandFieldsValue
|
Extra = config.ExpandFieldsValue
|
||||||
};
|
};
|
||||||
|
|
||||||
var body = new TrackPushInput()
|
var body = new TrackPushInput
|
||||||
{
|
{
|
||||||
OrderNo = @event.OrderNo,
|
OrderNo = @event.OrderNo,
|
||||||
};
|
};
|
||||||
|
|||||||
@ -105,7 +105,6 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
if (track != null && @event.IsAdd!.Value) return; // 存在不让创建
|
if (track != null && @event.IsAdd!.Value) return; // 存在不让创建
|
||||||
}
|
}
|
||||||
|
|
||||||
// step1、upsert es轨迹
|
|
||||||
if (track == default)
|
if (track == default)
|
||||||
{
|
{
|
||||||
track = new TrackDetailsIndex
|
track = new TrackDetailsIndex
|
||||||
@ -159,8 +158,7 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
var trackPushEvent = new TrackPushEvent
|
var trackPushEvent = new TrackPushEvent
|
||||||
{
|
{
|
||||||
OptionType = track.Id.IsNullOrWhiteSpace() ? OptionType.新增 : OptionType.修改,
|
OptionType = track.Id.IsNullOrWhiteSpace() ? OptionType.新增 : OptionType.修改,
|
||||||
OrderId = track.OrderId,
|
OrderId = order.OrderId,
|
||||||
OrderNo = track.OrderNo,
|
|
||||||
TrackStatus = track.TrackStatus,
|
TrackStatus = track.TrackStatus,
|
||||||
TrackCode = track.TrackCode,
|
TrackCode = track.TrackCode,
|
||||||
TrackContent = track.TrackContent,
|
TrackContent = track.TrackContent,
|
||||||
@ -174,6 +172,10 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
|
|
||||||
var firstTrack = insertTracks.FirstOrDefault();
|
var firstTrack = insertTracks.FirstOrDefault();
|
||||||
if (firstTrack == null) return;
|
if (firstTrack == null) return;
|
||||||
|
|
||||||
|
// step1、upsert es轨迹
|
||||||
|
await _trackDetailsRepository.AddManyAsync(insertTracks);
|
||||||
|
|
||||||
// step3、触发订单主表更新事件(异步)
|
// step3、触发订单主表更新事件(异步)
|
||||||
await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
|
await _capPublisher.PublishAsync(GlobalConst.TrackChangeAfterUpdateOrderSubscribe,
|
||||||
new TrackChangeAfterUpdateOrderEvent
|
new TrackChangeAfterUpdateOrderEvent
|
||||||
@ -187,7 +189,5 @@ public class TrackUpsertEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
TrackTime = firstTrack.TrackTime,
|
TrackTime = firstTrack.TrackTime,
|
||||||
TrackTimeZone = firstTrack.TrackTimeZone
|
TrackTimeZone = firstTrack.TrackTimeZone
|
||||||
});
|
});
|
||||||
|
|
||||||
await _trackDetailsRepository.AddManyAsync(insertTracks);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -43,18 +43,16 @@ public class TrackPushService : ApplicationService
|
|||||||
{
|
{
|
||||||
input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空
|
input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空
|
||||||
|
|
||||||
var orders = await _orderRepository.GetListAsync(x =>
|
var orderIds = await _orderRepository.GetArrayAsync(x =>
|
||||||
x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => new
|
x.OrderType == input.OrderType && input.OrderNos.Contains(x.OrderNo), x => x.Id);
|
||||||
{
|
|
||||||
x.Id, x.OrderNo, x.OrderType, x.SubSystemId, x.CustomId
|
|
||||||
});
|
|
||||||
|
|
||||||
if (orders.Count == 0)
|
if (!orderIds.Any())
|
||||||
{
|
{
|
||||||
throw new BusinessException(message: "一个推送配置都不存在");
|
throw new BusinessException(message: "一个订单都不存在");
|
||||||
}
|
}
|
||||||
|
|
||||||
var tracks = await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos, input.TrackCode);
|
var tracks = await _trackDetailsRepository.GetListAsync(orderIds, input.TrackCode);
|
||||||
|
tracks = tracks.DistinctBy(x => x.OrderId).ToList();
|
||||||
|
|
||||||
if (tracks.Count == 0)
|
if (tracks.Count == 0)
|
||||||
{
|
{
|
||||||
|
|||||||
@ -19,8 +19,6 @@ public interface ITrackDetailsRepository
|
|||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos);
|
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos);
|
||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos, string trackCode);
|
|
||||||
|
|
||||||
Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input);
|
Task<(List<TrackDetailsIndex> list, long total)> GetListAsync(TrackDetailsQueryInput input);
|
||||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
|
Task<List<TrackDetailsIndex>> GetListAsync(int orderId);
|
||||||
|
|
||||||
|
|||||||
@ -22,6 +22,9 @@ public interface IBasicQuery<T> where T : IEntity
|
|||||||
Task<List<TResult>> GetListAsync<TResult>(Expression<Func<T, bool>> whereExpression,
|
Task<List<TResult>> GetListAsync<TResult>(Expression<Func<T, bool>> whereExpression,
|
||||||
Expression<Func<T, TResult>> resultExpression);
|
Expression<Func<T, TResult>> resultExpression);
|
||||||
|
|
||||||
|
Task<TResult[]> GetArrayAsync<TResult>(Expression<Func<T, bool>> whereExpression,
|
||||||
|
Expression<Func<T, TResult>> resultExpression);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// count
|
/// count
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|||||||
@ -24,4 +24,10 @@ public class BasicQuery<T> : SimpleClient<T>, IBasicQuery<T> where T : class, IE
|
|||||||
{
|
{
|
||||||
return await Context.Queryable<T>().Where(whereExpression).Select(resultExpression).ToListAsync();
|
return await Context.Queryable<T>().Where(whereExpression).Select(resultExpression).ToListAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<TResult[]> GetArrayAsync<TResult>(Expression<Func<T, bool>> whereExpression,
|
||||||
|
Expression<Func<T, TResult>> resultExpression)
|
||||||
|
{
|
||||||
|
return await Context.Queryable<T>().Where(whereExpression).Select(resultExpression).ToArrayAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@ -104,8 +104,6 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
|
|
||||||
public async Task AddManyAsync(List<TrackDetailsIndex> tracks)
|
public async Task AddManyAsync(List<TrackDetailsIndex> tracks)
|
||||||
{
|
{
|
||||||
if (!tracks.Any()) return;
|
|
||||||
|
|
||||||
// 按天写入es
|
// 按天写入es
|
||||||
var r = await Context.IndexManyAsync(tracks, tracks.First().IndexName);
|
var r = await Context.IndexManyAsync(tracks, tracks.First().IndexName);
|
||||||
|
|
||||||
@ -141,33 +139,6 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
return data.Documents.ToList();
|
return data.Documents.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos, string trackCode)
|
|
||||||
{
|
|
||||||
if (orderNos.Count < 1) return new List<TrackDetailsIndex>();
|
|
||||||
|
|
||||||
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
|
||||||
.Source(s => s.Includes(fd => fd
|
|
||||||
.Field(f => f.OrderId)
|
|
||||||
.Field(f => f.OrderNo)
|
|
||||||
.Field(f => f.TrackStatus)
|
|
||||||
.Field(f => f.TrackCode)
|
|
||||||
.Field(f => f.TrackContent)
|
|
||||||
.Field(f => f.TrackPlace)
|
|
||||||
.Field(f => f.TrackTime)
|
|
||||||
.Field(f => f.TrackTimeZone)
|
|
||||||
))
|
|
||||||
.Query(q =>
|
|
||||||
q.Terms(t => t
|
|
||||||
.Field(f => f.OrderNo.Suffix("keyword"))
|
|
||||||
.Terms(orderNos))
|
|
||||||
&& q.Term(f => f.OrderType, orderType)
|
|
||||||
&& q.Term(f => f.TrackCode.Suffix("keyword"), trackCode)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
return data.Documents.ToList();
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
|
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
|
||||||
{
|
{
|
||||||
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
var data = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user