using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
///
/// S5 暂收在检列表 只读 list 服务。
///
/// 数据源:aidopdev.MissedPrint(Status='I' 暂收待检、Qty>0、Location 空),忠实复刻旧系统存储过程
/// pr_WMS_GetMissedTempQty:LEFT JOIN qms_qcp_inspecapplyn/qms_qcp_insappnentry 取检验状态,按
/// Supply/PurOrd/PurLine/ShipperNbr/ItemNum/LotSerial 聚合(MAX Shelf/SUM Qty/MAX CheckNo/MAX FINSPECTSTATUS),
/// 再 LEFT JOIN ItemMaster(描述/单位)、SuppMaster(简称),clfs='3' 追加“-挑选使用”。
/// Domain 由 GeneralizedCodeMaster(SystemConfig/CompanyCode) 解析,默认 8010。
///
/// 本服务仅 SELECT:无新增/编辑/删除/库存事务/状态流转;MissedPrint 无 tenant_id,不做租户过滤。
///
[ApiDescriptionSettings(Order = 301, Description = "暂收在检列表")]
[Route("api/S5PendingInspection")]
[NonUnify]
public class PendingInspectionService : IDynamicApiController, ITransient
{
/// 主/系统租户哨兵:超管未选择目标租户时其 JWT TenantId 即此值,拒绝作为业务租户。
private const long MainTenantId = 1300000000001L;
/// 贴源源码:与 S5 其余库存页保持一致,供 Domain 解析使用。
private const string SourceCode = "DOPDEMORQ_SQLSERVER";
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
private readonly SourceDomainTenantResolver _domainTenant;
public PendingInspectionService(
ISqlSugarClient db, UserManager userManager, SourceDomainTenantResolver domainTenant)
{
_db = db;
_userManager = userManager;
_domainTenant = domainTenant;
}
/// 严格可信租户解析:只来自认证后 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;
}
///
/// 按当前租户解析公司域,统一走 。
///
/// 原实现是 SELECT Domain FROM GeneralizedCodeMaster WHERE FldName='SystemConfig'
/// AND Val='CompanyCode' ORDER BY RecID LIMIT 1 —— **无 tenant 条件**,取的是全库第一条,
/// 与 resolver 修复前的缺陷同源:不同租户会被解析到同一个(别人的)Domain,
/// 且解析不到时硬回落 "8010"。本项目的 Domain 解析只允许有一个正式实现。
///
///
private async Task ResolveDomainOrThrowAsync(long tenantId, CancellationToken ct = default)
{
try
{
return await _domainTenant.ResolveDomainAsync(SourceCode, tenantId, ct);
}
catch (Exception ex)
{
// fail closed:解析不出租户 Domain 就不查,绝不回落固定值
throw Oops.Oh($"无法解析当前租户 Domain 映射:{ex.Message}");
}
}
///
/// 暂收在检列表(只读分页查询)。
///
[DisplayName("暂收在检列表")]
[HttpGet("list")]
public async Task