namespace Admin.NET.Plugin.AiDOP.Universal; /// /// 通用客户选择服务 🏢 /// 路由前缀:/api/Universal /// [ApiDescriptionSettings(Order = 280, Description = "通用-客户选择")] [Route("api/Universal")] [AllowAnonymous] [NonUnify] public class UniversalCustomerService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; public UniversalCustomerService(ISqlSugarClient db) { _db = db; } // 允许排序的字段白名单(key=前端 prop,value=数据库列名) private static readonly Dictionary _sortFieldMap = new(StringComparer.OrdinalIgnoreCase) { ["cust"] = "Cust", ["sortname"] = "SortName", }; /// 获取客户选择分页列表 🏢 [DisplayName("获取客户选择列表")] [HttpGet("customer/page")] public async Task GetCustomerPage([FromQuery] CustomerPageInput input) { var conditions = new List(); var pars = new List(); if (!string.IsNullOrWhiteSpace(input.CustNo)) { conditions.Add("Cust LIKE @CustNo"); pars.Add(new SugarParameter("@CustNo", $"%{input.CustNo.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.SortName)) { conditions.Add("SortName LIKE @SortName"); pars.Add(new SugarParameter("@SortName", $"%{input.SortName.Trim()}%")); } var where = conditions.Count > 0 ? string.Join(" AND ", conditions) : "1=1"; var dbSortField = _sortFieldMap.TryGetValue(input.SortField ?? "", out var mapped) ? mapped : "Cust"; 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 CustMaster WHERE {where}", pars); var list = await _db.Ado.SqlQueryAsync( $"SELECT Cust, SortName, recid AS Id FROM CustMaster 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 CustomerRow { public string? Cust { get; set; } public string? SortName { get; set; } public string? Id { get; set; } } } /// 客户选择分页查询入参 public class CustomerPageInput { public int Page { get; set; } = 1; public int PageSize { get; set; } = 10; /// 客户编号(模糊) public string? CustNo { get; set; } /// 客户名称(模糊) public string? SortName { get; set; } /// 排序字段(前端 prop 名) public string? SortField { get; set; } /// 排序方向:asc / desc public string? SortOrder { get; set; } }