UniversalItemService.cs 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. namespace Admin.NET.Plugin.AiDOP.Universal;
  2. /// <summary>
  3. /// 通用物料选择服务 📦
  4. /// 路由前缀:/api/Universal
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 279, Description = "通用-物料选择")]
  7. [Route("api/Universal")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class UniversalItemService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. public UniversalItemService(ISqlSugarClient db)
  14. {
  15. _db = db;
  16. }
  17. // 允许排序的字段白名单(key=前端 prop,value=数据库列名)
  18. private static readonly Dictionary<string, string> _sortFieldMap =
  19. new(StringComparer.OrdinalIgnoreCase)
  20. {
  21. ["itemnum"] = "ItemNum",
  22. ["descr"] = "Descr",
  23. ["descr1"] = "Descr1",
  24. ["um"] = "UM",
  25. ["location"] = "Location",
  26. ["rev"] = "Rev",
  27. ["drawing"] = "Drawing",
  28. };
  29. /// <summary>获取物料选择分页列表 📦</summary>
  30. [DisplayName("获取物料选择列表")]
  31. [HttpGet("item/page")]
  32. public async Task<object> GetItemPage([FromQuery] ItemPageInput input)
  33. {
  34. var conditions = new List<string>();
  35. var pars = new List<SugarParameter>();
  36. if (!string.IsNullOrWhiteSpace(input.ItemNum))
  37. {
  38. conditions.Add("ItemNum LIKE @ItemNum");
  39. pars.Add(new SugarParameter("@ItemNum", $"%{input.ItemNum.Trim()}%"));
  40. }
  41. if (!string.IsNullOrWhiteSpace(input.Descr))
  42. {
  43. conditions.Add("Descr LIKE @Descr");
  44. pars.Add(new SugarParameter("@Descr", $"%{input.Descr.Trim()}%"));
  45. }
  46. var where = conditions.Count > 0 ? string.Join(" AND ", conditions) : "1=1";
  47. var dbSortField = _sortFieldMap.TryGetValue(input.SortField ?? "", out var mapped) ? mapped : "ItemNum";
  48. var sortOrder = string.Equals(input.SortOrder, "desc", StringComparison.OrdinalIgnoreCase) ? "DESC" : "ASC";
  49. var offset = (input.Page - 1) * input.PageSize;
  50. var total = await _db.Ado.GetIntAsync(
  51. $"SELECT COUNT(*) FROM ItemMaster WHERE {where}", pars);
  52. var list = await _db.Ado.SqlQueryAsync<ItemRow>(
  53. $"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}",
  54. pars);
  55. return new { total, page = input.Page, pageSize = input.PageSize, list };
  56. }
  57. // ──────────────── 内部结果映射 ────────────────
  58. private sealed class ItemRow
  59. {
  60. public string? RecId { get; set; }
  61. public string? ItemNum { get; set; }
  62. public string? Descr { get; set; }
  63. public string? Descr1 { get; set; }
  64. public string? Um { get; set; }
  65. public string? Location { get; set; }
  66. public string? Rev { get; set; }
  67. public string? Drawing { get; set; }
  68. }
  69. }
  70. /// <summary>物料选择分页查询入参</summary>
  71. public class ItemPageInput
  72. {
  73. public int Page { get; set; } = 1;
  74. public int PageSize { get; set; } = 10;
  75. /// <summary>物料编号(模糊)</summary>
  76. public string? ItemNum { get; set; }
  77. /// <summary>物料名称(模糊)</summary>
  78. public string? Descr { get; set; }
  79. /// <summary>排序字段(前端 prop 名)</summary>
  80. public string? SortField { get; set; }
  81. /// <summary>排序方向:asc / desc</summary>
  82. public string? SortOrder { get; set; }
  83. }