From a7e303a77a382fa8b50a20e830c634e2fc33c991 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 31 Dec 2024 11:58:47 +0800 Subject: [PATCH 1/2] =?UTF-8?q?add-interface:=E5=A2=9E=E5=8A=A0=E8=BD=A8?= =?UTF-8?q?=E8=BF=B9=E6=9F=A5=E8=AF=A2=E6=8F=90=E4=BE=9B=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=88=E8=BF=94=E5=9B=9E=E5=8E=9F=E5=A7=8B=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=EF=BC=89QueryV2Async?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit update:更新轨迹删除广播方式,减少不必要的查库 update:添加轨迹查询的创建时间的二级排序(原只按轨迹发生时间) --- .../Dtos/ProvideServices/GetTrackInput.cs | 39 ++- .../Services/IBroadcastingService.cs | 14 +- .../Services/ProvideServices/ITrackService.cs | 9 + .../EventHandlers/TrackDeleteEventHandler.cs | 79 +++--- .../Broadcasting/BroadcastingService.cs | 16 ++ .../ProvideServices/TrackService.Query.cs | 230 +++++++++++++++++- .../Services/ProvideServices/TrackService.cs | 4 +- .../ITrackDetailsEsRepository.cs | 2 + .../Queries/ProvideQueries.cs | 13 +- .../Repositories/TrackDetailsEsRepository.cs | 10 +- 10 files changed, 346 insertions(+), 70 deletions(-) diff --git a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs index b36217c3..e2249ae1 100644 --- a/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs +++ b/src/SJZY.Track.Application.Contract/Dtos/ProvideServices/GetTrackInput.cs @@ -1,5 +1,8 @@ namespace SJZY.Track.Application.Contract.Dtos.ProvideServices; +/// +/// 支持模板,传入时区补正,按轨迹发生时间升序降序 +/// public class GetTrackInput : OrderNosInfo { private float? _timeZone; @@ -8,16 +11,28 @@ public class GetTrackInput : OrderNosInfo /// 时区 +8 +8.25 -8.5 -9 /// 不传默认+8 /// - public float? TimeZone - { - get => _timeZone ?? 8; - set => _timeZone = value; - } + public float? TimeZone { get => _timeZone ?? 8; set => _timeZone = value; } /// /// 排序方式,默认按轨迹发生时间降序 /// public SortMethod? SortMethod { get; set; } + + /// + /// 轨迹模板代码 + /// + public string? TrackTemplateCode { get; set; } +} + +/// +/// 不支持模板,无时区补正,按轨迹发生时间升序降序 +/// +public class GetTrackInputV2 : OrderNosInfo +{ + /// + /// 排序方式,默认按轨迹发生时间降序 + /// + public SortMethod? SortMethod { get; set; } } public enum SortMethod @@ -25,10 +40,20 @@ public enum SortMethod /// /// 按轨迹发生时间排序 /// - ByTrackTime, + ByTrackTime = 0, /// /// 按轨迹发生时间降序 /// - ByTrackTimeDesc, + ByTrackTimeDesc = 1, + + /// + /// 模板排序+轨迹发生时间 + /// + ByTemplateAndTrackTime = 2, + + /// + /// 模板排序+轨迹发生时间 + /// + ByTemplateAndTrackTimeDesc = 3 } diff --git a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs index 1b2fdbd9..0f79f83d 100644 --- a/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs +++ b/src/SJZY.Track.Application.Contract/Services/IBroadcastingService.cs @@ -4,10 +4,10 @@ using Volo.Abp.DependencyInjection; namespace SJZY.Track.Application.Contract.Services; -public interface IBroadcastingService :ITransientDependency +public interface IBroadcastingService : ITransientDependency { /// - /// 轨迹变更广播 + /// 轨迹变更广播(新增/修改) /// /// /// @@ -15,7 +15,15 @@ public interface IBroadcastingService :ITransientDependency void TrackChangePublicTopicAsync(TrackUpsertEvent eto, string subSystemCode, string trackStatusCode); /// - /// 轨迹推送完成广播 + /// 轨迹变更广播(删除) + /// + /// + /// + /// + void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode); + + /// + /// 轨迹推送完成广播(推送完成回调) /// /// void TrackPushCompletedPublicTopicAsync(TrackPushRecordDto log); diff --git a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs index c5fd0430..0921c05d 100644 --- a/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs +++ b/src/SJZY.Track.Application.Contract/Services/ProvideServices/ITrackService.cs @@ -35,8 +35,17 @@ public interface ITrackService : IRemoteService /// /// 根据订单号获取轨迹 + /// 支持模板,传入时区补正,按轨迹发生时间升序降序 /// /// /// Task>> QueryAsync(GetTrackInput input); + + /// + /// 根据订单号获取轨迹 + /// 不支持模板,无时区补正,可按轨迹发生时间升序降序 + /// + /// + /// + Task>> QueryV2Async(GetTrackInputV2 input); } diff --git a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs index 7d3c37bc..7568071b 100644 --- a/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs +++ b/src/SJZY.Track.Application/CAP/EventHandlers/TrackDeleteEventHandler.cs @@ -1,14 +1,11 @@ -using System.Text; -using BSI.Stack.Rabbit; using DotNetCore.CAP; using SJZY.Expand.ABP.Core.Logger; using SJZY.Expand.ABP.Core.PublicMethords; using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Application.Contract.Events; +using SJZY.Track.Application.Contract.Services; using SJZY.Track.Domain.Aggregates.OrderAggregate; -using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; -using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Enums; using SJZY.Track.Domain.Queries; using Volo.Abp.DependencyInjection; @@ -21,27 +18,21 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private readonly IOrderOperationRecordEsRepository _orderOperationRecordEsRepository; private readonly IOrderRepository _orderRepository; private readonly IProvideQueries _provideQueries; - private readonly RabbitClientBus _rabbitClientBus; - private readonly ITrackContentRepository _trackContentRepository; private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; - private readonly ITrackStatusRepository _trackStatusRepository; + private readonly IBroadcastingService _broadcastingService; public TrackDeleteEventHandler(IProvideQueries provideQueries, IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, - RabbitClientBus rabbitClientBus, - ITrackStatusRepository trackStatusRepository, - ITrackContentRepository trackContentRepository, - IOrderOperationRecordEsRepository orderOperationRecordEsRepository) + IOrderOperationRecordEsRepository orderOperationRecordEsRepository, + IBroadcastingService broadcastingService) { _provideQueries = provideQueries; _orderRepository = orderRepository; _capPublisher = capPublisher; _trackDetailsEsRepository = trackDetailsEsRepository; - _rabbitClientBus = rabbitClientBus; - _trackStatusRepository = trackStatusRepository; - _trackContentRepository = trackContentRepository; _orderOperationRecordEsRepository = orderOperationRecordEsRepository; + _broadcastingService = broadcastingService; } [CapSubscribe(GlobalConst.TrackDeleteSubscribe, Group = GlobalConst.TrackDeleteSubscribe)] @@ -51,8 +42,9 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe var trackList = await DeleteTrackAsync(@event); - //发布事件 - await PublicTrackTopicAsync(@event, trackList); + //当轨迹删除,根据轨迹标记/状态上IsToMq选择进行广播 + if (trackList.Count != 0) + await PublicTrackTopicAsync(@event, trackList); // 根据订单关联关系异步向下刷(异步) await DownByOrderLink(@event); @@ -128,48 +120,41 @@ public class TrackDeleteEventHandler : ITransientDependency, ICapSubscribe private async Task PublicTrackTopicAsync(TrackDeleteEvent eto, List trackList) { - // // todo: review 这里查库太多了 - if (trackList == null) - return; + var systemIds = trackList.Select(x => x.SubSystemId).Distinct().ToArray(); + var trackCodes = trackList.Select(x => x.TrackCode).Distinct().ToArray(); - var statusList = await _trackStatusRepository.GetListAsync(m => m.SubSystemId == eto.SubSystemId); - if (statusList == null) - return; + //从轨迹内容中查询出标记是否需要mq广播 + var contentList = await _provideQueries.GetTrackContentsAsync(systemIds, trackCodes); + var toMqDict = contentList + .ToDictionary(x => x.SubSystemId + x.TrackContentCode, y => y.IsToMq); - var contentList = await _trackContentRepository.GetTrackContentBySyetemIdAsync(eto.SubSystemId); - if (contentList == null) - return; + //选出需要广播的轨迹,并按code和订单号分组 + var trackGroup = trackList + .Where(x => toMqDict[x.SubSystemId + x.TrackCode]) + .GroupBy(m => new + { + m.TrackCode, + m.OrderNo + }) + .ToList(); + if (trackGroup.Count == 0) return; - foreach (var dataItem in trackList.GroupBy(m => new - { - m.TrackCode, - m.OrderNo - })) + foreach (var dataItem in trackGroup) { var item = dataItem.First(); - var status = statusList.FirstOrDefault(m => m.Code == item.TrackStatusCode); - if (status == null || !status.IsToMq) - continue; + var content = contentList.First(m => m.TrackContentCode == item.TrackCode); - var content = contentList.FirstOrDefault(m => m.TrackContentCode == item.TrackCode); - - var data = new TrackChangeEto() - { - OrderIdentifiers = dataItem.Select(m => new OrderIdentifier + _broadcastingService.TrackChangePublicTopicAsync(eto, + dataItem.Select(m => new OrderIdentifier { OrderId = m.OrderId, OrderNo = m.OrderNo, OrderType = m.OrderType }).ToArray(), - TrackStatusCode = item.TrackStatusCode, - TrackCode = item.TrackCode, - OperationMan = eto.OperationMan, - SubSystemId = eto.SubSystemId, - Option = 2 - }; - - _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{content.SubSystemCode}", - Encoding.UTF8.GetBytes(data.ToJson())); + item.TrackCode, + item.TrackStatusCode, + content.SubSystemCode + ); } } diff --git a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs index 1fc0f24a..9dfb2eb6 100644 --- a/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs +++ b/src/SJZY.Track.Application/Services/Broadcasting/BroadcastingService.cs @@ -65,6 +65,22 @@ public class BroadcastingService : IBroadcastingService Encoding.UTF8.GetBytes(data.ToJson())); } + public void TrackChangePublicTopicAsync(TrackDeleteEvent eto, OrderIdentifier[] orderIdentifiers, string trackCode, string trackStatusCode, string subSystemCode) + { + var data = new TrackChangeEto + { + OrderIdentifiers = orderIdentifiers, + TrackStatusCode = trackStatusCode, + TrackCode = trackCode, + OperationMan = eto.OperationMan, + SubSystemId = eto.SubSystemId, + Option = 2 + }; + + _rabbitClientBus.Publish(GlobalConst.TrackChangeExchange, $"TrackChange.{subSystemCode}", + Encoding.UTF8.GetBytes(data.ToJson())); + } + /// /// 轨迹推送完成广播 /// diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs index 6e36fae2..7e4376cf 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.Query.cs @@ -1,5 +1,7 @@ using SJZY.Track.Application.Contract.Dtos.ProvideServices; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; +using SJZY.Track.Domain.Dtos.TrackTemplate; namespace SJZY.Track.Application.Services.ProvideServices; @@ -9,6 +11,7 @@ namespace SJZY.Track.Application.Services.ProvideServices; public partial class TrackService { private readonly ITrackDetailsEsRepository _trackDetailsEsRepository; + private readonly ITrackTemplateRepository _trackTemplateRepository; /// /// 查询轨迹 @@ -63,13 +66,13 @@ public partial class TrackService ? null : input.TimeZone ?? 8, IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal, - IsVisibility = x.IsVisibility, + IsVisibility = x.IsVisibility, Source = x.Source, Remarks = x.Remarks, Files = x.Files?.Select(y => new FileItemDto { - FileName = y.FileName, - OssKey = y.OssKey + FileName = y.FileName, + OssKey = y.OssKey }).ToList(), TrackPlaceCity = x.TrackPlaceCity, TrackPlaceCityId = x.TrackPlaceCityId, @@ -87,25 +90,240 @@ public partial class TrackService } // 排序 - TracksOrdered(res, input); + var sortedList = await TracksOrdered(res, input); - return new UnifyResultDto>(true, res, "操作成功"); + return new UnifyResultDto>(true, sortedList, "操作成功"); } - private void TracksOrdered(List list, GetTrackInput input) + + [HttpPost("Track/QueryV2")] + public async Task>> QueryV2Async(GetTrackInputV2 input) + { + var res = new List(); + input.OrderNos = input.OrderNos.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToList(); // 单号去重、去空 + + var details = await _trackDetailsEsRepository.GetListAsync(input.SubSystemId, input.OrderType, input.OrderNos); + + // 是否对外 + var trackCodes = details.Select(x => x.TrackCode) + .Where(x => x != GlobalConst.EmptyString) + .Distinct() + .ToList(); + + var trackContentDic = new Dictionary(); + if (!trackCodes.IsNullOrEmpty()) + { + var trackContents = await _trackContentRepository.GetListAsync(x => + x.SubSystemId == input.SubSystemId && trackCodes.Contains(x.Code), + x => new + { + x.Code, + x.IsExternal + }); + trackContents.ForEach(x => trackContentDic.Add(x.Code, x.IsExternal)); + } + + foreach (var group in details.GroupBy(x => x.OrderId)) + { + var item = new GetTrackOutput(); + var trackDetails = group.ToList(); + item.OrderNo = trackDetails.First().OrderNo; + + item.TrackDetails = trackDetails.Select(x => new TrackDetail + { + Code = x.TrackCode, + Status = x.TrackStatus, + Content = x.TrackContent, + OriginContent = x.OriginTrackContent, + Location = x.TrackPlace, + Time = x.TrackTime, + TimeZone = x.TrackTimeZone, + IsDisplay = trackContentDic.TryGetValue(x.TrackCode, out var isExternal) && isExternal, + IsVisibility = x.IsVisibility, + Source = x.Source, + Remarks = x.Remarks, + Files = x.Files?.Select(y => new FileItemDto + { + FileName = y.FileName, + OssKey = y.OssKey + }).ToList(), + TrackPlaceCity = x.TrackPlaceCity, + TrackPlaceCityId = x.TrackPlaceCityId, + TrackPlaceProvince = x.TrackPlaceProvince, + TrackPlaceProvinceId = x.TrackPlaceProvinceId, + TrackPlaceNation = x.TrackPlaceNation, + TrackPlaceNationId = x.TrackPlaceNationId, + TrackPlacePostcode = x.TrackPlacePostcode, + DestinationTimeZone = x.DestinationTimeZone, + EstimatedDeliveryDate = x.EstimatedDeliveryDate, + Extra = x.Extra + }).ToList(); + + res.Add(item); + } + + // 排序 + var sortedList = await TracksOrdered(res, input); + + return new UnifyResultDto>(true, sortedList, "操作成功"); + } + + + private async Task> TracksOrdered(List list, GetTrackInput input) { switch (input.SortMethod) { case SortMethod.ByTrackTime: + case SortMethod.ByTemplateAndTrackTime: // tips:quick-sort 直接修改原list list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); break; case null: case SortMethod.ByTrackTimeDesc: + case SortMethod.ByTemplateAndTrackTimeDesc: list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); break; default: throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); } + + if (input.SortMethod != SortMethod.ByTemplateAndTrackTime + && input.SortMethod != SortMethod.ByTemplateAndTrackTimeDesc) + { + return list; + } + + //查出订单模板 + var templates = await _trackTemplateRepository.GetTrackTemplateListAsync(new GetTrackTemplateListInputVo + { + SubSystemId = input.SubSystemId, + TemplateCode = input.TrackTemplateCode + }); + + if (templates.Count == 0) + { + throw new BusinessException("轨迹模板不存在"); + } + + foreach (var getTrackOutput in list) + { + getTrackOutput.TrackDetails = SortByTemplate(getTrackOutput.TrackDetails, templates, input.SortMethod.Value); + } + + return list; + } + + + private async Task> TracksOrdered(List list, GetTrackInputV2 input) + { + switch (input.SortMethod) + { + case SortMethod.ByTrackTime: + case SortMethod.ByTemplateAndTrackTime: + // tips:quick-sort 直接修改原list + list.ForEach(item => item.TrackDetails.Sort((a, b) => a.Time.CompareTo(b.Time))); + break; + case null: + case SortMethod.ByTrackTimeDesc: + case SortMethod.ByTemplateAndTrackTimeDesc: + list.ForEach(item => item.TrackDetails.Sort((a, b) => b.Time.CompareTo(a.Time))); + break; + default: + throw new ArgumentOutOfRangeException(nameof(input.SortMethod), input.SortMethod, "不支持的排序方式"); + } + + return list; + } + + //按模板排序 + private static List SortByTemplate(List tracks, List templates, SortMethod sortMethod) + { + if (templates.Count == 0 || + tracks.Count == 0) + { + return new List(); + } + + var isAsc = sortMethod == SortMethod.ByTemplateAndTrackTime; + + var allTemplateCodes = new HashSet(); + + foreach (var template in templates) + { + tracks = Sort(tracks, template, isAsc, allTemplateCodes); + } + // tracks = templates.Aggregate(tracks, + // (current, template) => Sort(current, template, isAsc, allTemplateCodes)); + + return tracks; + } + + private static List Sort(List seq, TrackTemplateOutputVo template, bool isAsc = true, HashSet? allTemplateCodes = null) + { + if (template.TemplateContents.Count == 0) + { + return seq; + } + + // 创建一个字典,用于存储排序序列中元素的索引 + var sortDict = new Dictionary(); + template.TemplateContents.Sort((x, y) => x.Sort.CompareTo(y.Sort)); + var sortSeq = template.TemplateContents + .Select(x => seq.FirstOrDefault(y => y.Code == x.Code)) + .Where(x => x != null) + .ToList(); + for (var i = 0; i < sortSeq.Count; i++) + { + sortDict[sortSeq[i]!] = isAsc ? i : sortSeq.Count - i; + } + + // 将模板code添加到上下文集合中 + if (allTemplateCodes != null) + { + allTemplateCodes.UnionWith(template.TemplateContents.Select(x => x.Code)); + } + + // 根据排序序列和字典中的索引对序列进行排序 + // 使用稳定排序算法,如OrderBy,它保持相等元素的相对顺序 + var sorted = seq.OrderBy(item => sortDict.GetValueOrDefault(item, int.MaxValue)).ToList(); + + // 存在 + if (allTemplateCodes != null) + { + //查询到没有命中到模板的轨迹 + var noTipTemplateTracks = sorted.Where(x => !allTemplateCodes.Contains(x.Code)).ToList(); + + //查询未命中轨迹的索引字典 + var trackIdxDict = new Dictionary(); + var trackSortDict = new SortedDictionary(); + foreach (var track in noTipTemplateTracks) + { + trackIdxDict[track] = sorted.IndexOf(track); + trackSortDict[trackIdxDict[track]] = track; + } + + //没有命中的轨迹排序 + var noTipTemplateTrackSorted = (isAsc + ? noTipTemplateTracks.OrderBy(x => x.Time) + : noTipTemplateTracks.OrderByDescending(x => x.Time)) + .ToList(); + + for (var i = 0; i < trackSortDict.Count; i++) + { + //在序列中的实际位置 + var (idx, st) = trackSortDict.ElementAt(0); + //在这个位置它应该是哪个轨迹 + var track = noTipTemplateTrackSorted[0]; + //交换位置 + if (track != st) + { + var idx2 = trackIdxDict[track]; + sorted[idx2] = st; + sorted[idx] = track; + } + } + } + + return sorted; } } diff --git a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs index 83b36226..f20c415e 100644 --- a/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs +++ b/src/SJZY.Track.Application/Services/ProvideServices/TrackService.cs @@ -5,6 +5,7 @@ using SJZY.Track.Application.Contract.Services.ProvideServices; using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; using SJZY.Track.Domain.Aggregates.TrackDetailsAggregate; +using SJZY.Track.Domain.Aggregates.TrackTemplateAggregate; using SJZY.Track.Domain.Enums; using SJZY.UserCenter.HttpApi.Services; using SJZY.UserCenter.HttpApi.Services.User; @@ -26,12 +27,13 @@ public partial class TrackService : ApplicationService, ITrackService public TrackService(IOrderRepository orderRepository, ICapPublisher capPublisher, ITrackDetailsEsRepository trackDetailsEsRepository, ITrackContentRepository trackContentRepository, - IHttpClientProxy requestCurrentUserService) + IHttpClientProxy requestCurrentUserService, ITrackTemplateRepository trackTemplateRepository) { _orderRepository = orderRepository; _capPublisher = capPublisher; _trackContentRepository = trackContentRepository; _requestCurrentUserService = requestCurrentUserService; + _trackTemplateRepository = trackTemplateRepository; _trackDetailsEsRepository = trackDetailsEsRepository; } diff --git a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs index ebb18d38..b434e8b6 100644 --- a/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Domain/Aggregates/TrackDetailsAggregate/ITrackDetailsEsRepository.cs @@ -31,6 +31,8 @@ public interface ITrackDetailsEsRepository : IElasticsearchClientService> DeleteTrackAsync(int[] orderIds, List trackCodes); Task DeleteTrackByIdAsync(string id, string indexName); + Task> GetDataByIds(string[] ids); + Task GetDetailAsync(string orderNo, string trackCode, int orderType, int subSystemId, DateTime trackTime); } diff --git a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs index d60f5cf0..3dc93cee 100644 --- a/src/SJZY.Track.Repository/Queries/ProvideQueries.cs +++ b/src/SJZY.Track.Repository/Queries/ProvideQueries.cs @@ -1,5 +1,6 @@ using SJZY.Track.Domain.Aggregates.OrderAggregate; using SJZY.Track.Domain.Aggregates.TrackContentAggregate; +using SJZY.Track.Domain.Aggregates.TrackFlagAggregate; using SJZY.Track.Domain.Aggregates.TrackPullAggregate; using SJZY.Track.Domain.Aggregates.TrackStatusAggregate; using SJZY.Track.Domain.Dtos.Order; @@ -99,20 +100,22 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen return await Context.Queryable() .LeftJoin((x, y) => x.TrackStatusId == y.Id) .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .LeftJoin((x, y, z, k) => x.SubSystemId == k.SubSystemId && k.Code == x.Code) .Where(x => x.SubSystemId == subSystemId && x.Code == trackCode) - .Select((x, y, z) => new TrackContentVO + .Select((x, y, z, k) => new TrackContentVO { SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, TrackStatusCode = y.Code, + TrackContentCode = x.Code, TrackContent = x.Content, TrackEnContent = x.EnContent, IsCompleted = y.IsCompleted, IsRepeatable = x.IsRepeatable, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, IsAllowManuallyCreate = x.IsAllowManuallyCreate, - IsToMq = y.IsToMq, + IsToMq = y.IsToMq || k.IsToMq, }) .FirstAsync(); } @@ -122,21 +125,23 @@ public class ProvideQueries : ISugarRepository, IProvideQueries, ITransientDepen return await Context.Queryable() .LeftJoin((x, y) => x.TrackStatusId == y.Id) .LeftJoin((x, y, z) => x.SubSystemId == z.Id) + .LeftJoin((x, y, z, k) => x.SubSystemId == k.SubSystemId && k.Code == x.Code) .Where(x => subSystemIds.Contains(x.SubSystemId) && trackCodes.Contains(x.Code)) - .Select((x, y, z) => new TrackContentVO + .Select((x, y, z, k) => new TrackContentVO { SubSystemId = x.SubSystemId, SubSystemCode = z.Key, TrackStatusId = x.TrackStatusId, TrackStatus = y.Status, TrackStatusCode = y.Code, + TrackContentCode = x.Code, TrackContent = x.Content, TrackEnContent = x.EnContent, IsCompleted = y.IsCompleted, IsRepeatable = x.IsRepeatable, IsAllowManuallyUpdate = x.IsAllowManuallyUpdate, IsAllowManuallyCreate = x.IsAllowManuallyCreate, - IsToMq = y.IsToMq, + IsToMq = y.IsToMq || k.IsToMq, }) .ToListAsync(); } diff --git a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs index 80398584..d7e28fbe 100644 --- a/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs +++ b/src/SJZY.Track.Repository/Repositories/TrackDetailsEsRepository.cs @@ -430,7 +430,10 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract t.OrderId, orderId) ) .Size(SafelyLimit) - .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); + .Sort(s => s + .Field(f => f.ZeroTrackTime, SortOrder.Descending) + .Field(f => f.CreateTime, SortOrder.Descending) + )); if (!r.IsValid) { @@ -463,7 +466,10 @@ public class TrackDetailsEsRepository : ElasticSearchContextAbstract query) .Size(SafelyLimit) - .Sort(s => s.Field(f => f.ZeroTrackTime, SortOrder.Descending))); + .Sort(s => s + .Field(f => f.ZeroTrackTime, SortOrder.Descending) + .Field(f => f.CreateTime, SortOrder.Descending)) + ); if (!r.IsValid) { From cc91079011eae294e66754f9aa66e509c9ae7f64 Mon Sep 17 00:00:00 2001 From: hardstylewyl <827778732@qq.com> Date: Tue, 31 Dec 2024 14:04:19 +0800 Subject: [PATCH 2/2] =?UTF-8?q?update-package:=E6=9B=B4=E6=96=B0=E8=A7=84?= =?UTF-8?q?=E7=BA=A6=E5=8C=85=E7=89=88=E6=9C=AC7.0.10=20->=207.0.11?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SJZY.Track.Application.Contract.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj index a1a6ebf2..e9cb325e 100644 --- a/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj +++ b/src/SJZY.Track.Application.Contract/SJZY.Track.Application.Contract.csproj @@ -5,7 +5,7 @@ net7.0 True - 7.0.10 + 7.0.11 True