|
|
@@ -0,0 +1,99 @@
|
|
|
+namespace Admin.NET.Plugin.AiDOP.Universal;
|
|
|
+
|
|
|
+/// <summary>
|
|
|
+/// 通用物料选择服务 📦
|
|
|
+/// 路由前缀:/api/Universal
|
|
|
+/// </summary>
|
|
|
+[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<string, string> _sortFieldMap =
|
|
|
+ new(StringComparer.OrdinalIgnoreCase)
|
|
|
+ {
|
|
|
+ ["itemnum"] = "ItemNum",
|
|
|
+ ["descr"] = "Descr",
|
|
|
+ ["descr1"] = "Descr1",
|
|
|
+ ["um"] = "UM",
|
|
|
+ ["location"] = "Location",
|
|
|
+ ["rev"] = "Rev",
|
|
|
+ ["drawing"] = "Drawing",
|
|
|
+ };
|
|
|
+
|
|
|
+ /// <summary>获取物料选择分页列表 📦</summary>
|
|
|
+ [DisplayName("获取物料选择列表")]
|
|
|
+ [HttpGet("item/page")]
|
|
|
+ public async Task<object> GetItemPage([FromQuery] ItemPageInput input)
|
|
|
+ {
|
|
|
+ var conditions = new List<string>();
|
|
|
+ var pars = new List<SugarParameter>();
|
|
|
+
|
|
|
+ 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<ItemRow>(
|
|
|
+ $"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; }
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+/// <summary>物料选择分页查询入参</summary>
|
|
|
+public class ItemPageInput
|
|
|
+{
|
|
|
+ public int Page { get; set; } = 1;
|
|
|
+ public int PageSize { get; set; } = 10;
|
|
|
+
|
|
|
+ /// <summary>物料编号(模糊)</summary>
|
|
|
+ public string? ItemNum { get; set; }
|
|
|
+
|
|
|
+ /// <summary>物料名称(模糊)</summary>
|
|
|
+ public string? Descr { get; set; }
|
|
|
+
|
|
|
+ /// <summary>排序字段(前端 prop 名)</summary>
|
|
|
+ public string? SortField { get; set; }
|
|
|
+
|
|
|
+ /// <summary>排序方向:asc / desc</summary>
|
|
|
+ public string? SortOrder { get; set; }
|
|
|
+}
|