huawei
6 天以前 e286264a833fe52862690ad06d72ad04df5c77dc
看板功能
已修改1个文件
已添加9个文件
690 ■■■■■ 文件已修改
Controllers/Simple/SimpleController.cs 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/BiViewDto.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/ChildrenDto.cs 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/MesSimpleDto.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/ResultDto.cs 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Dto/Simple/TreeViewDto.cs 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
appsettings.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesSimple.cs 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
entity/MesSimpleCcb.cs 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service/Simple/SimpleManager.cs 212 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Controllers/Simple/SimpleController.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,127 @@
using Microsoft.AspNetCore.Mvc;
using NewPdaSqlServer.Dto.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)
    {
        return _simpleManager.GetBiViewsByMenuId(menuId);
    }
}
Dto/Simple/BiViewDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
using Newtonsoft.Json;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     BI视图DTO - ç”¨äºŽè½®æ’­é¡µé¢çš„视图数据
/// </summary>
public class BiViewDto
{
    /// <summary>
    ///     BI视图主键ID
    /// </summary>
    [JsonProperty("id")]
    public int Id { 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; }
}
Dto/Simple/ChildrenDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
using Newtonsoft.Json;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     å­èœå•项 - æ ‘形结构的子节点
/// </summary>
public class ChildrenDto
{
    /// <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; }
    /// <summary>
    ///     è·³è½¬é“¾æŽ¥
    ///     å¦‚果值为"轮播",则自动生成bi_view.html链接
    ///     å¦åˆ™ä½¿ç”¨æ•°æ®åº“中配置的原始href
    /// </summary>
    [JsonProperty("href")]
    public string? Href { get; set; }
}
Dto/Simple/MesSimpleDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
using Newtonsoft.Json;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     èœå•实体DTO - ç”¨äºŽåˆ—表展示
///     ä¸ŽJava版本MesSimplesimple字段完全一致
/// </summary>
public class MesSimpleDto
{
    /// <summary>
    ///     è‡ªå¢žä¸»é”®ID
    /// </summary>
    [JsonProperty("id")]
    public long Id { get; set; }
    /// <summary>
    ///     æ˜¯å¦ä¸ºæ ¹èŠ‚ç‚¹ (0表示为根节点)
    /// </summary>
    [JsonProperty("isTop")]
    public int? IsTop { get; set; }
    /// <summary>
    ///     çˆ¶èŠ‚ç‚¹id
    /// </summary>
    [JsonProperty("fid")]
    public long? Fid { get; set; }
    /// <summary>
    ///     åç§°
    /// </summary>
    [JsonProperty("title")]
    public string? Title { get; set; }
    /// <summary>
    ///     è‹±æ–‡å
    /// </summary>
    [JsonProperty("field")]
    public string? Field { get; set; }
    /// <summary>
    ///     åœ°å€
    /// </summary>
    [JsonProperty("href")]
    public string? Href { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦åˆå§‹å±•å¼€ (0为不展开,1为展开)
    /// </summary>
    [JsonProperty("spread")]
    public int? Spread { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦ä¸ºå±•ç¤º (0为展示,1为不展示)
    /// </summary>
    [JsonProperty("disabled")]
    public int? Disabled { get; set; }
    /// <summary>
    ///     è½®æ’­æ—¶é—´(秒)
    /// </summary>
    [JsonProperty("lbtime")]
    public int? Lbtime { get; set; }
}
Dto/Simple/ResultDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
using Newtonsoft.Json;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     ç»Ÿä¸€è¿”回结果封装 - ä¸ŽJava版本完全兼容
///     å­—段名使用code/msg/count/data以保持前端兼容
/// </summary>
/// <typeparam name="T">数据类型</typeparam>
public class ResultDto<T>
{
    /// <summary>
    ///     çŠ¶æ€ç : 0=成功, 500=失败
    /// </summary>
    [JsonProperty("code")]
    public int Code { get; set; }
    /// <summary>
    ///     è¿”回消息
    /// </summary>
    [JsonProperty("msg")]
    public string? Msg { get; set; }
    /// <summary>
    ///     è¿”回的数据
    /// </summary>
    [JsonProperty("data")]
    public T? Data { get; set; }
    /// <summary>
    ///     æ•°æ®æ€»æ•°
    /// </summary>
    [JsonProperty("count")]
    public int Count { get; set; }
    /// <summary>
    ///     æˆåŠŸè¿”å›ž
    /// </summary>
    /// <param name="data">数据</param>
    /// <param name="count">数据总数</param>
    /// <returns>成功结果</returns>
    public static ResultDto<T> Ok(T data, int count)
    {
        return new ResultDto<T>
        {
            Code = 0,
            Msg = "请求成功",
            Data = data,
            Count = count
        };
    }
    /// <summary>
    ///     å¤±è´¥è¿”回
    /// </summary>
    /// <param name="message">错误信息</param>
    /// <returns>失败结果</returns>
    public static ResultDto<T> Error(string message)
    {
        return new ResultDto<T>
        {
            Code = 500,
            Msg = message,
            Data = default,
            Count = 0
        };
    }
}
Dto/Simple/TreeViewDto.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
using Newtonsoft.Json;
namespace NewPdaSqlServer.Dto.Simple;
/// <summary>
///     æ ‘形视图 - ç”¨äºŽ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; }
    /// <summary>
    ///     æ˜¯å¦é»˜è®¤å±•开子节点
    /// </summary>
    [JsonProperty("spread")]
    public bool Spread { get; set; }
    /// <summary>
    ///     å­èœå•列表
    /// </summary>
    [JsonProperty("children")]
    public List<ChildrenDto>? Children { get; set; }
}
appsettings.json
@@ -10,7 +10,7 @@
    "TestErpUrl": "http://192.168.1.149:8066/WebService1.asmx/MesToErpinfoTest",
    "ProductionErpUrl": "http://192.168.1.149:8066/WebService1.asmx/MesToErpinfoTest",
    //"DataBaseConn": "Data Source=192.168.1.146,12468;Initial Catalog=TEST_MES;User ID=testUser;Password =qixi1qaz@WSXtest;Encrypt=True;TrustServerCertificate=True;"
    "DataBaseConn": "Data Source=192.168.8.8;Initial Catalog=YS_MES;User ID=sa;Password =JianHui@2025;Encrypt=True;TrustServerCertificate=True;"
    "DataBaseConn": "Data Source=192.168.8.8;Initial Catalog=GS_MES;User ID=sa;Password =JianHui@2025;Encrypt=True;TrustServerCertificate=True;"
  },
  "Version": "1.0.0",
  "X-KDApi-AcctID": "6244701c616bff",
entity/MesSimple.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
///     èœå•维护表
/// </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; }
    /// <summary>
    ///     çˆ¶èŠ‚ç‚¹id
    /// </summary>
    [SugarColumn(ColumnName = "fid")]
    public long? Fid { get; set; }
    /// <summary>
    ///     åç§°
    /// </summary>
    [SugarColumn(ColumnName = "title")]
    public string? Title { get; set; }
    /// <summary>
    ///     è‹±æ–‡å
    /// </summary>
    [SugarColumn(ColumnName = "field")]
    public string? Field { get; set; }
    /// <summary>
    ///     åœ°å€
    /// </summary>
    [SugarColumn(ColumnName = "href")]
    public string? Href { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦åˆå§‹å±•å¼€ (0为不展开,1为展开)
    /// </summary>
    [SugarColumn(ColumnName = "spread")]
    public int? Spread { get; set; }
    /// <summary>
    ///     èŠ‚ç‚¹æ˜¯å¦ä¸ºå±•ç¤º (0为展示,1为不展示)
    /// </summary>
    [SugarColumn(ColumnName = "disabled")]
    public int? Disabled { get; set; }
    /// <summary>
    ///     è½®æ’­æ—¶é—´(秒)
    /// </summary>
    [SugarColumn(ColumnName = "lbtime")]
    public int? Lbtime { get; set; }
}
entity/MesSimpleCcb.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
using SqlSugar;
namespace NewPdaSqlServer.entity;
/// <summary>
///     BI视图表 - å­˜å‚¨æ¯ä¸ªèœå•下具体的BI看板链接
/// </summary>
[SugarTable("MES_SIMPLE_CCB")]
public class MesSimpleCcb
{
    /// <summary>
    ///     ä¸»é”®ID
    /// </summary>
    [SugarColumn(ColumnName = "id", IsPrimaryKey = true)]
    public int Id { get; set; }
    /// <summary>
    ///     çˆ¶èŠ‚ç‚¹ID (关联MES_SIMPLE.id)
    /// </summary>
    [SugarColumn(ColumnName = "pid")]
    public int? Pid { get; set; }
    /// <summary>
    ///     BI视图名称
    /// </summary>
    [SugarColumn(ColumnName = "name")]
    public string? Name { get; set; }
    /// <summary>
    ///     BI看板完整URL地址
    /// </summary>
    [SugarColumn(ColumnName = "href")]
    public string? Href { get; set; }
    /// <summary>
    ///     è½®æ’­æ—¶é—´(秒) - å®žé™…使用时会被父菜单的lbtime覆盖
    /// </summary>
    [SugarColumn(ColumnName = "lbtime")]
    public int? Lbtime { get; set; }
}
service/Simple/SimpleManager.cs
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,212 @@
using NewPdaSqlServer.DB;
using NewPdaSqlServer.Dto.Simple;
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();
            return ResultDto<List<TreeViewDto>>.Ok(tree, tree.Count);
        }
        catch (Exception ex)
        {
            return ResultDto<List<TreeViewDto>>.Error(ex.Message);
        }
    }
    /// <summary>
    ///     è½¬æ¢ä¸ºæ ‘形结构
    ///     å¯¹åº”Java: toTree()
    /// </summary>
    /// <returns>树形视图列表</returns>
    public List<TreeViewDto> ToTree()
    {
        return ConvertToTreeViewList(GetTopList());
    }
    /// <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)
                .Select(m => new MesSimpleDto
                {
                    Id = m.Id,
                    IsTop = m.IsTop,
                    Fid = m.Fid,
                    Title = m.Title,
                    Field = m.Field,
                    Href = m.Href,
                    Spread = m.Spread,
                    Disabled = m.Disabled,
                    Lbtime = m.Lbtime
                })
                .ToList();
            return ResultDto<List<MesSimpleDto>>.Ok(list, list.Count);
        }
        catch (Exception ex)
        {
            return ResultDto<List<MesSimpleDto>>.Error(ex.Message);
        }
    }
    /// <summary>
    ///     æ ¹æ®èœå•ID获取BI视图列表
    ///     å¯¹åº”Java: getBiViewsByMenuId()
    /// </summary>
    /// <param name="menuId">菜单ID</param>
    /// <returns>BI视图列表</returns>
    public ResultDto<List<BiViewDto>> GetBiViewsByMenuId(int menuId)
    {
        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();
            // å¦‚果有数据,获取父菜单的轮播时间配置并赋值给所有BI视图
            if (list.Count > 0)
            {
                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
            };
            // å¤„理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);
        }
        treeView.Children = childrenList;
        return treeView;
    }
    #endregion
}