From 0349681275c12573f3e2091f1a2b2ada0d729b63 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=B5=87=E6=96=87=E9=BE=99?= <mcc890916@hotmail.com>
Date: Fri, 30 Aug 2024 15:54:22 +0800
Subject: [PATCH] =?UTF-8?q?=E5=BE=85=E5=AE=A1=E6=A0=B8=E8=B4=B9=E7=94=A8?=
 =?UTF-8?q?=E6=9F=A5=E8=AF=A2=E7=BB=93=E6=9E=9C=E7=BB=84=E8=A3=85=E6=88=90?=
 =?UTF-8?q?=E6=8C=89=E8=B4=B9=E7=94=A8=E5=88=86=E7=BB=84=E7=9A=84=E7=BB=93?=
 =?UTF-8?q?=E6=9E=84?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../Extensions/QueryableExtensions.cs         | 74 +++++++++++++++----
 .../DS.WMS.Core/Fee/Dtos/FeeAudit.cs          |  4 +-
 .../DS.WMS.Core/Fee/Method/FeeAuditService.cs | 20 ++---
 .../Fee/Method/FeeRecordService.cs            |  2 +-
 4 files changed, 73 insertions(+), 27 deletions(-)

diff --git a/ds-wms-service/DS.Module.Core/Extensions/QueryableExtensions.cs b/ds-wms-service/DS.Module.Core/Extensions/QueryableExtensions.cs
index 2124dec9..83a3e599 100644
--- a/ds-wms-service/DS.Module.Core/Extensions/QueryableExtensions.cs
+++ b/ds-wms-service/DS.Module.Core/Extensions/QueryableExtensions.cs
@@ -1,4 +1,6 @@
-using System.ComponentModel;
+using System.Collections.Concurrent;
+using System.ComponentModel;
+using System.Reflection;
 using DS.Module.Core.Data;
 using Newtonsoft.Json;
 using SqlSugar;
@@ -7,6 +9,36 @@ namespace DS.Module.Core.Extensions;
 
 public static partial class Extensions
 {
+    static readonly ConcurrentDictionary<Type, string[]> OrderFieldCache = [];
+
+    internal static List<OrderByModel> GetOrderFields<T>(OrderByType orderByType = OrderByType.Desc)
+    {
+        Type type = typeof(T);
+        if (!OrderFieldCache.TryGetValue(type, out string[]? fields))
+        {
+            List<string> list = new List<string>(2);
+            var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance);
+
+            //查找ID或创建时间,暂时只设置一个默认排序字段
+            var propId = Array.Find(properties, x => x.Name == "Id");
+            if (propId != null)
+            {
+                list.Add(propId.Name);
+            }
+            else
+            {
+                var propCT = Array.Find(properties, x => x.Name == "CreateTime");
+                if (propCT != null)
+                    list.Add(propCT.Name);
+            }
+
+            fields = [.. list];
+            OrderFieldCache.AddOrUpdate(type, fields, (k, v) => v = fields);
+        }
+
+        return fields.Select(x => new OrderByModel { FieldName = x, OrderByType = orderByType }).ToList();
+    }
+
     /// <summary>
     /// 多排序方法
     /// </summary>
@@ -40,8 +72,8 @@ public static partial class Extensions
     public static DataResult<List<TEntity>> ToQueryPage<TEntity>(this ISugarQueryable<TEntity> source,
         PageCondition page)
     {
-        page.NotNull(nameof(page)); 
-        var result = page.IsExport? source.WhereNoPage(page.SortConditions) : source.Where(page.PageIndex, page.PageSize, page.SortConditions);
+        page.NotNull(nameof(page));
+        var result = page.IsExport ? source.WhereNoPage(page.SortConditions) : source.Where(page.PageIndex, page.PageSize, page.SortConditions);
         var list = result.data;
         var total = result.totalNumber;
         return DataResult<List<TEntity>>.PageList(total, list, MultiLanguageConst.DataQuerySuccess);
@@ -78,9 +110,9 @@ public static partial class Extensions
         if (source.Count() == 0)
         {
             //return new Exception("没有数据操作权限!");
-              Check.ExceptionEasy("NO Operation", "没有数据操作权限!");
+            Check.ExceptionEasy("NO Operation", "没有数据操作权限!");
         }
-        return source; 
+        return source;
     }
 
     /// <summary>
@@ -101,9 +133,11 @@ public static partial class Extensions
         ISugarQueryable<TEntity> orderSource;
         if (orderConditions == null || orderConditions.Length == 0)
         {
-            // orderSource = source.OrderBy("Id ascending");
-            orderSource = source.OrderBy("CreateTime desc");
-            // orderSource = source.OrderBy("GID");
+            orderSource = source;
+
+            var orderFields = GetOrderFields<TEntity>();
+            if (orderFields?.Count > 0)
+                orderSource = source.OrderBy(orderFields);
         }
         else
         {
@@ -117,15 +151,18 @@ public static partial class Extensions
                 ? source.ToPageList(pageIndex, pageSize, ref total)
                 : Enumerable.Empty<TEntity>().ToList(), total);
     }
-    private static (List<TEntity> data, int totalNumber) WhereNoPage<TEntity>(this ISugarQueryable<TEntity> source,SortCondition[] orderConditions)
+    private static (List<TEntity> data, int totalNumber) WhereNoPage<TEntity>(this ISugarQueryable<TEntity> source, SortCondition[] orderConditions)
     {
         var total = source.Count();
 
         ISugarQueryable<TEntity> orderSource;
         if (orderConditions == null || orderConditions.Length == 0)
         {
-            //orderSource = source.OrderBy("Id"); 
-            orderSource = source.OrderBy("CreateTime desc");
+            orderSource = source;
+
+            var orderFields = GetOrderFields<TEntity>();
+            if (orderFields?.Count > 0)
+                orderSource = source.OrderBy(orderFields);
         }
         else
         {
@@ -138,15 +175,18 @@ public static partial class Extensions
             source.Count() != 0
                 ? source.ToList()
                 : Enumerable.Empty<TEntity>().ToList(), total);
-    } 
+    }
     private static async Task<Tuple<List<TEntity>, int>> WhereAsync<TEntity>(this ISugarQueryable<TEntity> source,
         int pageIndex, int pageSize, SortCondition[] orderConditions)
     {
         ISugarQueryable<TEntity> orderSource;
         if (orderConditions == null || orderConditions.Length == 0)
         {
-            //orderSource = source.OrderBy("Id");
-            orderSource = source.OrderBy("CreateTime desc"); 
+            orderSource = source;
+
+            var orderFields = GetOrderFields<TEntity>();
+            if (orderFields?.Count > 0)
+                orderSource = source.OrderBy(orderFields);
         }
         else
         {
@@ -165,7 +205,11 @@ public static partial class Extensions
         ISugarQueryable<TEntity> orderSource;
         if (orderConditions == null || orderConditions.Length == 0)
         {
-            orderSource = source.OrderBy("CreateTime desc");
+            orderSource = source;
+
+            var orderFields = GetOrderFields<TEntity>();
+            if (orderFields?.Count > 0)
+                orderSource = source.OrderBy(orderFields);
         }
         else
         {
diff --git a/ds-wms-service/DS.WMS.Core/Fee/Dtos/FeeAudit.cs b/ds-wms-service/DS.WMS.Core/Fee/Dtos/FeeAudit.cs
index 32d39c04..8ee44672 100644
--- a/ds-wms-service/DS.WMS.Core/Fee/Dtos/FeeAudit.cs
+++ b/ds-wms-service/DS.WMS.Core/Fee/Dtos/FeeAudit.cs
@@ -1,4 +1,5 @@
-using DS.Module.Core;
+using System.Diagnostics;
+using DS.Module.Core;
 using DS.WMS.Core.Op.Entity;
 using Masuit.Tools.Systems;
 
@@ -440,6 +441,7 @@ namespace DS.WMS.Core.Fee.Dtos
     /// <summary>
     /// 待审核费用项
     /// </summary>
+    [DebuggerDisplay("FeeType={FeeType}, FeeName={FeeName}")]
     public class AuditItem
     {
         /// <summary>
diff --git a/ds-wms-service/DS.WMS.Core/Fee/Method/FeeAuditService.cs b/ds-wms-service/DS.WMS.Core/Fee/Method/FeeAuditService.cs
index cbc9c94c..238f19ce 100644
--- a/ds-wms-service/DS.WMS.Core/Fee/Method/FeeAuditService.cs
+++ b/ds-wms-service/DS.WMS.Core/Fee/Method/FeeAuditService.cs
@@ -13,6 +13,7 @@ using DS.WMS.Core.Sys.Entity;
 using Mapster;
 using Microsoft.Extensions.DependencyInjection;
 using SqlSugar;
+using static AnyDiff.DifferenceLines;
 
 namespace DS.WMS.Core.Fee.Method
 {
@@ -421,11 +422,11 @@ namespace DS.WMS.Core.Fee.Method
 
                 //将查询结果组装成按费用分组的结构
                 pendingAudit.ItemGroups = [];
-                foreach (var item in list)
+                for (int i = 0; i < list.Count; i++)
                 {
-                    AuditItemGroup? group;
-                    var groups = pendingAudit.ItemGroups.FindAll(x => x.FeeName == item.FeeName);
-                    if (groups.Count == 0)
+                    var item = list[i];
+                    AuditItemGroup? group = pendingAudit.ItemGroups.Find(x => x.FeeName == item.FeeName && x.Items?.Count < 2);
+                    if (group == null)
                     {
                         group = new AuditItemGroup
                         {
@@ -437,12 +438,7 @@ namespace DS.WMS.Core.Fee.Method
                         continue;
                     }
 
-                    group = groups.Find(x => x.Items != null && x.Items.Count(y => y.FeeType == item.FeeType) == 1);
-                    if (group != null)
-                    {
-                        group.Items.Add(item);
-                    }
-                    else
+                    if (group.Items.Exists(x => x.FeeType == item.FeeType))
                     {
                         group = new AuditItemGroup
                         {
@@ -451,6 +447,10 @@ namespace DS.WMS.Core.Fee.Method
                         };
                         pendingAudit.ItemGroups.Add(group);
                     }
+                    else
+                    {
+                        group.Items.Add(item);
+                    }
                 }
             }
 
diff --git a/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs b/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs
index a4cee310..16db8832 100644
--- a/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs
+++ b/ds-wms-service/DS.WMS.Core/Fee/Method/FeeRecordService.cs
@@ -478,7 +478,7 @@ namespace DS.WMS.Core.Fee.Method
             if (sb.Length > 0)
                 return DataResult.Failed(sb.ToString(), MultiLanguageConst.Operation_Failed);
 
-            var template = await FindTemplateAsync(TaskBaseTypeEnum.FEE_MODIFY_AUDIT);
+            var template = await FindTemplateAsync(TaskBaseTypeEnum.FEE_AUDIT);
             if (template == null)
                 return DataResult.FailedWithDesc(nameof(MultiLanguageConst.TemplateNotFound));