UniversalSourceListService.cs 4.6 KB

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