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();