huawei
3 天以前 63d047db30e03608479ab3d340e925bc3366357c
看板模块
已删除2个文件
已修改7个文件
639 ■■■■■ 文件已修改
Controllers/Simple/SimpleController.cs 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/BiViewDto.cs 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/ChildrenDto.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/MesSimpleDto.cs 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/ResultDto.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/TreeViewDto.cs 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesSimple.cs 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesSimpleCcb.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Simple/SimpleManager.cs 244 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Simple/SimpleController.cs
@@ -1,127 +1,30 @@
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.Simple;
using NewPdaSqlServer.service.Simple;
using NewPdaSqlServer.service.Simple;
namespace NewPdaSqlServer.Controllers.Simple;
/// <summary>
///     çœ‹æ¿ç›®å½•接口控制器
///     è·¯ç”±å‰ç¼€: /simple (与Java版本完全一致)
///     å®žçŽ°ä¸ŽJava SimpleController完全相同的接口
/// </summary>
[Route("simple")]
[ApiController]
public class SimpleController : ControllerBase
{
    private readonly SimpleManager _simpleManager = new();
    /// <summary>
    ///     èŽ·å–æ ‘å½¢èœå•
    ///     å¯¹åº”Java: @PostMapping("/getTree")
    /// </summary>
    /// <returns>树形菜单数据</returns>
    /// <remarks>
    ///     è¯·æ±‚示例:
    ///     POST /simple/getTree
    ///     Content-Type: application/json
    ///
    ///     è¿”回数据结构:
    ///     {
    ///         "code": 0,
    ///         "msg": "请求成功",
    ///         "count": 2,
    ///         "data": [
    ///             {
    ///                 "id": 1,
    ///                 "title": "生产看板",
    ///                 "field": "production",
    ///                 "spread": true,
    ///                 "children": [...]
    ///             }
    ///         ]
    ///     }
    /// </remarks>
    /// <response code="200">成功获取树形菜单</response>
    [HttpPost("getTree")]
    public ResultDto<List<TreeViewDto>> GetTree()
    {
        return _simpleManager.GetTree();
    }
    /// <summary>
    ///     èŽ·å–èœå•åˆ—è¡¨
    ///     å¯¹åº”Java: @PostMapping("/list")
    ///     æ³¨æ„: æ­¤æŽ¥å£å·²åŸºæœ¬åºŸå¼ƒï¼Œå‰ç«¯æ”¹ç”¨æ ‘形菜单方式展示
    /// </summary>
    /// <returns>菜单列表数据</returns>
    /// <remarks>
    ///     è¯·æ±‚示例:
    ///     POST /simple/list
    ///     Content-Type: application/json
    ///
    ///     è¿”回数据结构:
    ///     {
    ///         "code": 0,
    ///         "msg": "请求成功",
    ///         "count": 5,
    ///         "data": [
    ///             {
    ///                 "id": 1,
    ///                 "isTop": 1,
    ///                 "fid": 0,
    ///                 "title": "生产效率看板",
    ///                 "field": "efficiency",
    ///                 "href": "http://bi.example.com/dashboard1",
    ///                 "spread": 0,
    ///                 "disabled": 0,
    ///                 "lbtime": 10
    ///             }
    ///         ]
    ///     }
    /// </remarks>
    /// <response code="200">成功获取菜单列表</response>
    [HttpPost("list")]
    public ResultDto<List<MesSimpleDto>> GetList()
    {
        return _simpleManager.GetMenuList();
    }
    /// <summary>
    ///     æ ¹æ®èœå•ID获取BI视图列表
    ///     å¯¹åº”Java: @GetMapping("/listByMenuId/{menuId}")
    ///     æ ¸å¿ƒæŽ¥å£ï¼šç”¨äºŽèŽ·å–è½®æ’­é¡µé¢çš„BI看板链接列表
    /// </summary>
    /// <param name="menuId">菜单ID (路径参数)</param>
    /// <returns>BI视图列表</returns>
    /// <remarks>
    ///     è¯·æ±‚示例:
    ///     GET /simple/listByMenuId/102
    ///
    ///     è¿”回数据结构:
    ///     {
    ///         "code": 0,
    ///         "msg": "请求成功",
    ///         "count": 3,
    ///         "data": [
    ///             {
    ///                 "id": 1001,
    ///                 "pid": 102,
    ///                 "name": "质量趋势分析",
    ///                 "href": "http://bi.example.com/quality/trend",
    ///                 "lbtime": 10
    ///             }
    ///         ]
    ///     }
    ///
    ///     ä¸šåŠ¡è¯´æ˜Ž:
    ///     - è¿”回指定菜单下所有的BI看板链接
    ///     - lbtime字段从父菜单继承(MES_SIMPLE表)
    ///     - å‰ç«¯ä½¿ç”¨æ­¤æ•°æ®åˆ›å»ºiframe进行轮播展示
    /// </remarks>
    /// <response code="200">成功获取BI视图列表</response>
    [HttpGet("listByMenuId/{menuId}")]
    public ResultDto<List<BiViewDto>> GetBiViews(int menuId)
    public ResultDto<List<BiViewDto>> GetBiViews(long menuId)
    {
        return _simpleManager.GetBiViewsByMenuId(menuId);
    }
}
}
Dto/Simple/BiViewDto.cs
@@ -3,37 +3,25 @@
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     BI视图DTO - ç”¨äºŽè½®æ’­é¡µé¢çš„视图数据
///     BI视图DTO - ä¸“门用于轮播页面展示 (对应 NodeType = 1)
/// </summary>
public class BiViewDto
{
    /// <summary>
    ///     BI视图主键ID
    /// </summary>
    [JsonProperty("id")]
    public int Id { get; set; }
    public long Id { get; set; }
    [JsonProperty("parentId")]
    public long? ParentId { get; set; }
    [JsonProperty("title")]
    public string? Title { get; set; }
    [JsonProperty("url")]
    public string? Url { get; set; }
    /// <summary>
    ///     æ‰€å±žçˆ¶èœå•ID
    ///     è½®æ’­é—´éš”(秒)
    /// </summary>
    [JsonProperty("pid")]
    public int? Pid { get; set; }
    /// <summary>
    ///     BI视图名称
    /// </summary>
    [JsonProperty("name")]
    public string? Name { get; set; }
    /// <summary>
    ///     BI看板的完整URL地址
    /// </summary>
    [JsonProperty("href")]
    public string? Href { get; set; }
    /// <summary>
    ///     è½®æ’­æ—¶é—´é—´éš”(秒)
    /// </summary>
    [JsonProperty("lbtime")]
    public int? Lbtime { get; set; }
}
    [JsonProperty("duration")]
    public int? Duration { get; set; }
}
Dto/Simple/ChildrenDto.cs
ÎļþÒÑɾ³ý
Dto/Simple/MesSimpleDto.cs
@@ -1,64 +1,73 @@
using Newtonsoft.Json;
using System;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     èœå•实体DTO - ç”¨äºŽåˆ—表展示
///     ä¸ŽJava版本MesSimplesimple字段完全一致
///     èœå•实体DTO - å¯¹åº”æ–°çš„ MES_SIMPLE è¡¨ç»“æž„
/// </summary>
public class MesSimpleDto
{
    /// <summary>
    ///     è‡ªå¢žä¸»é”®ID
    /// </summary>
    [JsonProperty("id")]
    public long Id { get; set; }
    /// <summary>
    ///     æ˜¯å¦ä¸ºæ ¹èŠ‚ç‚¹ (0表示为根节点)
    ///     çˆ¶èŠ‚ç‚¹ID (NULL为根节点)
    /// </summary>
    [JsonProperty("isTop")]
    public int? IsTop { get; set; }
    [JsonProperty("parentId")]
    public long? ParentId { get; set; }
    /// <summary>
    ///     çˆ¶èŠ‚ç‚¹id
    ///     èŠ‚ç‚¹ç±»åž‹: 0=目录, 1=页面/轮播
    /// </summary>
    [JsonProperty("fid")]
    public long? Fid { get; set; }
    [JsonProperty("nodeType")]
    public int NodeType { get; set; }
    /// <summary>
    ///     åç§°
    ///     å±‚级 (0-5)
    /// </summary>
    [JsonProperty("nodeLevel")]
    public int NodeLevel { get; set; }
    /// <summary>
    ///     å”¯ä¸€ä¸šåŠ¡ç¼–ç 
    /// </summary>
    [JsonProperty("code")]
    public string? Code { get; set; }
    /// <summary>
    ///     æ˜¾ç¤ºæ ‡é¢˜
    /// </summary>
    [JsonProperty("title")]
    public string? Title { get; set; }
    /// <summary>
    ///     è‹±æ–‡å
    ///     è·³è½¬åœ°å€
    /// </summary>
    [JsonProperty("field")]
    public string? Field { get; set; }
    [JsonProperty("url")]
    public string? Url { get; set; }
    /// <summary>
    ///     åœ°å€
    ///     è½®æ’­æ—¶é•¿(秒)
    /// </summary>
    [JsonProperty("href")]
    public string? Href { get; set; }
    [JsonProperty("carouselDuration")]
    public int? CarouselDuration { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦åˆå§‹å±•å¼€ (0为不展开,1为展开)
    ///     æ˜¯å¦é»˜è®¤å±•å¼€
    /// </summary>
    [JsonProperty("spread")]
    public int? Spread { get; set; }
    [JsonProperty("isExpanded")]
    public bool IsExpanded { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦ä¸ºå±•ç¤º (0为展示,1为不展示)
    ///     æ˜¯å¦å¯ç”¨
    /// </summary>
    [JsonProperty("disabled")]
    public int? Disabled { get; set; }
    [JsonProperty("isEnabled")]
    public bool IsEnabled { get; set; }
    /// <summary>
    ///     è½®æ’­æ—¶é—´(秒)
    ///     æŽ’序
    /// </summary>
    [JsonProperty("lbtime")]
    public int? Lbtime { get; set; }
}
    [JsonProperty("sortOrder")]
    public int SortOrder { get; set; }
}
Dto/Simple/ResultDto.cs
@@ -3,7 +3,6 @@
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     ç»Ÿä¸€è¿”回结果封装 - ä¸ŽJava版本完全兼容
///     å­—段名使用code/msg/count/data以保持前端兼容
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
Dto/Simple/TreeViewDto.cs
@@ -1,39 +1,37 @@
using Newtonsoft.Json;
using System.Collections.Generic;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     æ ‘形视图 - ç”¨äºŽLayui Tree组件渲染
///     æ ‘形结构DTO - é€‚配 Layui Tree ç»„ä»¶
/// </summary>
public class TreeViewDto
{
    /// <summary>
    ///     èœå•项ID
    /// </summary>
    [JsonProperty("id")]
    public long Id { get; set; }
    /// <summary>
    ///     èœå•显示名称
    /// </summary>
    [JsonProperty("title")]
    public string? Title { get; set; }
    /// <summary>
    ///     èœå•英文标识
    /// </summary>
    [JsonProperty("field")]
    public string? Field { get; set; }
    public string? Field { get; set; } // å¯¹åº” Code
    /// <summary>
    ///     æ˜¯å¦é»˜è®¤å±•开子节点
    /// </summary>
    [JsonProperty("spread")]
    public bool Spread { get; set; }
    public bool Spread { get; set; } // å¯¹åº” IsExpanded
    /// <summary>
    ///     å­èœå•列表
    ///     è·³è½¬é“¾æŽ¥ (Layui Tree点击时需要)
    /// </summary>
    [JsonProperty("href")]
    public string? Href { get; set; } // å¯¹åº” Url
    /// <summary>
    ///     èŠ‚ç‚¹ç±»åž‹ (前端图标判断依据)
    /// </summary>
    [JsonProperty("nodeType")]
    public int NodeType { get; set; }
    [JsonProperty("children")]
    public List<ChildrenDto>? Children { get; set; }
}
    public List<TreeViewDto>? Children { get; set; }
}
entity/MesSimple.cs
@@ -1,64 +1,53 @@
using System;
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
///     èœå•维护表
///     çœ‹æ¿èœå•配置表 (MES_SIMPLE)
/// </summary>
[SugarTable("MES_SIMPLE")]
public class MesSimple
{
    /// <summary>
    ///     è‡ªå¢žåˆ—主键
    /// </summary>
    [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
    public long Id { get; set; }
    /// <summary>
    ///     æ˜¯å¦ä¸ºæ ¹èŠ‚ç‚¹ (0表示为根节点)
    /// </summary>
    [SugarColumn(ColumnName = "is_top")]
    public int? IsTop { get; set; }
    [SugarColumn(ColumnName = "parent_id", IsNullable = true)]
    public long? ParentId { get; set; }
    /// <summary>
    ///     çˆ¶èŠ‚ç‚¹id
    /// </summary>
    [SugarColumn(ColumnName = "fid")]
    public long? Fid { get; set; }
    [SugarColumn(ColumnName = "node_level")]
    public int NodeLevel { get; set; }
    /// <summary>
    ///     åç§°
    /// </summary>
    [SugarColumn(ColumnName = "node_type")]
    public int NodeType { get; set; }
    [SugarColumn(ColumnName = "code")]
    public string? Code { get; set; }
    [SugarColumn(ColumnName = "title")]
    public string? Title { get; set; }
    /// <summary>
    ///     è‹±æ–‡å
    /// </summary>
    [SugarColumn(ColumnName = "field")]
    public string? Field { get; set; }
    [SugarColumn(ColumnName = "url")]
    public string? Url { get; set; }
    /// <summary>
    ///     åœ°å€
    /// </summary>
    [SugarColumn(ColumnName = "href")]
    public string? Href { get; set; }
    [SugarColumn(ColumnName = "carousel_duration", IsNullable = true)]
    public int? CarouselDuration { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦åˆå§‹å±•å¼€ (0为不展开,1为展开)
    /// </summary>
    [SugarColumn(ColumnName = "spread")]
    public int? Spread { get; set; }
    [SugarColumn(ColumnName = "is_expanded")]
    public bool IsExpanded { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦ä¸ºå±•ç¤º (0为展示,1为不展示)
    /// </summary>
    [SugarColumn(ColumnName = "disabled")]
    public int? Disabled { get; set; }
    [SugarColumn(ColumnName = "is_enabled")]
    public bool IsEnabled { get; set; }
    /// <summary>
    ///     è½®æ’­æ—¶é—´(秒)
    /// </summary>
    [SugarColumn(ColumnName = "lbtime")]
    public int? Lbtime { get; set; }
}
    [SugarColumn(ColumnName = "sort_order")]
    public int SortOrder { get; set; }
    [SugarColumn(ColumnName = "is_deleted")]
    public bool IsDeleted { get; set; }
    [SugarColumn(ColumnName = "created_by")]
    public string? CreatedBy { get; set; }
    [SugarColumn(ColumnName = "created_at")]
    public DateTime CreatedAt { get; set; }
}
entity/MesSimpleCcb.cs
ÎļþÒÑɾ³ý
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);
    }
}
}