namespace Admin.NET.Plugin.AiDOP.Universal; /// /// 通用物料选择服务 📦 /// 路由前缀:/api/Universal /// [ApiDescriptionSettings(Order = 279, Description = "通用-物料选择")] [Route("api/Universal")] [AllowAnonymous] [NonUnify] public class UniversalItemService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; public UniversalItemService(ISqlSugarClient db) { _db = db; } // 允许排序的字段白名单(key=前端 prop,value=数据库列名) private static readonly Dictionary _sortFieldMap = new(StringComparer.OrdinalIgnoreCase) { ["itemnum"] = "ItemNum", ["descr"] = "Descr", ["descr1"] = "Descr1", ["um"] = "UM", ["location"] = "Location", ["rev"] = "Rev", ["drawing"] = "Drawing", }; /// 获取物料选择分页列表 📦 [DisplayName("获取物料选择列表")] [HttpGet("item/page")] public async Task GetItemPage([FromQuery] ItemPageInput input) { var conditions = new List(); var pars = new List(); if (!string.IsNullOrWhiteSpace(input.ItemNum)) { conditions.Add("ItemNum LIKE @ItemNum"); pars.Add(new SugarParameter("@ItemNum", $"%{input.ItemNum.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.Descr)) { conditions.Add("Descr LIKE @Descr"); pars.Add(new SugarParameter("@Descr", $"%{input.Descr.Trim()}%")); } var where = conditions.Count > 0 ? string.Join(" AND ", conditions) : "1=1"; var dbSortField = _sortFieldMap.TryGetValue(input.SortField ?? "", out var mapped) ? mapped : "ItemNum"; var sortOrder = string.Equals(input.SortOrder, "desc", StringComparison.OrdinalIgnoreCase) ? "DESC" : "ASC"; var offset = (input.Page - 1) * input.PageSize; var total = await _db.Ado.GetIntAsync( $"SELECT COUNT(*) FROM ItemMaster WHERE {where}", pars); var list = await _db.Ado.SqlQueryAsync( $"SELECT RecID AS RecId, ItemNum, Descr, Descr1, UM AS Um, Location, Rev, Drawing FROM ItemMaster WHERE {where} ORDER BY {dbSortField} {sortOrder} LIMIT {input.PageSize} OFFSET {offset}", pars); return new { total, page = input.Page, pageSize = input.PageSize, list }; } // ──────────────── 内部结果映射 ──────────────── private sealed class ItemRow { public string? RecId { get; set; } public string? ItemNum { get; set; } public string? Descr { get; set; } public string? Descr1 { get; set; } public string? Um { get; set; } public string? Location { get; set; } public string? Rev { get; set; } public string? Drawing { get; set; } } } /// 物料选择分页查询入参 public class ItemPageInput { public int Page { get; set; } = 1; public int PageSize { get; set; } = 10; /// 物料编号(模糊) public string? ItemNum { get; set; } /// 物料名称(模糊) public string? Descr { get; set; } /// 排序字段(前端 prop 名) public string? SortField { get; set; } /// 排序方向:asc / desc public string? SortOrder { get; set; } }