diff --git a/src/Oms.Application/Dtos/Channels/KpiAreaInfoListInput.cs b/src/Oms.Application/Dtos/Channels/KpiAreaInfoListInput.cs index 6f9152c..b073063 100644 --- a/src/Oms.Application/Dtos/Channels/KpiAreaInfoListInput.cs +++ b/src/Oms.Application/Dtos/Channels/KpiAreaInfoListInput.cs @@ -54,4 +54,14 @@ public class KpiAreaInfoListInput /// 截止邮编(模糊)。 /// public string? RightPostcode { get; set; } + + /// + /// 排序字段:leftPostcode / rightPostcode;空则按 Id 降序。 + /// + public string? SortField { get; set; } + + /// + /// 排序方向:asc / desc。 + /// + public string? SortOrder { get; set; } } diff --git a/src/Oms.Application/Services/Channels/KpiAreaService.cs b/src/Oms.Application/Services/Channels/KpiAreaService.cs index 6ec6e34..b7eb21b 100644 --- a/src/Oms.Application/Services/Channels/KpiAreaService.cs +++ b/src/Oms.Application/Services/Channels/KpiAreaService.cs @@ -116,6 +116,12 @@ public class KpiAreaService : ApplicationService }; } + private static readonly HashSet InfoSortFieldWhitelist = new(StringComparer.OrdinalIgnoreCase) + { + "leftPostcode", + "rightPostcode", + }; + private static KpiAreaInfoQueryFilter BuildInfoQueryFilter(KpiAreaInfoListInput input) => new() { @@ -125,9 +131,38 @@ public class KpiAreaService : ApplicationService Province = input.Province, City = input.City, LeftPostcode = input.LeftPostcode, - RightPostcode = input.RightPostcode + RightPostcode = input.RightPostcode, + SortField = NormalizeInfoSortField(input.SortField), + SortOrder = NormalizeInfoSortOrder(input.SortOrder), }; + private static string? NormalizeInfoSortField(string? sortField) + { + var field = sortField?.Trim(); + if (string.IsNullOrWhiteSpace(field) || !InfoSortFieldWhitelist.Contains(field)) + { + return null; + } + + return field; + } + + private static string? NormalizeInfoSortOrder(string? sortOrder) + { + var order = sortOrder?.Trim(); + if (string.Equals(order, "asc", StringComparison.OrdinalIgnoreCase)) + { + return "asc"; + } + + if (string.Equals(order, "desc", StringComparison.OrdinalIgnoreCase)) + { + return "desc"; + } + + return null; + } + /// /// 新增KPI分区明细。 /// diff --git a/src/Oms.Domain/ChannelsAggregate/Repositories/IKpiAreaRepository.cs b/src/Oms.Domain/ChannelsAggregate/Repositories/IKpiAreaRepository.cs index 183980d..aa5de53 100644 --- a/src/Oms.Domain/ChannelsAggregate/Repositories/IKpiAreaRepository.cs +++ b/src/Oms.Domain/ChannelsAggregate/Repositories/IKpiAreaRepository.cs @@ -15,6 +15,12 @@ public class KpiAreaInfoQueryFilter public string? City { get; set; } public string? LeftPostcode { get; set; } public string? RightPostcode { get; set; } + + /// 排序字段:leftPostcode / rightPostcode。 + public string? SortField { get; set; } + + /// 排序方向:asc / desc。 + public string? SortOrder { get; set; } } public interface IKpiAreaRepository : IRepository, IKpiAreaPublishRepository diff --git a/src/Oms.SqlSugarCore/Channels/KpiAreaRepository.cs b/src/Oms.SqlSugarCore/Channels/KpiAreaRepository.cs index 057a9dd..5466625 100644 --- a/src/Oms.SqlSugarCore/Channels/KpiAreaRepository.cs +++ b/src/Oms.SqlSugarCore/Channels/KpiAreaRepository.cs @@ -26,9 +26,8 @@ public class KpiAreaRepository : OmsSqlSugarRepository, IKpiAreaReposit CancellationToken cancellationToken = default) { var db = await GetDbContextAsync(cancellationToken); - // 依赖 idx_kpi_info_area_id (AreaId, Id),避免大分区 filesort - return await BuildInfoQueryable(db, areaId, filter) - .OrderBy(x => x.Id, OrderByType.Desc) + // 默认按 Id 降序,可走 idx_kpi_info_area_id;邮编排序可能 filesort,分区过大时注意性能 + return await ApplyInfoOrder(BuildInfoQueryable(db, areaId, filter), filter) .ToPageListAsync(pageIndex, pageSize, cancellationToken); } @@ -99,6 +98,26 @@ public class KpiAreaRepository : OmsSqlSugarRepository, IKpiAreaReposit return query; } + private static ISugarQueryable ApplyInfoOrder( + ISugarQueryable query, + KpiAreaInfoQueryFilter? filter) + { + var field = filter?.SortField?.Trim().ToLowerInvariant(); + var asc = string.Equals(filter?.SortOrder?.Trim(), "asc", StringComparison.OrdinalIgnoreCase); + var order = asc ? OrderByType.Asc : OrderByType.Desc; + + return field switch + { + "leftpostcode" => query + .OrderBy(x => x.LeftPostcode, order) + .OrderBy(x => x.Id, OrderByType.Desc), + "rightpostcode" => query + .OrderBy(x => x.RightPostcode, order) + .OrderBy(x => x.Id, OrderByType.Desc), + _ => query.OrderBy(x => x.Id, OrderByType.Desc), + }; + } + private static string? TrimOrNull(string? value) { var trimmed = value?.Trim();