UniversalSourceListService.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. namespace Admin.NET.Plugin.AiDOP.Universal;
  2. /// <summary>
  3. /// 通用货源清单选择服务
  4. /// </summary>
  5. [ApiDescriptionSettings(Order = 280, Description = "通用-货源清单选择")]
  6. [Route("api/Universal")]
  7. [AllowAnonymous]
  8. [NonUnify]
  9. public class UniversalSourceListService : IDynamicApiController, ITransient
  10. {
  11. private const string C = "utf8mb4_general_ci";
  12. private readonly ISqlSugarClient _db;
  13. private readonly UserManager _userManager;
  14. public UniversalSourceListService(ISqlSugarClient db, UserManager userManager)
  15. {
  16. _db = db;
  17. _userManager = userManager;
  18. }
  19. [DisplayName("获取货源清单选择列表")]
  20. [HttpGet("source-list/page")]
  21. public async Task<object> GetPage([FromQuery] UniversalSourceListPageInput input)
  22. {
  23. var page = input.Page <= 0 ? 1 : input.Page;
  24. var pageSize = input.PageSize <= 0 ? 10 : input.PageSize;
  25. var offset = (page - 1) * pageSize;
  26. var tenantId = _userManager.TenantId;
  27. var pars = new List<SugarParameter>();
  28. var where = new List<string>
  29. {
  30. "sp.tenant_id = @TenantId",
  31. "(it.erp_cls=3 OR it.erp_cls=2)",
  32. "IFNULL(sp.quota_rate,0)>0",
  33. "IFNULL(sp.IsDeleted,0)=0"
  34. };
  35. if (!string.IsNullOrWhiteSpace(input.Number))
  36. {
  37. where.Add("it.number LIKE @Number");
  38. pars.Add(new SugarParameter("@Number", $"%{input.Number.Trim()}%"));
  39. }
  40. if (!string.IsNullOrWhiteSpace(input.IcitemName))
  41. {
  42. where.Add("sp.icitem_name LIKE @IcitemName");
  43. pars.Add(new SugarParameter("@IcitemName", $"%{input.IcitemName.Trim()}%"));
  44. }
  45. if (!string.IsNullOrWhiteSpace(input.SupplierNumber))
  46. {
  47. where.Add("sp.supplier_number LIKE @SupplierNumber");
  48. pars.Add(new SugarParameter("@SupplierNumber", $"%{input.SupplierNumber.Trim()}%"));
  49. }
  50. pars.Add(new SugarParameter("@TenantId", tenantId));
  51. var orderBy = BuildOrderBy(input.SortField, input.SortOrder);
  52. var fromSql = $"""
  53. FROM srm_purchase sp
  54. LEFT JOIN ic_item it ON sp.icitem_id = it.Id
  55. LEFT JOIN ItemMaster im ON (it.number COLLATE {C}) = (im.ItemNum COLLATE {C})
  56. WHERE {string.Join(" AND ", where)}
  57. """;
  58. var total = await _db.Ado.GetIntAsync($"SELECT COUNT(1) {fromSql}", pars);
  59. var list = await _db.Ado.SqlQueryAsync<UniversalSourceListOutput>(
  60. $"""
  61. SELECT
  62. sp.id AS Id,
  63. sp.tenant_id AS TenantId,
  64. sp.factory_id AS FactoryId,
  65. CAST(sp.icitem_id AS CHAR(30)) AS IcitemId,
  66. it.number AS Number,
  67. sp.icitem_name AS IcitemName,
  68. '原材料' AS ItemType,
  69. it.model AS Model,
  70. it.unit AS Unit,
  71. sp.supplier_type AS SupplierType,
  72. sp.is_active AS IsActive,
  73. sp.supplier_id AS SupplierId,
  74. sp.supplier_name AS SupplierName,
  75. sp.supplier_number AS SupplierNumber,
  76. sp.order_price AS OrderPrice,
  77. sp.currency_type AS CurrencyType,
  78. IFNULL(sp.taxrate,0) AS TaxRate,
  79. IFNULL(sp.tariff,0) AS Tariff,
  80. sp.freight AS Freight,
  81. sp.price_terms AS PriceTerms,
  82. sp.effective_date AS EffectiveDate,
  83. sp.expiring_date AS ExpiringDate,
  84. IFNULL(sp.quota_rate,0) AS QuotaRate,
  85. sp.lead_time AS LeadTime,
  86. sp.qty_min AS QtyMin,
  87. sp.packaging_qty AS PackagingQty,
  88. sp.order_rector_name AS OrderRectorName,
  89. sp.order_rector_num AS OrderRectorNum,
  90. CONCAT(IFNULL(it.number,''),IFNULL(sp.icitem_name,'')) AS Icitem,
  91. CONCAT(IFNULL(sp.supplier_name,''),IFNULL(sp.supplier_number,'')) AS Supplier,
  92. sp.IsRequireGoods AS IsRequireGoods,
  93. im.Location AS Location,
  94. im.UM AS Um,
  95. im.Rev AS Rev,
  96. im.Drawing AS Drawing
  97. {fromSql}
  98. ORDER BY {orderBy}
  99. LIMIT {pageSize} OFFSET {offset}
  100. """,
  101. pars);
  102. return new { total, page, pageSize, list };
  103. }
  104. private static string BuildOrderBy(string? sortField, string? sortOrder)
  105. {
  106. var dir = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
  107. return sortField?.ToLowerInvariant() switch
  108. {
  109. "number" => $"it.number {dir}",
  110. "icitemname" => $"sp.icitem_name {dir}",
  111. "suppliertype" => $"sp.supplier_type {dir}",
  112. "suppliernumber" => $"sp.supplier_number {dir}",
  113. "suppliername" => $"sp.supplier_name {dir}",
  114. "leadtime" => $"sp.lead_time {dir}",
  115. _ => "sp.id DESC"
  116. };
  117. }
  118. }