From 63d047db30e03608479ab3d340e925bc3366357c Mon Sep 17 00:00:00 2001
From: huawei <huawei@2214094776>
Date: 星期六, 20 十二月 2025 09:11:45 +0800
Subject: [PATCH] 看板模块

---
 service/Simple/SimpleManager.cs |  244 ++++++++++++++++++------------------------------
 1 files changed, 93 insertions(+), 151 deletions(-)

diff --git a/service/Simple/SimpleManager.cs b/service/Simple/SimpleManager.cs
index 91c46a2..0002038 100644
--- a/service/Simple/SimpleManager.cs
+++ b/service/Simple/SimpleManager.cs
@@ -1,67 +1,76 @@
-using NewPdaSqlServer.DB;
+using NewPdaSqlServer.DB; // 你的Repository基类所在的命名空间
 using NewPdaSqlServer.Dto.Simple;
-using NewPdaSqlServer.entity;
+using NewPdaSqlServer.entity; // 引用实体
 using SqlSugar;
 
 namespace NewPdaSqlServer.service.Simple;
 
 /// <summary>
 ///     看板菜单业务管理器
-///     实现与Java版本MesSimpleServiceImpl完全一致的业务逻辑
 /// </summary>
 public class SimpleManager : Repository<MesSimple>
 {
     /// <summary>
     ///     获取树形菜单
-    ///     对应Java: getTree()
     /// </summary>
-    /// <returns>树形菜单数据</returns>
     public ResultDto<List<TreeViewDto>> GetTree()
     {
         try
         {
-            var tree = ToTree();
+            var allNodes = Db.Queryable<MesSimple>()
+                .Where(m => m.IsEnabled && !m.IsDeleted)
+                .OrderBy(m => m.SortOrder)
+                .ToList();
+
+            var tree = BuildTree(allNodes, null);
             return ResultDto<List<TreeViewDto>>.Ok(tree, tree.Count);
         }
         catch (Exception ex)
         {
-            return ResultDto<List<TreeViewDto>>.Error(ex.Message);
+            return ResultDto<List<TreeViewDto>>.Error("获取树形菜单失败: " + ex.Message);
         }
     }
 
-    /// <summary>
-    ///     转换为树形结构
-    ///     对应Java: toTree()
-    /// </summary>
-    /// <returns>树形视图列表</returns>
-    public List<TreeViewDto> ToTree()
+    private List<TreeViewDto> BuildTree(List<MesSimple> allNodes, long? parentId)
     {
-        return ConvertToTreeViewList(GetTopList());
+        return allNodes
+            .Where(x => x.ParentId == parentId)
+            .Select(x => new TreeViewDto
+            {
+                Id = x.Id,
+                Title = x.Title,
+                Field = x.Code,
+                Spread = x.IsExpanded,
+                Href = x.Url,
+                NodeType = x.NodeType,
+                Children = BuildTree(allNodes, x.Id)
+            })
+            .ToList();
     }
 
     /// <summary>
     ///     获取菜单列表
-    ///     对应Java: getMenuList()
-    ///     查询条件: disabled=0 且 isTop>0 (排除根节点)
     /// </summary>
-    /// <returns>菜单列表</returns>
     public ResultDto<List<MesSimpleDto>> GetMenuList()
     {
         try
         {
             var list = Db.Queryable<MesSimple>()
-                .Where(m => m.Disabled == 0 && m.IsTop > 0)
+                .Where(m => m.IsEnabled && !m.IsDeleted)
+                .OrderBy(m => m.SortOrder)
                 .Select(m => new MesSimpleDto
                 {
                     Id = m.Id,
-                    IsTop = m.IsTop,
-                    Fid = m.Fid,
+                    ParentId = m.ParentId,
+                    NodeType = m.NodeType,
+                    NodeLevel = m.NodeLevel,
+                    Code = m.Code,
                     Title = m.Title,
-                    Field = m.Field,
-                    Href = m.Href,
-                    Spread = m.Spread,
-                    Disabled = m.Disabled,
-                    Lbtime = m.Lbtime
+                    Url = m.Url,
+                    CarouselDuration = m.CarouselDuration,
+                    IsExpanded = m.IsExpanded,
+                    IsEnabled = m.IsEnabled,
+                    SortOrder = m.SortOrder
                 })
                 .ToList();
 
@@ -74,139 +83,72 @@
     }
 
     /// <summary>
-    ///     根据菜单ID获取BI视图列表
-    ///     对应Java: getBiViewsByMenuId()
+    ///     根据ID获取视图列表
+    ///     逻辑升级:
+    ///     1. 先找子节点 (轮播模式)
+    ///     2. 如果没子节点,但自己有URL (单页模式),则返回自己
     /// </summary>
-    /// <param name="menuId">菜单ID</param>
-    /// <returns>BI视图列表</returns>
-    public ResultDto<List<BiViewDto>> GetBiViewsByMenuId(int menuId)
+ public ResultDto<List<BiViewDto>> GetBiViewsByMenuId(long menuId)
+{
+    try
     {
-        try
-        {
-            // 查询指定菜单下的所有BI视图
-            var list = Db.Queryable<MesSimpleCcb>()
-                .Where(b => b.Pid == menuId && b.Href != null)
-                .Select(b => new BiViewDto
-                {
-                    Id = b.Id,
-                    Pid = b.Pid,
-                    Name = b.Name,
-                    Href = b.Href,
-                    Lbtime = b.Lbtime
-                })
-                .ToList();
+        // 1. 首先查询点击的这个节点本身 (必须是启用且未删除)
+        var selfNode = Db.Queryable<MesSimple>()
+            .First(m => m.Id == menuId && m.IsEnabled && !m.IsDeleted);
 
-            // 如果有数据,获取父菜单的轮播时间配置并赋值给所有BI视图
-            if (list.Count > 0)
+        if (selfNode == null) return ResultDto<List<BiViewDto>>.Error("该节点不存在或已禁用");
+        
+        // 安全检查:如果前端传了 NodeType=0 的 ID 进来,这里拦截
+        if (selfNode.NodeType == 0) return ResultDto<List<BiViewDto>>.Error("目录节点不可直接预览");
+
+        // 2. 判断自己是否有 URL
+        // 排除空值和占位符 "轮播"
+        if (!string.IsNullOrEmpty(selfNode.Url) && selfNode.Url != "轮播")
+        {
+            var selfView = new BiViewDto
             {
-                var simple = Db.Queryable<MesSimple>()
-                    .Where(m => m.Id == menuId)
-                    .First();
-
-                if (simple != null)
-                {
-                    // 将父菜单的lbtime赋值给所有BI视图
-                    list.ForEach(biView => biView.Lbtime = simple.Lbtime);
-                }
-            }
-
-            return ResultDto<List<BiViewDto>>.Ok(list, list.Count);
-        }
-        catch (Exception ex)
-        {
-            return ResultDto<List<BiViewDto>>.Error(ex.Message);
-        }
-    }
-
-    #region 私有方法
-
-    /// <summary>
-    ///     获取根节点列表
-    ///     查询条件: isTop=0 且 disabled=0
-    /// </summary>
-    /// <returns>根节点列表</returns>
-    private List<MesSimple> GetTopList()
-    {
-        return Db.Queryable<MesSimple>()
-            .Where(m => m.IsTop == 0 && m.Disabled == 0)
-            .ToList();
-    }
-
-    /// <summary>
-    ///     转换为树形视图列表
-    ///     对应Java: convertToTreeViewList()
-    ///     使用并行处理提升性能
-    /// </summary>
-    /// <param name="mesSimpleList">根节点列表</param>
-    /// <returns>树形视图列表</returns>
-    private List<TreeViewDto> ConvertToTreeViewList(List<MesSimple> mesSimpleList)
-    {
-        // 使用Parallel.ForEach实现并行处理,类似Java的CompletableFuture
-        var treeViews = new List<TreeViewDto>();
-        var lockObj = new object();
-
-        Parallel.ForEach(mesSimpleList, mesSimple =>
-        {
-            var treeView = ConvertToTreeView(mesSimple);
-            lock (lockObj)
-            {
-                treeViews.Add(treeView);
-            }
-        });
-
-        return treeViews;
-    }
-
-    /// <summary>
-    ///     转换单个菜单项为树形视图
-    ///     对应Java: convertToTreeView()
-    /// </summary>
-    /// <param name="mesSimple">菜单实体</param>
-    /// <returns>树形视图</returns>
-    private TreeViewDto ConvertToTreeView(MesSimple mesSimple)
-    {
-        var treeView = new TreeViewDto
-        {
-            Id = mesSimple.Id,
-            Title = mesSimple.Title,
-            Field = mesSimple.Field,
-            Spread = mesSimple.Spread == 1
-        };
-
-        // 查询子节点
-        var childList = Db.Queryable<MesSimple>()
-            .Where(m => m.Disabled == 0 && m.Fid == mesSimple.Id)
-            .ToList();
-
-        // 转换子节点
-        var childrenList = new List<ChildrenDto>();
-        foreach (var child in childList)
-        {
-            var children = new ChildrenDto
-            {
-                Id = child.Id,
-                Title = child.Title,
-                Field = child.Field
+                Id = selfNode.Id,
+                ParentId = selfNode.ParentId,
+                Title = selfNode.Title,
+                Url = selfNode.Url,
+                Duration = (selfNode.CarouselDuration == null || selfNode.CarouselDuration <= 0) ? 10 : selfNode.CarouselDuration
             };
-
-            // 处理href字段
-            // 如果href值为"轮播",则自动生成轮播页面链接
-            if ("轮播".Equals(child.Href))
-            {
-                children.Href = $"bi_view.html?menuId={child.Id}&lbsj={child.Lbtime}";
-            }
-            else
-            {
-                children.Href = child.Href;
-            }
-
-            childrenList.Add(children);
+            return ResultDto<List<BiViewDto>>.Ok(new List<BiViewDto> { selfView
+}, 1);
         }
 
-        treeView.Children = childrenList;
+        // 3. 自己没有 URL,查找子目录/子项
+        // 查询 ParentId = menuId 且类型为 2 的子项
+        var childNodes = Db.Queryable<MesSimple>()
+            .Where(b => b.ParentId == menuId && b.NodeType == 2 && b.IsEnabled && !b.IsDeleted)
+            .OrderBy(b => b.SortOrder)
+            .ToList();
 
-        return treeView;
-    }
+if (childNodes.Count > 0)
+{
+    var resultList = childNodes.Select(b => new BiViewDto
+    {
+        Id = b.Id,
+        ParentId = b.ParentId,
+        Title = b.Title,
+        Url = b.Url,
+        // 子项如果没时间,继承当前 menuId 节点的时间配置
+        Duration = (b.CarouselDuration == null || b.CarouselDuration <= 0)
+                   ? (selfNode.CarouselDuration ?? 10)
+                   : b.CarouselDuration
+    }).ToList();
 
-    #endregion
+    return ResultDto<List<BiViewDto>>.Ok(resultList, resultList.Count);
 }
+
+// 4. 自己没 URL 且 子项也没 URL
+// 返回空列表,前端 bi_view.html 收到后会弹出“当前菜单下没有可轮播的内容”
+return ResultDto<List<BiViewDto>>.Ok(new List<BiViewDto>(), 0);
+    }
+    catch (Exception ex)
+    {
+        return ResultDto<List<BiViewDto>>.Error("数据查询失败: " + ex.Message);
+    }
+}
+   
+}
\ No newline at end of file

--
Gitblit v1.9.3