using Admin.NET.Plugin.AiDOP.FinishedWarehouse.Dto;
namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
///
/// S7 FQC 成品质量:检验任务列表 / 检验单(结果)列表 只读 list 服务。
///
/// 数据源(均 aidopdev,只读):
/// - task-list :qms_fqcbj(37 列,归口自旧系统 dopdemo,空表待上游抽数)。yxj/FINSPECTSTATUS 原样透出,
/// rf_dictionary 优先级字典未接(CTO 拍板舍弃)。默认排序 FAPPLYTIME DESC, id DESC。
/// - result-list:qms_qcpp_inspbill 主表;SAP 工单号经 (SELECT MIN(wo.WorkOrd) FROM WorkOrdMaster wo
/// WHERE wo.Batch = a.sczld) 标量子查询取得(Batch 非唯一仅因 NULL;非空 Batch 现 1:1,
/// MIN 保确定性、杜绝行倍增)。默认排序 FINSPEENDDATE DESC, id DESC。
///
/// 归口说明(方案 A,复刻已闭环 S6 IPQC IpqcInspectionMdpSyncService.EnsureTablesAsync):
/// qms_fqcbj 原仅存于旧系统 dopdemo(0 行)、aidopdev 无此表,且 dopdemo 非运行时连接。
/// EnsureFqcTaskTableAsync 在 aidopdev 建同构空表(CREATE TABLE IF NOT EXISTS,DDL 例外、仅一次、零 DML),
/// 后续由上游一次性抽数填充,届时无需改代码即随查询流通。id 不设 AUTO_INCREMENT(抽数将携旧系统主键)。
///
/// 只读边界:纯 SELECT + 一次性 DDL 建空表;绝不 INSERT/UPDATE/DELETE 任何业务表、不写库存/仓储/生产状态、
/// 不接 ApprovalFlow、不做详情/子表(qms_qcpp_inspbillst 留下一批)/录入/审核/处置。两表无 tenant_id,不做租户过滤。
///
[ApiDescriptionSettings(Order = 330, Description = "FQC检验单列表")]
[Route("api/S7FqcInspBill")]
[AllowAnonymous]
[NonUnify]
public class FqcInspBillService : IDynamicApiController, ITransient
{
private readonly ISqlSugarClient _db;
/// 归口空表建表守卫:每进程仅尝试一次 CREATE TABLE IF NOT EXISTS。
private static int _taskTableEnsured;
/// 检验单明细子表归口空表建表守卫:每进程仅尝试一次。
private static int _detailTableEnsured;
public FqcInspBillService(ISqlSugarClient db)
{
_db = db;
}
/// 检验任务列表 排序白名单(前端 prop → 物理列,杜绝 orderBy 注入)。
private static readonly Dictionary TaskOrderWhitelist = new(StringComparer.OrdinalIgnoreCase)
{
["applyTime"] = "t.FAPPLYTIME",
["productionBatchNo"] = "t.scph",
["productionOrderNo"] = "t.sczld",
["materialCode"] = "t.wlbm",
["priority"] = "t.yxj",
["inspectStartTime"] = "t.jykssj",
["inspectFinishTime"] = "t.jywcsj",
["inspectProgress"] = "t.FINSPECTSTATUS",
};
/// 检验单列表 排序白名单(前端 prop → 物理列)。
private static readonly Dictionary ResultOrderWhitelist = new(StringComparer.OrdinalIgnoreCase)
{
["inspectTime"] = "a.FINSPEENDDATE",
["billNo"] = "a.FBILLNO",
["productionBatchNo"] = "a.scph",
["materialCode"] = "a.FMATERIALCFG",
["inspector"] = "a.jyr",
["inspectQty"] = "a.jysj",
["productionOrderNo"] = "a.sczld",
};
///
/// FQC 检验任务列表(只读分页查询,源 qms_fqcbj)。
///
[DisplayName("FQC检验任务列表")]
[HttpGet("task-list")]
public async Task