From 64e45c6c5817e3d9d823180946f3b4aa78fe6b6d Mon Sep 17 00:00:00 2001
From: huawei <huawei@2214094776>
Date: 星期一, 22 十二月 2025 10:48:10 +0800
Subject: [PATCH] 看板维护

---
 WebApi/Gs.Sys/Services/MesSimpleManager.cs |  316 +++++++++++++++++++++++++++++++++++++++
 WebApi/Gs.Sys/Models/MesSimple.cs          |  118 ++++++++++++++
 WebApi/Gs.HostIIS/appsettings.json         |    2 
 3 files changed, 435 insertions(+), 1 deletions(-)

diff --git a/WebApi/Gs.HostIIS/appsettings.json b/WebApi/Gs.HostIIS/appsettings.json
index 7526a1b..0316f38 100644
--- a/WebApi/Gs.HostIIS/appsettings.json
+++ b/WebApi/Gs.HostIIS/appsettings.json
@@ -6,7 +6,7 @@
     }
   },
   "AllowedHosts": "*",
-  "ConnectionStrings": "Data Source=192.168.8.8;Initial Catalog=YS_MES;User ID=sa;Password =JianHui@2025",
+  "ConnectionStrings": "Data Source=192.168.8.8;Initial Catalog=GS_MES;User ID=sa;Password =JianHui@2025",
   "TestErpUrl": "http://60.204.140.168:8080//kingdee/billWriteIn",
   "TestErpUrl2": "http://60.204.140.168:8080//kingdee/transferDirect",
   "TestErpUrl3": "http://60.204.140.168:8080//kingdee/updateShdStatus",
diff --git a/WebApi/Gs.Sys/Models/MesSimple.cs b/WebApi/Gs.Sys/Models/MesSimple.cs
new file mode 100644
index 0000000..df117f7
--- /dev/null
+++ b/WebApi/Gs.Sys/Models/MesSimple.cs
@@ -0,0 +1,118 @@
+using SqlSugar;
+
+namespace GS.Sys.Models;
+
+/// <summary>
+///     看板目录表(优化后)
+/// </summary>
+[SugarTable("MES_SIMPLE")]
+public class MesSimple
+{
+    /// <summary>
+    ///     主键ID (自增)
+    /// </summary>
+    [SugarColumn(ColumnName = "id", IsPrimaryKey = true, IsIdentity = true)]
+    public long Id { get; set; }
+
+    /// <summary>
+    ///     父节点ID
+    /// </summary>
+    [SugarColumn(ColumnName = "parent_id")]
+    public long? ParentId { get; set; }
+
+    /// <summary>
+    ///     节点层级 (0=根节点, 1=一级子节点...)
+    /// </summary>
+    [SugarColumn(ColumnName = "node_level")]
+    public int NodeLevel { get; set; }
+
+    /// <summary>
+    ///     节点类型 (0=目录, 1=轮播目录,2=轮播内容...)
+    /// </summary>
+    [SugarColumn(ColumnName = "node_type")]
+    public byte NodeType { get; set; }
+
+    /// <summary>
+    ///     唯一编码
+    /// </summary>
+    [SugarColumn(ColumnName = "code")]
+    public string? Code { get; set; }
+
+    /// <summary>
+    ///     名称
+    /// </summary>
+    [SugarColumn(ColumnName = "title")]
+    public string Title { get; set; }
+
+    /// <summary>
+    ///     链接地址
+    /// </summary>
+    [SugarColumn(ColumnName = "url")]
+    public string? Url { get; set; }
+
+    /// <summary>
+    ///     轮播时长(秒)
+    /// </summary>
+    [SugarColumn(ColumnName = "carousel_duration")]
+    public int? CarouselDuration { get; set; }
+
+    /// <summary>
+    ///     是否默认展开
+    /// </summary>
+    [SugarColumn(ColumnName = "is_expanded")]
+    public bool IsExpanded { get; set; }
+
+    /// <summary>
+    ///     是否启用
+    /// </summary>
+    [SugarColumn(ColumnName = "is_enabled")]
+    public bool IsEnabled { get; set; }
+
+    /// <summary>
+    ///     排序序号
+    /// </summary>
+    [SugarColumn(ColumnName = "sort_order")]
+    public int SortOrder { get; set; }
+
+    /// <summary>
+    ///     创建人
+    /// </summary>
+    [SugarColumn(ColumnName = "created_by")]
+    public string CreatedBy { get; set; }
+
+    /// <summary>
+    ///     创建时间
+    /// </summary>
+    [SugarColumn(ColumnName = "created_at")]
+    public DateTime CreatedAt { get; set; }
+
+    /// <summary>
+    ///     更新人
+    /// </summary>
+    [SugarColumn(ColumnName = "updated_by")]
+    public string? UpdatedBy { get; set; }
+
+    /// <summary>
+    ///     更新时间
+    /// </summary>
+    [SugarColumn(ColumnName = "updated_at")]
+    public DateTime? UpdatedAt { get; set; }
+
+    /// <summary>
+    ///     是否已删除(软删除)
+    /// </summary>
+    [SugarColumn(ColumnName = "is_deleted")]
+    public bool IsDeleted { get; set; }
+
+    /// <summary>
+    ///     删除人
+    /// </summary>
+    [SugarColumn(ColumnName = "deleted_by")]
+    public string? DeletedBy { get; set; }
+
+    /// <summary>
+    ///     删除时间
+    /// </summary>
+    [SugarColumn(ColumnName = "deleted_at")]
+    public DateTime? DeletedAt { get; set; }
+}
diff --git a/WebApi/Gs.Sys/Services/MesSimpleManager.cs b/WebApi/Gs.Sys/Services/MesSimpleManager.cs
new file mode 100644
index 0000000..983127c
--- /dev/null
+++ b/WebApi/Gs.Sys/Services/MesSimpleManager.cs
@@ -0,0 +1,316 @@
+using Gs.Toolbox;
+using Gs.Toolbox.ApiCore.Abstract.Mvc;
+using Gs.Toolbox.ApiCore.Common.Mvc;
+using Gs.Toolbox.ApiCore.Group;
+using GS.Sys.Models;
+using Microsoft.AspNetCore.Http;
+using Microsoft.AspNetCore.Http.HttpResults;
+using Microsoft.AspNetCore.Mvc;
+using Newtonsoft.Json.Linq;
+using System.Data;
+using System.Data.SqlClient;
+
+namespace GS.Sys.Service;
+
+/// <summary>
+///     看板目录管理(存储过程版本)
+/// </summary>
+[ApiGroup(ApiGroupNames.Sys)]
+public class MesSimpleManager : Repository<MesSimple>, IRomteService
+{
+    private readonly IHttpContextAccessor _http;
+    private readonly string _userCode, _userGuid, _orgFids;
+
+    public MesSimpleManager(IHttpContextAccessor httpContextAccessor)
+    {
+        _http = httpContextAccessor;
+        (_userCode, _userGuid, _orgFids) = UtilityHelper.GetUserGuidAndOrgGuid(_http);
+    }
+
+    /// <summary>
+    ///     查询列表,支持分页
+    /// </summary>
+    [RequestMethod(RequestMethods.POST)]
+    public ReturnDto<PageList<dynamic>> GetListPage(PageQuery query)
+    {
+        try
+        {
+            // 添加 'a.' 前缀以匹配存储过程
+            var sortField = "a." + (query.sortName?.Replace("a.", "") ?? "sort_order");
+            var sortOrder = query.sortOrder?.ToUpper() ?? "ASC";
+
+            // 构建存储过程参数
+            var parameters = new SqlParameter[]
+            {
+                new SqlParameter("@pageIndex", SqlDbType.Int) { Value = query.currentPage },
+                new SqlParameter("@pageSize", SqlDbType.Int) { Value = query.everyPageSize },
+                new SqlParameter("@sortField", SqlDbType.NVarChar, 50) { Value = sortField },
+                new SqlParameter("@sortOrder", SqlDbType.NVarChar, 10) { Value = sortOrder },
+                new SqlParameter("@keyWord", SqlDbType.NVarChar, 100) { Value = query.keyWord ?? "" },
+                new SqlParameter("@keyWhere", SqlDbType.NVarChar, -1) { Value = "" }
+            };
+
+            // 调用存储过程(注意名称)
+            var dset = DbHelperSQL.RunProcedure("proc_MesSimple_GetListPage", parameters, "ResultSet");
+
+            if (dset == null || dset.Tables.Count == 0 || dset.Tables[0].Rows.Count == 0)
+            {
+                var emptyList = new PageList<dynamic>(new List<dynamic>(), 0, query.everyPageSize);
+                return ReturnDto<PageList<dynamic>>.QuickReturn<PageList<dynamic>>(emptyList, ReturnCode.Success, "暂无数据");
+            }
+
+            // 获取总记录数
+            var totalCount = 0;
+            if (dset.Tables[0].Rows.Count > 0)
+            {
+                var firstRow = dset.Tables[0].Rows[0];
+                if (firstRow.Table.Columns.Contains("totalCount"))
+                {
+                    totalCount = Convert.ToInt32(firstRow["totalCount"]);
+                }
+            }
+
+            // 转换为动态对象列表
+            var itemsList = dset.Tables[0].TableToDynamicList();
+
+            var pageList = new PageList<dynamic>(itemsList, totalCount, query.everyPageSize);
+            return ReturnDto<PageList<dynamic>>.QuickReturn<PageList<dynamic>>(pageList, ReturnCode.Success, "读取成功");
+        }
+        catch (Exception ex)
+        {
+            LogHelper.Debug(ToString(), $"GetListPage error: {ex.Message}\nStackTrace: {ex.StackTrace}");
+            var emptyList = new PageList<dynamic>(new List<dynamic>(), 0, query.everyPageSize);
+            return ReturnDto<PageList<dynamic>>.QuickReturn<PageList<dynamic>>(emptyList, ReturnCode.Exception, "查询失败:" + ex.Message);
+        }
+    }
+
+    /// <summary>
+    ///     读取单条记录
+    /// </summary>
+    [RequestMethod(RequestMethods.POST)]
+    public ReturnDto<dynamic> GetModel([FromBody] MesSimple model)
+    {
+        try
+        {
+            var parameters = new SqlParameter[]
+            {
+                new SqlParameter("@id", SqlDbType.BigInt) { Value = model.Id }
+            };
+
+            var dset = DbHelperSQL.RunProcedure("proc_MesSimple_GetModel", parameters, "ResultSet");
+
+            if (dset == null || dset.Tables.Count == 0 || dset.Tables[0].Rows.Count == 0)
+            {
+                return ReturnDto<dynamic>.QuickReturn<dynamic>(null, ReturnCode.Default, "数据不存在!");
+            }
+
+            var m = dset.Tables[0].Rows[0].RowToDynamic();
+            return ReturnDto<dynamic>.QuickReturn<dynamic>(m, ReturnCode.Success, "读取成功!");
+        }
+        catch (Exception ex)
+        {
+            LogHelper.Debug(ToString(), $"GetModel error: {ex.Message}");
+            return ReturnDto<dynamic>.QuickReturn<dynamic>(null, ReturnCode.Exception, "读取失败:" + ex.Message);
+        }
+    }
+
+    /// <summary>
+    ///     保存数据 (新增/修改)
+    /// </summary>
+    [RequestMethod(RequestMethods.POST)]
+    public ReturnDto<string> SaveModel([FromBody] MesSimple model)
+    {
+        try
+        {
+            if (string.IsNullOrWhiteSpace(model.Title))
+            {
+                return ReturnDto<string>.QuickReturn("", ReturnCode.Default, "名称不能为空!");
+            }
+
+            var parameters = new SqlParameter[]
+            {
+                new SqlParameter("@id", SqlDbType.BigInt) { Value = model.Id },
+                new SqlParameter("@parentId", SqlDbType.BigInt) { Value = model.ParentId.HasValue ? (object)model.ParentId.Value : DBNull.Value },
+                new SqlParameter("@nodeType", SqlDbType.TinyInt) { Value = model.NodeType },
+                new SqlParameter("@code", SqlDbType.NVarChar, 50) { Value = string.IsNullOrEmpty(model.Code) ? DBNull.Value : model.Code },
+                new SqlParameter("@title", SqlDbType.NVarChar, 255) { Value = model.Title },
+                new SqlParameter("@url", SqlDbType.NVarChar, 500) { Value = string.IsNullOrEmpty(model.Url) ? DBNull.Value : model.Url },
+                new SqlParameter("@carouselDuration", SqlDbType.Int) { Value = model.CarouselDuration.HasValue ? (object)model.CarouselDuration.Value : DBNull.Value },
+                new SqlParameter("@isExpanded", SqlDbType.Bit) { Value = model.IsExpanded },
+                new SqlParameter("@isEnabled", SqlDbType.Bit) { Value = model.IsEnabled },
+                new SqlParameter("@sortOrder", SqlDbType.Int) { Value = model.SortOrder },
+                new SqlParameter("@userCode", SqlDbType.NVarChar, 50) { Value = _userCode ?? "SYSTEM" },
+                new SqlParameter("@outId", SqlDbType.BigInt) { Direction = ParameterDirection.Output },
+                new SqlParameter("@outMsg", SqlDbType.NVarChar, 500) { Direction = ParameterDirection.Output }
+            };
+            // 添加调试日志
+            LogHelper.Debug(ToString(), $"SaveModel - 参数数量: {parameters.Length}");
+            DbHelperSQL.RunProcedure("proc_MesSimple_Save", parameters, "0");//ResultSet
+            var outId = parameters[11].Value != DBNull.Value ? Convert.ToInt64(parameters[11].Value) : 0;
+            var outMsg = parameters[12].Value != DBNull.Value ? parameters[12].Value.ToString() : "操作成功";
+
+            if (outId > 0)
+            {
+                return ReturnDto<string>.QuickReturn(outId.ToString(), ReturnCode.Success, outMsg);
+            }
+            else
+            {
+                return ReturnDto<string>.QuickReturn("", ReturnCode.Default, outMsg);
+            }
+        }
+        catch (Exception ex)
+        {
+            LogHelper.Debug(ToString(), $"SaveModel error: {ex.Message}");
+            return ReturnDto<string>.QuickReturn("", ReturnCode.Exception, "保存失败:" + ex.Message);
+        }
+    }
+
+    /// <summary>
+    ///     删除数据 (软删除) - 修复版
+    /// </summary>
+    [RequestMethod(RequestMethods.POST)]
+    public ReturnDto<int> DeleteModel([FromBody] JToken data)
+    {
+        try
+        {
+            string idStr = null;
+
+            LogHelper.Debug(ToString(), $"DeleteModel received: {data?.ToString()}, Type: {data?.Type}");
+
+            if (data == null)
+            {
+                return ReturnDto<int>.QuickReturn(0, ReturnCode.Default, "请选择要删除的数据!");
+            }
+
+            // 智能解析各种数据格式
+            if (data is JArray jArray)
+            {
+                if (jArray.Count == 0)
+                {
+                    return ReturnDto<int>.QuickReturn(0, ReturnCode.Default, "请选择要删除的数据!");
+                }
+                idStr = jArray[0].ToString();
+            }
+            else if (data is JValue jValue)
+            {
+                idStr = jValue.ToString();
+            }
+            else if (data is JObject jObject)
+            {
+                idStr = jObject["id"]?.ToString() ?? jObject["Id"]?.ToString();
+            }
+            else
+            {
+                idStr = data.ToString();
+            }
+
+            if (string.IsNullOrEmpty(idStr) || !long.TryParse(idStr, out long id))
+            {
+                return ReturnDto<int>.QuickReturn(0, ReturnCode.Default, $"无效的ID:{idStr}");
+            }
+
+            LogHelper.Debug(ToString(), $"DeleteModel parsed ID: {id}");
+
+            // 调用存储过程(注意参数名是 @ids)
+            var parameters = new SqlParameter[]
+            {
+                new SqlParameter("@ids", SqlDbType.NVarChar, -1) { Value = id.ToString() },
+                new SqlParameter("@userCode", SqlDbType.NVarChar, 50) { Value = _userCode ?? "SYSTEM" },
+                new SqlParameter("@outCode", SqlDbType.Int) { Direction = ParameterDirection.Output },
+                new SqlParameter("@outMsg", SqlDbType.NVarChar, 500) { Direction = ParameterDirection.Output }
+            };
+
+            DbHelperSQL.RunProcedure("proc_MesSimple_Delete", parameters, "0");
+
+            var outCode = parameters[2].Value != DBNull.Value ? Convert.ToInt32(parameters[2].Value) : 0;
+            var outMsg = parameters[3].Value != DBNull.Value ? parameters[3].Value.ToString() : "未知错误";
+
+            LogHelper.Debug(ToString(), $"DeleteModel result: code={outCode}, msg={outMsg}");
+
+            if (outCode > 0)
+            {
+                return ReturnDto<int>.QuickReturn(outCode, ReturnCode.Success, outMsg);
+            }
+            else
+            {
+                return ReturnDto<int>.QuickReturn(0, ReturnCode.Default, outMsg);
+            }
+        }
+        catch (Exception ex)
+        {
+            LogHelper.Debug(ToString(), $"DeleteModel error: {ex.Message}\n{ex.StackTrace}");
+            return ReturnDto<int>.QuickReturn(0, ReturnCode.Exception, "删除失败:" + ex.Message);
+        }
+    }
+
+    /// <summary>
+    ///     获取树形结构
+    /// </summary>
+    [RequestMethod(RequestMethods.POST)]
+    public ReturnDto<List<dynamic>> GetTree(long? rootId = null)
+    {
+        try
+        {
+            var parameters = new SqlParameter[]
+            {
+                new SqlParameter("@RootId", SqlDbType.BigInt) { Value = rootId.HasValue ? (object)rootId.Value : DBNull.Value }
+            };
+
+            var dset = DbHelperSQL.RunProcedure("usp_MesSimple_GetTree", parameters, "ResultSet");
+
+            if (dset == null || dset.Tables.Count == 0)
+            {
+                return ReturnDto<List<dynamic>>.QuickReturn<List<dynamic>>(new List<dynamic>(), ReturnCode.Success, "暂无数据");
+            }
+
+            var treeList = dset.Tables[0].TableToDynamicList();
+            return ReturnDto<List<dynamic>>.QuickReturn<List<dynamic>>(treeList, ReturnCode.Success, "读取成功");
+        }
+        catch (Exception ex)
+        {
+            LogHelper.Debug(ToString(), $"GetTree error: {ex.Message}");
+            return ReturnDto<List<dynamic>>.QuickReturn<List<dynamic>>(new List<dynamic>(), ReturnCode.Exception, "查询失败:" + ex.Message);
+        }
+    }
+
+    /// <summary>
+    ///     更新排序序号
+    /// </summary>
+    [RequestMethod(RequestMethods.POST)]
+    public ReturnDto<bool> UpdateSortOrder(long id, int sortOrder)
+    {
+        try
+        {
+            var parameters = new SqlParameter[]
+            {
+                new SqlParameter("@Id", SqlDbType.BigInt) { Value = id },
+                new SqlParameter("@NewSortOrder", SqlDbType.Int) { Value = sortOrder }
+            };
+
+            var dset = DbHelperSQL.RunProcedure("usp_MesSimple_UpdateSortOrder", parameters, "ResultSet");
+
+            if (dset != null && dset.Tables.Count > 0 && dset.Tables[0].Rows.Count > 0)
+            {
+                var row = dset.Tables[0].Rows[0];
+                var rtnCode = Convert.ToInt32(row["rtnCode"]);
+                var rtnMsg = row["rtnMsg"].ToString();
+
+                if (rtnCode > 0)
+                {
+                    return ReturnDto<bool>.QuickReturn(true, ReturnCode.Success, rtnMsg);
+                }
+                else
+                {
+                    return ReturnDto<bool>.QuickReturn(false, ReturnCode.Default, rtnMsg);
+                }
+            }
+
+            return ReturnDto<bool>.QuickReturn(false, ReturnCode.Default, "更新失败!");
+        }
+        catch (Exception ex)
+        {
+            LogHelper.Debug(ToString(), $"UpdateSortOrder error: {ex.Message}");
+            return ReturnDto<bool>.QuickReturn(false, ReturnCode.Exception, "更新失败:" + ex.Message);
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.9.3