using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
///
/// S5 来料检验单(qms_qcp_inspbill)只读 list 服务 —— 来料检验流程主入口。
///
/// 数据源:aidopdev.qms_qcp_inspbill 单表直读(不 join 申请主表/明细/SuppMaster/ApprovalFlow/SQE)。
/// 口径:检验单号=FBILLNO;来源单号=lydjbh;物料=FMATERIALCFG/wlmc/ggxh;供应商=gysmc(内嵌);
/// 批次=pch;数量=FRINSQTY/jysl/dhsl/bhgsl;判定=pd(raw);处理方式=clfs(raw);状态=FBILLSTATUS(raw);
/// 检验员=FINSPECTORID;检验起止=FINSPESTARTDATE/FINSPEENDDATE;创建=FCREATETIME。默认排序 FCREATETIME DESC, id DESC。
///
/// tenant/组织:qms_qcp_inspbill 已补 tenant_id 列,按严格可信租户过滤(需认证,租户仅取认证后 JWT,忽略前端 tenantId);FORGID 当前全 NULL,不做 FORGID 过滤。
/// 本服务仅 SELECT:无新增/编辑/删除/详情/判定录入/主管审核/SQE 处置/仓储通知/
/// 库存事务/流程实例;不写 qms_qcp_inspbill、不改 FBIZTYPE、不碰 ApprovalFlow。pd/clfs/FBILLSTATUS 字典未闭合,raw 展示。
///
[ApiDescriptionSettings(Order = 309, Description = "来料检验单列表")]
[Route("api/S5IqcInspBill")]
[NonUnify]
public class IqcInspBillService : IDynamicApiController, ITransient
{
/// 主/系统租户哨兵:超管未选择目标租户时其 JWT TenantId 即此值,拒绝作为业务租户。
private const long MainTenantId = 1300000000001L;
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
public IqcInspBillService(ISqlSugarClient db, UserManager userManager)
{
_db = db;
_userManager = userManager;
}
/// 严格可信租户解析:只来自认证后 JWT;无 Token(<=0) 或超管未选主租户 → 拒绝;不读前端 tenantId、无默认回退。
private long ResolveTenantOrThrow()
{
var tid = _userManager.TenantId;
if (tid <= 0)
throw Oops.Oh("无法确定当前租户,请重新登录或选择目标租户");
if (_userManager.SuperAdmin && tid == MainTenantId)
throw Oops.Oh("超级管理员操作前必须选择目标租户");
return tid;
}
/// 排序字段白名单(前端 prop → 物理列),杜绝 orderBy 注入。
private static readonly Dictionary OrderByWhitelist = new(StringComparer.OrdinalIgnoreCase)
{
["billNo"] = "ib.FBILLNO",
["sourceBillNo"] = "ib.lydjbh",
["materialCode"] = "ib.FMATERIALCFG",
["materialName"] = "ib.wlmc",
["supplierName"] = "ib.gysmc",
["lotNo"] = "ib.pch",
["billStatus"] = "ib.FBILLSTATUS",
["judgement"] = "ib.pd",
["inspectDate"] = "ib.FINSPESTARTDATE",
["createTime"] = "ib.FCREATETIME",
};
///
/// 来料检验单列表(只读分页查询)。
///
[DisplayName("来料检验单列表")]
[HttpGet("list")]
public async Task