| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- using Admin.NET.Plugin.AiDOP.Manufacturing.Dto;
- namespace Admin.NET.Plugin.AiDOP.Manufacturing;
- /// <summary>
- /// S6 过程检验单(IPQC)只读 list 服务。
- ///
- /// 数据源:DOP 数据中台标准层 mdp_std_ipqc_inspection(头)。
- /// 由 IpqcInspectionMdpSyncService 从归口后的 aidopdev.qms_gcjyd(过程检验单头)同步标准化而来。
- ///
- /// 本服务仅 SELECT:无新增/编辑/删除/写入。
- /// 当前上游尚未抽数,归口源表 qms_gcjyd 为空 → 标准层为空 → list 返回空数组(前端空态)。
- /// 明细(qms_gcjydzb)与详情不在本批范围,留待 IPQC-INSPECTION-DETAIL-READONLY-1。
- /// </summary>
- [ApiDescriptionSettings(Order = 306, Description = "过程检验单")]
- [Route("api/IpqcInspection")]
- [AllowAnonymous]
- [NonUnify]
- public class IpqcInspectionService : IDynamicApiController, ITransient
- {
- private readonly ISqlSugarClient _db;
- public IpqcInspectionService(ISqlSugarClient db)
- {
- _db = db;
- }
- /// <summary>
- /// 过程检验单列表(只读分页查询)。
- /// </summary>
- [DisplayName("过程检验单列表")]
- [HttpGet("list")]
- public async Task<object> GetList([FromQuery] IpqcInspectionListInput 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<string> { "1=1" };
- var pars = new List<SugarParameter>();
- if (input.TenantId is > 0)
- {
- where.Add("m.tenant_id = @TenantId");
- pars.Add(new SugarParameter("@TenantId", input.TenantId));
- }
- if (!string.IsNullOrWhiteSpace(input.BillNo))
- {
- where.Add("m.bill_no LIKE @BillNo");
- pars.Add(new SugarParameter("@BillNo", $"%{input.BillNo.Trim()}%"));
- }
- if (!string.IsNullOrWhiteSpace(input.ProductionBatchNo))
- {
- where.Add("m.production_batch_no LIKE @ProductionBatchNo");
- pars.Add(new SugarParameter("@ProductionBatchNo", $"%{input.ProductionBatchNo.Trim()}%"));
- }
- var whereSql = string.Join(" AND ", where);
- var total = await _db.Ado.GetIntAsync(
- $"SELECT COUNT(1) FROM mdp_std_ipqc_inspection m WHERE {whereSql}", pars);
- var list = await _db.Ado.SqlQueryAsync<IpqcInspectionListRow>(
- $"""
- SELECT
- m.id AS Id,
- m.bill_no AS BillNo,
- m.product_model AS ProductModel,
- m.production_batch_no AS ProductionBatchNo,
- m.production_work_order AS ProductionWorkOrder,
- m.result_judgement AS ResultJudgement,
- m.attachment AS Attachment,
- m.remark AS Remark,
- m.inspector AS Inspector,
- m.process_code AS ProcessCode,
- m.process_name AS ProcessName,
- m.production_person AS ProductionPerson,
- m.sample_qty AS SampleQty,
- m.form_no AS FormNo,
- m.version_no AS VersionNo,
- m.effective_date AS EffectiveDate,
- m.material_code AS MaterialCode,
- m.material_name AS MaterialName,
- m.inspec_standard_version AS InspecStandardVersion,
- m.inspec_standard_code AS InspecStandardCode
- FROM mdp_std_ipqc_inspection m
- WHERE {whereSql}
- ORDER BY {BuildOrderBy(input.SortField, input.SortOrder)}
- LIMIT {pageSize} OFFSET {offset}
- """,
- pars);
- return new { total, page, pageSize, list };
- }
- /// <summary>
- /// 排序白名单:仅允许按已展示列排序,杜绝 SQL 注入。
- /// </summary>
- private static string BuildOrderBy(string? sortField, string? sortOrder)
- {
- var column = sortField switch
- {
- "billNo" => "m.bill_no",
- "effectiveDate" => "m.effective_date",
- _ => "m.effective_date",
- };
- var direction = string.Equals(sortOrder, "asc", StringComparison.OrdinalIgnoreCase) ? "ASC" : "DESC";
- return $"{column} {direction}, m.id DESC";
- }
- }
|