using System.Text.RegularExpressions;
using Admin.NET.Plugin.AiDOP.Infrastructure;
using Yitter.IdGenerator;
namespace Admin.NET.Plugin.AiDOP.FinishedWarehouse;
///
/// S7 FQC 检规↔标准物料 派生映射服务(G1)。
///
/// 目的:解决"报检物料 → 检规"精确匹配。源 qms_ccjygf.wlbm 是多物料脏串(分隔符不统一 + 粘连 + 横杠区间),
/// 直接 LIKE 会误配(实证 31 token 互为子串)。本服务把 wlbm 清洗成 token,与 ItemMaster.ItemNum 精确匹配,
/// 落派生桥表 ado_s7_fqc_spec_material_map,供"报检物料→检规"稳定查询与人工订正。
///
/// 硬边界:① 绝不修改原始 qms_ccjygf.wlbm/sxrq;② 禁止 LIKE 子串匹配;③ 粘连不自动拆(词典缺片段),标 GLUE_UNRESOLVED;
/// ④ 全部按 ResolveTenantOrThrow 登录租户隔离,禁透传源行租户。
///
[ApiDescriptionSettings(Order = 340, Description = "FQC检规物料映射")]
[Route("api/S7FqcSpecMap")]
[NonUnify]
public class FqcSpecMaterialMapService : IDynamicApiController, ITransient
{
private readonly ISqlSugarClient _db;
private readonly UserManager _userManager;
public FqcSpecMaterialMapService(ISqlSugarClient db, UserManager userManager)
{
_db = db;
_userManager = userManager;
}
private long ResolveTenantOrThrow() => AidopTenantScope.ResolveOrThrow(_userManager);
/// wlbm 拆分正则:半/全角分号逗号、换行回车 tab、斜杠、半/全角冒号、空白。
private static readonly Regex TokenSplitter = new(@"[;;,,\r\n\t/::\s]+", RegexOptions.Compiled);
/// 纯物料码形态(字母数字,长度 4-12);用于粘连/异常识别(非白名单,仅分级)。
private static readonly Regex PlainCodeShape = new(@"^[A-Za-z0-9]{4,12}$", RegexOptions.Compiled);
// ============================ 清洗重建 ============================
///
/// 重建当前租户的检规↔物料映射(清洗 wlbm → 精确匹配 ItemMaster → 落桥表)。
/// 只删除并重建自动派生行(is_manual=0);人工绑定行(is_manual=1)原样保留。
///
[DisplayName("重建检规物料映射")]
[HttpPost("rebuild")]
public async Task