using Admin.NET.Plugin.AiDOP.Infrastructure;
using Microsoft.Extensions.Logging;
using Yitter.IdGenerator;
namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
///
/// S7 FQC 成品报检(Phase 1C)。复刻旧系统"组织实验通知单":选一张(完工)工单 → 回填 → 保存成 qms_fqcbj 报检。
///
/// 复用 S5 IqcTaskEntryService 范式:ResolveTenantOrThrow(登录租户,非透传源)、雪花 id、本库取号(FQCBJ+日期+序号,配 1A UNIQUE)、
/// UseTranAsync、写成功后触发 FQC refresh(解耦,失败不回滚业务)。
///
/// 回填可信边界(§十二):wlbm/cpmc/cpxh/scph/sczld/sczldsl 一律由后端按用户选的 WorkOrd + ItemMaster 真实数据重读,
/// 不信前端提交值;人工字段 sl/yxj/jfbh/FCOMMENT 取前端。
/// 完工口径(§八):不做无证据硬拦截,候选正常展示 + 完工标记由前端提示;仅缺 ItemNum/关键键 硬拒。
/// 只读 WorkOrdMaster/ItemMaster,只写 qms_fqcbj。本轮不实现"生成检验单"(Phase 1D)。
///
[ApiDescriptionSettings(Order = 342, Description = "FQC成品报检")]
[Route("api/S7FqcApply")]
[NonUnify]
public class FqcApplyService : IDynamicApiController, ITransient
{
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
private readonly FqcMdpSyncService _fqcMdpSyncService;
private readonly FqcSpecMaterialMapService _specMap;
private readonly ILogger _logger;
public FqcApplyService(ISqlSugarClient db, UserManager userManager, FqcMdpSyncService fqcMdpSyncService, FqcSpecMaterialMapService specMap, ILoggerFactory loggerFactory)
{
_db = db;
_userManager = userManager;
_fqcMdpSyncService = fqcMdpSyncService;
_specMap = specMap;
_logger = loggerFactory.CreateLogger(nameof(FqcApplyService));
}
private long ResolveTenantOrThrow() => AidopTenantScope.ResolveOrThrow(_userManager);
/// 成品完工报检默认业务类型/单据类型(占位,实际字典未接,原样落库)。
private const string FqcBillType = "FQC";
// ============================ 完工工单候选 ============================
///
/// 引用生产指令单:完工工单候选(WorkOrdMaster + ItemMaster 富化,只读,租户隔离)。
/// 不做完工硬拦截;返回 qtyOrded/qtyCompleted/status 供前端行内提示。
///
[DisplayName("完工工单候选")]
[HttpGet("work-orders")]
public async Task