UniversalCustomerService.cs 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. namespace Admin.NET.Plugin.AiDOP.Universal;
  2. /// <summary>
  3. /// 通用客户选择服务 🏢
  4. /// 路由前缀:/api/Universal
  5. /// </summary>
  6. [ApiDescriptionSettings(Order = 280, Description = "通用-客户选择")]
  7. [Route("api/Universal")]
  8. [AllowAnonymous]
  9. [NonUnify]
  10. public class UniversalCustomerService : IDynamicApiController, ITransient
  11. {
  12. private readonly ISqlSugarClient _db;
  13. public UniversalCustomerService(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. ["cust"] = "Cust",
  22. ["sortname"] = "SortName",
  23. };
  24. /// <summary>获取客户选择分页列表 🏢</summary>
  25. [DisplayName("获取客户选择列表")]
  26. [HttpGet("customer/page")]
  27. public async Task<object> GetCustomerPage([FromQuery] CustomerPageInput input)
  28. {
  29. var conditions = new List<string>();
  30. var pars = new List<SugarParameter>();
  31. if (!string.IsNullOrWhiteSpace(input.CustNo))
  32. {
  33. conditions.Add("Cust LIKE @CustNo");
  34. pars.Add(new SugarParameter("@CustNo", $"%{input.CustNo.Trim()}%"));
  35. }
  36. if (!string.IsNullOrWhiteSpace(input.SortName))
  37. {
  38. conditions.Add("SortName LIKE @SortName");
  39. pars.Add(new SugarParameter("@SortName", $"%{input.SortName.Trim()}%"));
  40. }
  41. var where = conditions.Count > 0 ? string.Join(" AND ", conditions) : "1=1";
  42. var dbSortField = _sortFieldMap.TryGetValue(input.SortField ?? "", out var mapped) ? mapped : "Cust";
  43. var sortOrder = string.Equals(input.SortOrder, "desc", StringComparison.OrdinalIgnoreCase) ? "DESC" : "ASC";
  44. var offset = (input.Page - 1) * input.PageSize;
  45. var total = await _db.Ado.GetIntAsync(
  46. $"SELECT COUNT(*) FROM CustMaster WHERE {where}", pars);
  47. var list = await _db.Ado.SqlQueryAsync<CustomerRow>(
  48. $"SELECT Cust, SortName, recid AS Id FROM CustMaster WHERE {where} ORDER BY {dbSortField} {sortOrder} LIMIT {input.PageSize} OFFSET {offset}",
  49. pars);
  50. return new { total, page = input.Page, pageSize = input.PageSize, list };
  51. }
  52. // ──────────────── 内部结果映射 ────────────────
  53. private sealed class CustomerRow
  54. {
  55. public string? Cust { get; set; }
  56. public string? SortName { get; set; }
  57. public string? Id { get; set; }
  58. }
  59. }
  60. /// <summary>客户选择分页查询入参</summary>
  61. public class CustomerPageInput
  62. {
  63. public int Page { get; set; } = 1;
  64. public int PageSize { get; set; } = 10;
  65. /// <summary>客户编号(模糊)</summary>
  66. public string? CustNo { get; set; }
  67. /// <summary>客户名称(模糊)</summary>
  68. public string? SortName { get; set; }
  69. /// <summary>排序字段(前端 prop 名)</summary>
  70. public string? SortField { get; set; }
  71. /// <summary>排序方向:asc / desc</summary>
  72. public string? SortOrder { get; set; }
  73. }