using Admin.NET.Plugin.AiDOP.Infrastructure;
using Admin.NET.Plugin.AiDOP.MaterialWarehouse.Dto;
using Yitter.IdGenerator;
namespace Admin.NET.Plugin.AiDOP.MaterialWarehouse;
///
/// S5 IQC 原材料检规 ↔ 物料 派生映射服务(B-1)。
///
/// 职责边界(**本服务只建立 Spec ↔ Material 关系,不做任何"选哪条检规"的裁决**):
/// qms_jygf.wlbm ──tokenize/normalize──> 与 ItemMaster.ItemNum 精确比对 ──> ado_s5_iqc_spec_material_map
///
/// 硬边界:
/// ① 绝不修改源 qms_jygf / qms_jygfzb 任何字段;
/// ② 禁止 LIKE 子串匹配,token 与 ItemMaster.ItemNum **等值**比对;
/// ③ 自动重算只删自己产生的行(is_manual=0),**人工绑定行(is_manual=1)永不被自动同步删除**;
/// ④ 全部按 AidopTenantScope 登录租户隔离,绝不跨租户匹配、绝不透传源行租户;
/// ⑤ **本服务不得出现候选排序/择一逻辑**(如 OrderByDescending(sxrq).First())——
/// 那是 B-2 Resolver 的职责。本服务的查询接口一律返回全部候选,不做选择。
///
/// 分词/标准化/分级规则集中在 ,运行期与 UpdateScripts 迁移共用同一口径。
///
[ApiDescriptionSettings(Order = 341, Description = "IQC检规物料映射")]
[Route("api/S5IqcSpecMap")]
[NonUnify]
public class S5IqcSpecMaterialMapService : IDynamicApiController, ITransient
{
private const string MapTable = "ado_s5_iqc_spec_material_map";
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
public S5IqcSpecMaterialMapService(ISqlSugarClient db, UserManager userManager)
{
_db = db;
_userManager = userManager;
}
private long ResolveTenantOrThrow() => AidopTenantScope.ResolveOrThrow(_userManager);
// ==================================================================
// 查询(只读,返回全部候选,**不做择一**)
// ==================================================================
/// 映射列表(分页)。物料编码为等值过滤,禁子串匹配。
[DisplayName("IQC检规物料映射列表")]
[HttpGet("list")]
public async Task