using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto; namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse; /// /// S5 来料检验申请列表 服务(只读)。 /// /// 数据源:主库 aidopdev 表 qms_qcp_inspecapplyn(贴源 QMS 申请主表)。 /// 一期降级方案②:仅查询/展示表内可直接真实渲染的字段 /// FBILLNO 单据编号 / FBILLTYPE 单据类型(原值) / FAPPLYTIME 申请时间 / FCOMMENT 备注。 /// 不查询 FORGID / FBIZTYPE / FAPPLYUSER —— 名称解析源(bos_org / qcbd_biztype / bos_user) /// 当前不在 aidopdev,不做脑补 join、不显示裸 ID。 /// /// 租户/工厂:qms_qcp_inspecapplyn 无 tenant_id / domain / factory 列(贴源表本身不带租户维度), /// 故本接口在表结构层面无可用租户过滤列,不新增前端 factory 选择,亦不脑补租户列。 /// /// 本接口只读:仅 SELECT,无新增/编辑/删除/任务拆分/状态回写。 /// [ApiDescriptionSettings(Order = 305, Description = "来料检验申请")] [Route("api/IncomingInspection")] [AllowAnonymous] [NonUnify] public class IncomingInspectionApplicationService : IDynamicApiController, ITransient { private readonly ISqlSugarClient _db; public IncomingInspectionApplicationService(ISqlSugarClient db) { _db = db; } /// /// 来料检验申请列表(只读分页查询)。 /// [DisplayName("来料检验申请列表")] [HttpGet("application/list")] public async Task GetList([FromQuery] IncomingInspectionApplicationListInput input) { var page = input.Page <= 0 ? 1 : input.Page; var pageSize = input.PageSize <= 0 ? 10 : input.PageSize; var offset = (page - 1) * pageSize; var where = new List { "1=1" }; var pars = new List(); if (!string.IsNullOrWhiteSpace(input.BillNo)) { where.Add("m.FBILLNO LIKE @BillNo"); pars.Add(new SugarParameter("@BillNo", $"%{input.BillNo.Trim()}%")); } if (!string.IsNullOrWhiteSpace(input.ApplyTimeStart)) { where.Add("m.FAPPLYTIME >= @ApplyTimeStart"); pars.Add(new SugarParameter("@ApplyTimeStart", $"{input.ApplyTimeStart.Trim()} 00:00:00")); } if (!string.IsNullOrWhiteSpace(input.ApplyTimeEnd)) { where.Add("m.FAPPLYTIME <= @ApplyTimeEnd"); pars.Add(new SugarParameter("@ApplyTimeEnd", $"{input.ApplyTimeEnd.Trim()} 23:59:59")); } var whereSql = string.Join(" AND ", where); var total = await _db.Ado.GetIntAsync( $"SELECT COUNT(1) FROM qms_qcp_inspecapplyn m WHERE {whereSql}", pars); var list = await _db.Ado.SqlQueryAsync( $""" SELECT m.id AS Id, m.FBILLNO AS FBillNo, m.FBILLTYPE AS FBillType, m.FAPPLYTIME AS FApplyTime, m.FCOMMENT AS FComment FROM qms_qcp_inspecapplyn m WHERE {whereSql} ORDER BY {BuildOrderBy(input.SortField, input.SortOrder)} LIMIT {pageSize} OFFSET {offset} """, pars); return new { total, page, pageSize, list }; } /// /// 排序白名单:仅允许按已展示列排序,杜绝 SQL 注入。 /// private static string BuildOrderBy(string? sortField, string? sortOrder) { var column = sortField switch { "fBillNo" => "m.FBILLNO", "fApplyTime" => "m.FAPPLYTIME", _ => "m.FAPPLYTIME", }; var direction = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC"; return $"{column} {direction}, m.id DESC"; } }