From 6808e68b5d97cdb39aac1793e7fe30dfbecd7de2 Mon Sep 17 00:00:00 2001
From: sunpengfei <i@angelzzz.com>
Date: 星期五, 01 八月 2025 17:31:28 +0800
Subject: [PATCH] feat:文档优化结果显示

---
 FlexJobApi.User.Application/FlexJobApi.User.Application.xml                 |   33 +++
 FlexJobApi.Core/Models/User/Menus/Commands/MenuDeleteCommand.cs             |   22 ++
 FlexJobApi.Core/Models/User/Menus/Queries/MenuListQuery.cs                  |    0 
 FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs               |   24 +++
 FlexJobApi.Core/Models/User/Menus/Commands/MenuImportFieldCommand.cs        |   20 ++
 FlexJobApi.User.Application/Menus/Queries/MenuSubListQueryHandler.cs        |   43 +++++
 FlexJobApi.User.Application/Menus/Commands/MenuImportFieldCommandHandler.cs |   12 +
 FlexJobApi.Core/FlexJobApi.Core.xml                                         |  147 +++++++++++++++++-
 FlexJobApi.User.Application/Menus/MenuAppService.cs                         |   11 +
 FlexJobApi.Core/Entities/Users/Menu.cs                                      |    5 
 FlexJobApi.Core/Models/User/Menus/Commands/MenuSaveCommand.cs               |    5 
 FlexJobApi.Core/Models/User/Menus/Queries/MenuSubListQuery.cs               |  144 ++++++++++++++++++
 12 files changed, 452 insertions(+), 14 deletions(-)

diff --git a/FlexJobApi.Core/Entities/Users/Menu.cs b/FlexJobApi.Core/Entities/Users/Menu.cs
index cb18619..99e8876 100644
--- a/FlexJobApi.Core/Entities/Users/Menu.cs
+++ b/FlexJobApi.Core/Entities/Users/Menu.cs
@@ -79,6 +79,11 @@
         public string Group { get; set; }
 
         /// <summary>
+        /// 浣嶇疆锛堢敤浜庢寜閽級
+        /// </summary>
+        public string Location { get; set; }
+
+        /// <summary>
         /// 鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
         /// </summary>
         public string Width { get; set; }
diff --git a/FlexJobApi.Core/FlexJobApi.Core.xml b/FlexJobApi.Core/FlexJobApi.Core.xml
index 66d9d3e..2eef7e8 100644
--- a/FlexJobApi.Core/FlexJobApi.Core.xml
+++ b/FlexJobApi.Core/FlexJobApi.Core.xml
@@ -864,6 +864,11 @@
             鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.Menu.Location">
+            <summary>
+            浣嶇疆锛堢敤浜庢寜閽級
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.Menu.Width">
             <summary>
             鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
@@ -1694,7 +1699,7 @@
             妯℃�佹
             </summary>
         </member>
-        <member name="F:FlexJobApi.Core.EnumMenuType.Buuton">
+        <member name="F:FlexJobApi.Core.EnumMenuType.Button">
             <summary>
             鎸夐挳
             </summary>
@@ -1909,6 +1914,131 @@
             瀵嗙爜鐧诲綍缁撴灉
             </summary>
         </member>
+        <member name="T:FlexJobApi.Core.MenuDeleteCommand">
+            <summary>
+            鍒犻櫎鑿滃崟
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.Models.MenuImportFieldCommand">
+            <summary>
+            鑿滃崟瀵煎叆瀛楁
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuImportFieldCommand.Url">
+            <summary>
+            鎺ュ彛鍦板潃
+            </summary>
+        </member>
+        <member name="T:FlexJobApi.Core.Models.MenuSubListQuery">
+            <summary>
+            鏌ヨ鎸夐挳/瀛楁鍒楄〃
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListQuery.ParentId">
+            <summary>
+            涓婄骇Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackGroup.Name">
+            <summary>
+            鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackGroup.Buttons">
+            <summary>
+            鎸夐挳
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackGroup.Fields">
+            <summary>
+            瀛楁
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Id">
+            <summary>
+            Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.ParentId">
+            <summary>
+            涓婄骇Id
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Path">
+            <summary>
+            鑿滃崟璺緞
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Code">
+            <summary>
+            缂栧彿
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Name">
+            <summary>
+            鍚嶇О
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Type">
+            <summary>
+            绫诲瀷
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.VisitLevel">
+            <summary>
+            璁块棶绾у埆
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Icon">
+            <summary>
+            鍥炬爣
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Url">
+            <summary>
+            閾炬帴鍦板潃
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Group">
+            <summary>
+            鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Location">
+            <summary>
+            浣嶇疆锛堢敤浜庢寜閽級
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Width">
+            <summary>
+            鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.IsDisabled">
+            <summary>
+            鏄惁绂佺敤
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.IsHidden">
+            <summary>
+            鏄惁闅愯棌
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.IsCache">
+            <summary>
+            鏄惁缂撳瓨
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Sort">
+            <summary>
+            鎺掑簭
+            </summary>
+        </member>
+        <member name="P:FlexJobApi.Core.Models.MenuSubListCallbackItem.Remark">
+            <summary>
+            澶囨敞
+            </summary>
+        </member>
         <member name="T:FlexJobApi.Core.MenuSaveCommand">
             <summary>
             淇濆瓨鑿滃崟
@@ -1959,6 +2089,11 @@
             鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�
             </summary>
         </member>
+        <member name="P:FlexJobApi.Core.MenuSaveCommand.Location">
+            <summary>
+            浣嶇疆锛堢敤浜庢寜閽級
+            </summary>
+        </member>
         <member name="P:FlexJobApi.Core.MenuSaveCommand.Width">
             <summary>
             鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
@@ -1994,11 +2129,6 @@
             鏌ヨ鎵�鏈夎彍鍗�
             </summary>
         </member>
-        <member name="P:FlexJobApi.Core.MenuListQuery.Types">
-            <summary>
-            绫诲瀷
-            </summary>
-        </member>
         <member name="P:FlexJobApi.Core.MenuListQuery.ParentId">
             <summary>
             涓婄骇Id
@@ -2027,11 +2157,6 @@
         <member name="P:FlexJobApi.Core.MenuListCallbackItem.ParentId">
             <summary>
             涓婄骇Id
-            </summary>
-        </member>
-        <member name="P:FlexJobApi.Core.MenuListCallbackItem.Childrens">
-            <summary>
-            涓嬬骇
             </summary>
         </member>
         <member name="P:FlexJobApi.Core.MenuListCallbackItem.Path">
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/MenuDeleteCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/MenuDeleteCommand.cs
new file mode 100644
index 0000000..c74c2cf
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/MenuDeleteCommand.cs
@@ -0,0 +1,22 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core
+{
+    /// <summary>
+    /// 鍒犻櫎鑿滃崟
+    /// </summary>
+    public class MenuDeleteCommand : IRequest
+    {
+        public MenuDeleteCommand()
+        {
+            Ids = [];
+        }
+
+        public List<Guid> Ids { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/MenuImportFieldCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/MenuImportFieldCommand.cs
new file mode 100644
index 0000000..0a68638
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/MenuImportFieldCommand.cs
@@ -0,0 +1,20 @@
+锘縰sing MediatR;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core.Models
+{
+    /// <summary>
+    /// 鑿滃崟瀵煎叆瀛楁
+    /// </summary>
+    public class MenuImportFieldCommand : IRequest
+    {
+        /// <summary>
+        /// 鎺ュ彛鍦板潃
+        /// </summary>
+        public string Url { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Models/User/Menus/Commands/MenuSaveCommand.cs b/FlexJobApi.Core/Models/User/Menus/Commands/MenuSaveCommand.cs
index a5987dd..cd0dbb7 100644
--- a/FlexJobApi.Core/Models/User/Menus/Commands/MenuSaveCommand.cs
+++ b/FlexJobApi.Core/Models/User/Menus/Commands/MenuSaveCommand.cs
@@ -62,6 +62,11 @@
         public string Group { get; set; }
 
         /// <summary>
+        /// 浣嶇疆锛堢敤浜庢寜閽級
+        /// </summary>
+        public string Location { get; set; }
+
+        /// <summary>
         /// 鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
         /// </summary>
         public string Width { get; set; }
diff --git a/FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs b/FlexJobApi.Core/Models/User/Menus/Queries/MenuListQuery.cs
similarity index 100%
rename from FlexJobApi.Core/Models/User/Menus/Queries/MenuAllQuery.cs
rename to FlexJobApi.Core/Models/User/Menus/Queries/MenuListQuery.cs
diff --git a/FlexJobApi.Core/Models/User/Menus/Queries/MenuSubListQuery.cs b/FlexJobApi.Core/Models/User/Menus/Queries/MenuSubListQuery.cs
new file mode 100644
index 0000000..9697ba4
--- /dev/null
+++ b/FlexJobApi.Core/Models/User/Menus/Queries/MenuSubListQuery.cs
@@ -0,0 +1,144 @@
+锘縰sing MediatR;
+using Swashbuckle.AspNetCore.SwaggerGen;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.Core.Models
+{
+    /// <summary>
+    /// 鏌ヨ鎸夐挳/瀛楁鍒楄〃
+    /// </summary>
+    public class MenuSubListQuery : IRequest<MenuSubListCallback>
+    {
+        /// <summary>
+        /// 涓婄骇Id
+        /// </summary>
+        public Guid ParentId { get; set; }
+    }
+
+    public class MenuSubListCallback
+    {
+        public MenuSubListCallback()
+        {
+            Groups = [];
+        }
+
+        public List<MenuSubListCallbackGroup> Groups { get; set; }
+    }
+
+    public class MenuSubListCallbackGroup
+    {
+        public MenuSubListCallbackGroup()
+        {
+            Buttons = [];
+            Fields = [];
+        }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 鎸夐挳
+        /// </summary>
+        public List<MenuSubListCallbackItem> Buttons { get; set; }
+
+        /// <summary>
+        /// 瀛楁
+        /// </summary>
+        public List<MenuSubListCallbackItem> Fields { get; set; }
+    }
+
+
+    public class MenuSubListCallbackItem
+    {
+        /// <summary>
+        /// Id
+        /// </summary>
+        public Guid? Id { get; set; }
+
+        /// <summary>
+        /// 涓婄骇Id
+        /// </summary>
+        public Guid? ParentId { get; set; }
+
+        /// <summary>
+        /// 鑿滃崟璺緞
+        /// </summary>
+        public string Path { get; set; }
+
+        /// <summary>
+        /// 缂栧彿
+        /// </summary>
+        public string Code { get; set; }
+
+        /// <summary>
+        /// 鍚嶇О
+        /// </summary>
+        public string Name { get; set; }
+
+        /// <summary>
+        /// 绫诲瀷
+        /// </summary>
+        public EnumMenuType Type { get; set; }
+
+        /// <summary>
+        /// 璁块棶绾у埆
+        /// </summary>
+        public EnumMenuVisitLevel VisitLevel { get; set; }
+
+        /// <summary>
+        /// 鍥炬爣
+        /// </summary>
+        public string Icon { get; set; }
+
+        /// <summary>
+        /// 閾炬帴鍦板潃
+        /// </summary>
+        public string Url { get; set; }
+
+        /// <summary>
+        /// 鍒嗙粍鍚嶇О锛堢敤浜庢寜閽�/瀛楁锛�
+        /// </summary>
+        public string Group { get; set; }
+
+        /// <summary>
+        /// 浣嶇疆锛堢敤浜庢寜閽級
+        /// </summary>
+        public string Location { get; set; }
+
+        /// <summary>
+        /// 鍒楀锛堢敤浜庢寜閽�/鍒�/鍏冪礌锛�
+        /// </summary>
+        public string Width { get; set; }
+
+        /// <summary>
+        /// 鏄惁绂佺敤
+        /// </summary>
+        public bool IsDisabled { get; set; }
+
+        /// <summary>
+        /// 鏄惁闅愯棌
+        /// </summary>
+        public bool IsHidden { get; set; }
+
+        /// <summary>
+        /// 鏄惁缂撳瓨
+        /// </summary>
+        public bool IsCache { get; set; }
+
+        /// <summary>
+        /// 鎺掑簭
+        /// </summary>
+        public int Sort { get; set; }
+
+        /// <summary>
+        /// 澶囨敞
+        /// </summary>
+        public string Remark { get; set; }
+    }
+}
diff --git a/FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs b/FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs
index e6701e4..b1dd550 100644
--- a/FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs
+++ b/FlexJobApi.Core/Utils/SwaggerUtils/CustomOperationIdFilter.cs
@@ -3,6 +3,7 @@
 using Swashbuckle.AspNetCore.SwaggerGen;
 using System;
 using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
@@ -23,6 +24,29 @@
 
             // 璁剧疆鏈�缁堢殑 OperationId
             operation.OperationId = $"{controllerName}-{actionName}";
+
+            // 鑾峰彇鎺ュ彛鏂规硶鐨勮繑鍥炵被鍨嬶紙鍙兘鏄� Task<ApiResult<T>> 鎴� ApiResult<T>锛�
+            var returnType = context.MethodInfo.ReturnType;
+
+            // 姝ラ 1锛氬鏋滄槸 Task 鎴� Task<ApiResult<T>>锛屾彁鍙栧唴閮ㄧ被鍨�
+            if (returnType.IsGenericType && returnType.GetGenericTypeDefinition() == typeof(Task<>))
+            {
+                returnType = returnType.GetGenericArguments()[0]; // 鎻愬彇 Task<T> 涓殑 T
+            }
+
+            // 姝ラ 3锛氭浛鎹� Swagger 鍝嶅簲绫诲瀷涓� Data 鐨勭被鍨�
+            operation.Responses.Clear();
+            operation.Responses.Add("200", new OpenApiResponse
+            {
+                Description = "鎿嶄綔鎴愬姛",
+                Content = new Dictionary<string, OpenApiMediaType>
+                {
+                    ["application/json"] = new OpenApiMediaType
+                    {
+                        Schema = context.SchemaGenerator.GenerateSchema(returnType, context.SchemaRepository)
+                    }
+                }
+            });
         }
     }
 }
diff --git a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
index 5442d20..ec7f02d 100644
--- a/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
+++ b/FlexJobApi.User.Application/FlexJobApi.User.Application.xml
@@ -39,6 +39,11 @@
             {0}涓嶅瓨鍦�
             </summary>
         </member>
+        <member name="F:FlexJobApi.User.Application.EnumUserErrorCodeType.s200">
+            <summary>
+            鍙傛暟閿欒锛歿0}
+            </summary>
+        </member>
         <member name="F:FlexJobApi.User.Application.EnumUserErrorCodeType.u1000">
             <summary>
             璐﹀彿鎴栧瘑鐮佷笉瀛樺湪
@@ -69,7 +74,14 @@
         </member>
         <member name="M:FlexJobApi.User.Application.MenuAppService.ListQuery(FlexJobApi.Core.MenuListQuery)">
             <summary>
-            鏌ヨ鑿滃崟鍒楄〃
+            鏌ヨ鑿滃崟/椤甸潰/妯℃�佹鍒楄〃
+            </summary>
+            <param name="query"></param>
+            <returns></returns>
+        </member>
+        <member name="M:FlexJobApi.User.Application.MenuAppService.SubListQuery(FlexJobApi.Core.Models.MenuSubListQuery)">
+            <summary>
+            鏌ヨ鎸夐挳/瀛楁鍒楄〃
             </summary>
             <param name="query"></param>
             <returns></returns>
@@ -83,16 +95,31 @@
         </member>
         <member name="T:FlexJobApi.User.Application.MenuListQueryHandler">
             <summary>
-            鏌ヨ鎵�鏈夎彍鍗�
+            鏌ヨ鑿滃崟/椤甸潰/妯℃�佹鍒楄〃
             </summary>
         </member>
         <member name="M:FlexJobApi.User.Application.MenuListQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Menu})">
             <summary>
-            鏌ヨ鎵�鏈夎彍鍗�
+            鏌ヨ鑿滃崟/椤甸潰/妯℃�佹鍒楄〃
             </summary>
         </member>
         <member name="M:FlexJobApi.User.Application.MenuListQueryHandler.Handle(FlexJobApi.Core.MenuListQuery,System.Threading.CancellationToken)">
             <inheritdoc/>
         </member>
+        <member name="T:FlexJobApi.User.Application.Menus.Queries.MenuSubListQueryHandler">
+            <summary>
+            鏌ヨ鎸夐挳/瀛楁鍒楄〃
+            </summary>
+            <param name="menuRep"></param>
+        </member>
+        <member name="M:FlexJobApi.User.Application.Menus.Queries.MenuSubListQueryHandler.#ctor(Furion.DatabaseAccessor.IRepository{FlexJobApi.Core.Menu})">
+            <summary>
+            鏌ヨ鎸夐挳/瀛楁鍒楄〃
+            </summary>
+            <param name="menuRep"></param>
+        </member>
+        <member name="M:FlexJobApi.User.Application.Menus.Queries.MenuSubListQueryHandler.Handle(FlexJobApi.Core.Models.MenuSubListQuery,System.Threading.CancellationToken)">
+            <inheritdoc/>
+        </member>
     </members>
 </doc>
diff --git a/FlexJobApi.User.Application/Menus/Commands/MenuImportFieldCommandHandler.cs b/FlexJobApi.User.Application/Menus/Commands/MenuImportFieldCommandHandler.cs
new file mode 100644
index 0000000..bb5e615
--- /dev/null
+++ b/FlexJobApi.User.Application/Menus/Commands/MenuImportFieldCommandHandler.cs
@@ -0,0 +1,12 @@
+锘縰sing System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application
+{
+    internal class MenuImportFieldCommandHandler
+    {
+    }
+}
diff --git a/FlexJobApi.User.Application/Menus/MenuAppService.cs b/FlexJobApi.User.Application/Menus/MenuAppService.cs
index cb3fa63..00845e1 100644
--- a/FlexJobApi.User.Application/Menus/MenuAppService.cs
+++ b/FlexJobApi.User.Application/Menus/MenuAppService.cs
@@ -1,4 +1,5 @@
 锘縰sing FlexJobApi.Core;
+using FlexJobApi.Core.Models;
 using Furion.DynamicApiController;
 using MediatR;
 using Microsoft.AspNetCore.Mvc;
@@ -29,6 +30,16 @@
         }
 
         /// <summary>
+        /// 鏌ヨ鎸夐挳/瀛楁鍒楄〃
+        /// </summary>
+        /// <param name="query"></param>
+        /// <returns></returns>
+        public async Task<MenuSubListCallback> SubListQuery(MenuSubListQuery query)
+        {
+            return await mediator.Send(query);
+        }
+
+        /// <summary>
         /// 淇濆瓨鑿滃崟
         /// </summary>
         /// <param name="command"></param>
diff --git a/FlexJobApi.User.Application/Menus/Queries/MenuSubListQueryHandler.cs b/FlexJobApi.User.Application/Menus/Queries/MenuSubListQueryHandler.cs
new file mode 100644
index 0000000..b929019
--- /dev/null
+++ b/FlexJobApi.User.Application/Menus/Queries/MenuSubListQueryHandler.cs
@@ -0,0 +1,43 @@
+锘縰sing FlexJobApi.Core;
+using FlexJobApi.Core.Models;
+using Furion.DatabaseAccessor;
+using Mapster;
+using MediatR;
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace FlexJobApi.User.Application.Menus.Queries
+{
+    /// <summary>
+    /// 鏌ヨ鎸夐挳/瀛楁鍒楄〃
+    /// </summary>
+    /// <param name="menuRep"></param>
+    public class MenuSubListQueryHandler(IRepository<Menu> menuRep)
+        : IRequestHandler<MenuSubListQuery, MenuSubListCallback>
+    {
+        private readonly IRepository<Menu> menuRep = menuRep;
+
+        /// <inheritdoc/>
+        public async Task<MenuSubListCallback> Handle(MenuSubListQuery request, CancellationToken cancellationToken)
+        {
+            var callback = new MenuSubListCallback();
+            var q = menuRep.AsQueryable().AsNoTracking()
+                .Where(it => it.ParentId == request.ParentId)
+                .Where(it => it.Type == EnumMenuType.Button || it.Type == EnumMenuType.Field);
+            var items = await q.ProjectToType<MenuSubListCallbackItem>().ToListAsync(cancellationToken);
+            callback.Groups = items.GroupBy(it => it.Group ?? "Default")
+                .Select(it => new MenuSubListCallbackGroup
+                {
+                    Name = it.Key,
+                    Buttons = it.Where(g => g.Type == EnumMenuType.Button).ToList(),
+                    Fields = it.Where(g => g.Type == EnumMenuType.Field).ToList(),
+                })
+                .ToList();
+            return callback;
+        }
+    }
+}

--
Gitblit v1.9.1