handle todo
This commit is contained in:
parent
77b5352b05
commit
9965372fda
@ -263,7 +263,9 @@ public class TrackRefreshEventHandler : ITransientDependency, ICapSubscribe
|
|||||||
trackToken[paramConfig.TrackContentName!]?.Value<string>() ?? GlobalConst.EmptyString;
|
trackToken[paramConfig.TrackContentName!]?.Value<string>() ?? GlobalConst.EmptyString;
|
||||||
}
|
}
|
||||||
|
|
||||||
track.ZeroTrackTime = track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
|
track.ZeroTrackTime = Math.Abs(track.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||||||
|
? track.TrackTime
|
||||||
|
: track.TrackTime.Subtract(TimeSpan.FromHours(track.TrackTimeZone));
|
||||||
|
|
||||||
await _trackDetailsRepository.AddAsync(track);
|
await _trackDetailsRepository.AddAsync(track);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -67,17 +67,21 @@ public partial class OrderService
|
|||||||
x => x.LinkOrderNo);
|
x => x.LinkOrderNo);
|
||||||
|
|
||||||
// 计算出未关联的订单
|
// 计算出未关联的订单
|
||||||
var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos);
|
var noLinkOrderNos = input.LinkOrderNos.Except(linkOrderNos).ToList();
|
||||||
|
|
||||||
// 过滤掉不存在的订单
|
// 查询存在的订单
|
||||||
var canLinkOrders = await _orderRepository.GetListAsync(x =>
|
var existedOrders = await _orderRepository.GetListAsync(x =>
|
||||||
x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo),
|
x.OrderType == input.LinkOrderType && noLinkOrderNos.Contains(x.OrderNo),
|
||||||
x => new { x.Id, x.OrderNo, x.OrderType, x.SubSystemId, x.CustomId });
|
x => new { x.Id, x.OrderNo, x.OrderType, x.SubSystemId, x.CustomId });
|
||||||
|
|
||||||
// todo:如果有不存在的单,需要抛异常
|
|
||||||
if (canLinkOrders.Count != noLinkOrderNos.Count() ) return;
|
|
||||||
|
|
||||||
await _orderRepository.LinkOrderAsync(canLinkOrders.Select(x => new OrderLinkEntity
|
// 如果有不存在的单,需要抛异常
|
||||||
|
if (existedOrders.Count != noLinkOrderNos.Count)
|
||||||
|
{
|
||||||
|
throw new BusinessException(
|
||||||
|
message: $"关联单:{noLinkOrderNos.Except(existedOrders.Select(x => x.OrderNo)).JoinAsString(", ")}不存在");
|
||||||
|
}
|
||||||
|
|
||||||
|
await _orderRepository.LinkOrderAsync(existedOrders.Select(x => new OrderLinkEntity
|
||||||
{
|
{
|
||||||
OrderId = orderId,
|
OrderId = orderId,
|
||||||
OrderNo = input.OrderNo,
|
OrderNo = input.OrderNo,
|
||||||
@ -90,13 +94,14 @@ public partial class OrderService
|
|||||||
var tracks = await _trackDetailsRepository.GetListAsync(orderId);
|
var tracks = await _trackDetailsRepository.GetListAsync(orderId);
|
||||||
|
|
||||||
// 补轨迹
|
// 补轨迹
|
||||||
foreach (var group in canLinkOrders.GroupBy(x => x.SubSystemId))
|
foreach (var group in existedOrders.GroupBy(x => new {x.SubSystemId, x.CustomId}))
|
||||||
{
|
{
|
||||||
foreach (var track in tracks)
|
foreach (var track in tracks)
|
||||||
{
|
{
|
||||||
var fillTrackEvent = new TrackUpsertEvent
|
var fillTrackEvent = new TrackUpsertEvent
|
||||||
{
|
{
|
||||||
SubSystemId = group.Key,
|
SubSystemId = group.Key.SubSystemId,
|
||||||
|
CustomId = group.Key.CustomId,
|
||||||
OrderIdentifiers = group.Select(x => new OrderIdentifier
|
OrderIdentifiers = group.Select(x => new OrderIdentifier
|
||||||
{
|
{
|
||||||
OrderId = x.Id,
|
OrderId = x.Id,
|
||||||
|
|||||||
@ -27,9 +27,24 @@ public partial class TrackService
|
|||||||
|
|
||||||
var res = new List<GetTrackOutput>();
|
var res = new List<GetTrackOutput>();
|
||||||
input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空
|
input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空
|
||||||
|
|
||||||
// todo:没有映射上的轨迹要过滤掉
|
object[]? searchAfter = null;
|
||||||
var details = await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos);
|
List<TrackDetailsIndex> details = new();
|
||||||
|
int limit = 1000, cnt, time = 10;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
var (currentResults, nextSearchAfter) =
|
||||||
|
await _trackDetailsRepository.GetListAsync(input.OrderType, input.OrderNos, searchAfter, limit);
|
||||||
|
cnt = currentResults.Count;
|
||||||
|
details.AddRange(currentResults);
|
||||||
|
|
||||||
|
// 更新 searchAfter 以获取下一批数据
|
||||||
|
searchAfter = nextSearchAfter;
|
||||||
|
time--;
|
||||||
|
} while (cnt > 0 && time > 0);
|
||||||
|
|
||||||
|
if (details.Count == limit * time) throw new BusinessException(message: "查询轨迹量过大,请缩小查询范围");
|
||||||
|
|
||||||
foreach (var group in details.GroupBy(x => x.OrderId))
|
foreach (var group in details.GroupBy(x => x.OrderId))
|
||||||
{
|
{
|
||||||
@ -44,8 +59,12 @@ public partial class TrackService
|
|||||||
Content = x.TrackContent,
|
Content = x.TrackContent,
|
||||||
OriginContent = x.OriginTrackContent,
|
OriginContent = x.OriginTrackContent,
|
||||||
Location = x.TrackPlace,
|
Location = x.TrackPlace,
|
||||||
Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1 ? x.TrackTime: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8),
|
Time = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||||||
TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1? null: input.TimeZone ?? 8
|
? x.TrackTime
|
||||||
|
: x.ZeroTrackTime.AddHours(input.TimeZone ?? 8),
|
||||||
|
TimeZone = Math.Abs(x.TrackTimeZone - GlobalConst.NoneTrackTimeZone) < 1
|
||||||
|
? null
|
||||||
|
: input.TimeZone ?? 8
|
||||||
}).ToList();
|
}).ToList();
|
||||||
|
|
||||||
res.Add(item);
|
res.Add(item);
|
||||||
|
|||||||
@ -66,6 +66,7 @@ public partial class TrackService : ApplicationService, ITrackService
|
|||||||
// 新增/更新轨迹
|
// 新增/更新轨迹
|
||||||
var @event = ObjectMapper.Map<UpsertTrackInput, TrackUpsertEvent>(input);
|
var @event = ObjectMapper.Map<UpsertTrackInput, TrackUpsertEvent>(input);
|
||||||
@event.SubSystemId = order.SubSystemId;
|
@event.SubSystemId = order.SubSystemId;
|
||||||
|
@event.CustomId = order.CustomId;
|
||||||
@event.OrderIdentifiers = new[]
|
@event.OrderIdentifiers = new[]
|
||||||
{
|
{
|
||||||
new OrderIdentifier
|
new OrderIdentifier
|
||||||
|
|||||||
@ -8,6 +8,8 @@ public interface ITrackDetailsRepository
|
|||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetLatestListAsync(int[] eventOrderIds, List<string> trackCodes);
|
Task<List<TrackDetailsIndex>> GetLatestListAsync(int[] eventOrderIds, List<string> trackCodes);
|
||||||
|
|
||||||
|
Task<(List<TrackDetailsIndex> results, object[]? nextSearchAfter)> GetListAsync(int orderType, List<string> orderNos, object[]? searchAfter = null, int limit = 1000);
|
||||||
|
|
||||||
Task<bool> AnyAsync(int orderId, DateTime trackTime);
|
Task<bool> AnyAsync(int orderId, DateTime trackTime);
|
||||||
|
|
||||||
Task<bool> AnyAsync(int orderId, string originTrackDataHash);
|
Task<bool> AnyAsync(int orderId, string originTrackDataHash);
|
||||||
@ -20,8 +22,6 @@ public interface ITrackDetailsRepository
|
|||||||
|
|
||||||
Task AddAsync(TrackDetailsIndex track);
|
Task AddAsync(TrackDetailsIndex track);
|
||||||
|
|
||||||
Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos);
|
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
|||||||
@ -210,9 +210,9 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderType, List<string> orderNos)
|
public async Task<(List<TrackDetailsIndex> results, object[]? nextSearchAfter)> GetListAsync(int orderType, List<string> orderNos, object[]? searchAfter = null, int limit = 1000)
|
||||||
{
|
{
|
||||||
if (orderNos.Count < 1) return new List<TrackDetailsIndex>();
|
if (orderNos.Count < 1) return (new List<TrackDetailsIndex>(), null);
|
||||||
|
|
||||||
var r = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
var r = await Context.SearchAsync<TrackDetailsIndex>(x => x
|
||||||
.Source(s => s.Includes(fd => fd
|
.Source(s => s.Includes(fd => fd
|
||||||
@ -226,12 +226,26 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
.Field(f => f.TrackTimeZone)
|
.Field(f => f.TrackTimeZone)
|
||||||
))
|
))
|
||||||
.Query(q =>
|
.Query(q =>
|
||||||
q.Terms(t => t
|
q.Bool(b => b
|
||||||
.Field(f => f.OrderNo.Suffix("keyword"))
|
.Must(mu => mu
|
||||||
.Terms(orderNos))
|
.Terms(t => t
|
||||||
&& q.Term(f => f.OrderType, orderType)
|
.Field(f => f.OrderNo.Suffix("keyword"))
|
||||||
|
.Terms(orderNos)
|
||||||
|
),
|
||||||
|
mu => mu
|
||||||
|
.Term(f => f.OrderType, orderType)
|
||||||
|
)
|
||||||
|
.MustNot(mn => mn
|
||||||
|
.Term(t => t.TrackCode.Suffix("keyword"), GlobalConst.EmptyString)
|
||||||
|
)
|
||||||
|
)
|
||||||
)
|
)
|
||||||
.Size(1000)
|
.Sort(s => s
|
||||||
|
.Ascending(f => f.TrackTime) // 需要根据某个字段排序
|
||||||
|
.Ascending(f => f.OrderNo) // 可以添加更多排序字段以确保唯一性
|
||||||
|
)
|
||||||
|
.Size(limit)
|
||||||
|
.SearchAfter(searchAfter)
|
||||||
);
|
);
|
||||||
|
|
||||||
if (!r.IsValid)
|
if (!r.IsValid)
|
||||||
@ -239,7 +253,10 @@ internal class TrackDetailsRepository : ElasticSearchContextAbstract<TrackDetail
|
|||||||
throw new Exception($"轨迹查询异常,原因:{r.DebugInformation}。");
|
throw new Exception($"轨迹查询异常,原因:{r.DebugInformation}。");
|
||||||
}
|
}
|
||||||
|
|
||||||
return r.Documents.ToList();
|
var results = r.Documents.ToList();
|
||||||
|
var nextSearchAfter = r.Hits.LastOrDefault()?.Sorts.ToArray();
|
||||||
|
|
||||||
|
return (results, nextSearchAfter);
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
|
public async Task<List<TrackDetailsIndex>> GetListAsync(int orderId)
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user