using Admin.NET.Plugin.AiDOP.Manufacturing.Dto;
namespace Admin.NET.Plugin.AiDOP.Manufacturing;
///
/// S6 过程检验单(IPQC)只读 list 服务。
///
/// 数据源:DOP 数据中台标准层 mdp_std_ipqc_inspection(头)。
/// 由 IpqcInspectionMdpSyncService 从归口后的 aidopdev.qms_gcjyd(过程检验单头)同步标准化而来。
///
/// 本服务仅 SELECT:无新增/编辑/删除/写入。
/// 当前上游尚未抽数,归口源表 qms_gcjyd 为空 → 标准层为空 → list 返回空数组(前端空态)。
/// 明细(qms_gcjydzb)与详情不在本批范围,留待 IPQC-INSPECTION-DETAIL-READONLY-1。
///
[ApiDescriptionSettings(Order = 306, Description = "过程检验单")]
[Route("api/IpqcInspection")]
[NonUnify]
public class IpqcInspectionService : IDynamicApiController, ITransient
{
/// 主/系统租户哨兵:超管未选择目标租户时其 JWT TenantId 即此值,拒绝作为业务租户。
private const long MainTenantId = 1300000000001L;
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
public IpqcInspectionService(ISqlSugarClient db, UserManager userManager)
{
_db = db;
_userManager = userManager;
}
///
/// IPQC 只读查询的可信租户解析(严格语义,无任何默认回退、不读前端 tenantId):
/// - 普通租户用户:返回认证后的 JWT TenantId(>0);
/// - 无 Token(TenantId<=0):拒绝(正常已被认证层 401 拦截,此处为纵深防御);
/// - 超管未选择目标租户(TenantId==主租户):拒绝,必须先选择目标租户。
/// 前端传入的 tenantId 一律忽略,绝不作为切换租户的权威来源。
///
private long ResolveTenantOrThrow()
{
var tid = _userManager.TenantId;
if (tid <= 0)
throw Oops.Oh("无法确定当前租户,请重新登录或选择目标租户");
if (_userManager.SuperAdmin && tid == MainTenantId)
throw Oops.Oh("超级管理员操作前必须选择目标租户");
return tid;
}
///
/// 过程检验单列表(只读分页查询)。
///
[DisplayName("过程检验单列表")]
[HttpGet("list")]
public async Task