Просмотр исходного кода

feat(s0): seed UAT quality master data

为 UAT 租户 UATTEST_CHL(838257186181189) 落地 S0 质量域演示主数据,
覆盖 14 张 qms_* 表共 59 行(COPY 44 + CONSTRUCT 15)。

- 1.0.407.sql:3 SET + 14 INSERT,只写目标租户;源租户 797 与默认租户零变更
- 1.0.407.verify.sql:56 条断言(行数/FK/组织改写/租户作用域/业务键唯一/污染隔离/回归)
- 固定 ID 块 3000000000000000000+,55 个固定 ID + 4 行 AUTO_INCREMENT(qms_quality_base_type)
- 全部 INSERT 带 NOT EXISTS 幂等 guard,重跑影响行为 0
- FCHECKMETHOD 按 FNUMBER 重映射到目标租户方法,dangling 0
- 检验依据/标准/方案的组织字段由源组织改写为目标租户组织

chore: bump version server 1.0.407
YY968XX 1 день назад
Родитель
Сommit
29d7894b57

+ 9 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.406</AssemblyVersion>
-    <FileVersion>1.0.406</FileVersion>
-    <Version>1.0.406</Version>
+    <AssemblyVersion>1.0.407</AssemblyVersion>
+    <FileVersion>1.0.407</FileVersion>
+    <Version>1.0.407</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -559,6 +559,12 @@
     <None Update="UpdateScripts\1.0.406.verify.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.407.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
+    <None Update="UpdateScripts\1.0.407.verify.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 346 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.407.sql

@@ -0,0 +1,346 @@
+-- ============================================================================
+-- S0-FULL-DEMO-COVERAGE-CLOSURE-1 · STEP 2A · QUALITY DOMAIN
+--
+-- 目标:为 UATTEST_CHL 补齐 14 张 qms_* 质量主数据,解锁质量建模 15 个页面。
+--   覆盖率预期 19/58 → 34/58。
+--
+-- 口径(CTO 2026-08-28 拍板):
+--   PURE COPY        37 行(9 张配置表,无外部业务键)
+--   COPY + FK CLOSED  7 行(qms_jygf,按 UAT A 现有物料闭合)
+--   CONSTRUCT        15 行(4 张物料/供应商键控表,797 侧与 UAT A 零 FK 交集)
+--   ─────────────────────────
+--   INSERT 语句 14 条 · INSERT 行 59 · UPDATE 0 · DELETE 0 · DDL 0
+--
+-- 关键物理事实(详见 lwb/memory/modules/S0/CURRENT.md F-06):
+--   · 14 张表 id 均为 PRIMARY KEY;13 张**不是** auto_increment(仅 qms_quality_base_type 是)
+--     → 本脚本对 13 张表使用**固定确定性 ID 区间**,见下方 ID BLOCK
+--   · 14 张表**无任何业务唯一键**,DB 层不防重 → 幂等只能靠逻辑业务键 NOT EXISTS
+--   · 无 company_ref_id / factory_ref_id / Domain 列;但存在改名的组织外键
+--     FCREATEORGID / FUSEORGID,797 侧值为 AIDOP 根组织,必须改写为目标租户组织
+--   · 域内 FK:qms_inspectionitems.FCHECKMETHOD → qms_inspection_method.id
+--     → method 必须先插;映射经业务键 FNUMBER 回绑,**不用 id 算术猜映射**
+--
+-- 明确不碰(另批 S0-DEFAULT-TENANT-SEED-CONTAMINATION-CLEANUP-1 处理):
+--   · 默认租户 1300000000001 的 47 行 [AI测试] 质量数据
+--   · qms_quality_base_type 的 TEST_CAT_1777008124562
+--   · 797 侧 qms_gcjygf 的 3 行 [AI测试](id 9250024001-9250024003)
+--   本脚本对源租户与默认租户 WRITE = 0。
+--
+-- ⚠️ WIP:不占正式版本号,AutoVersionUpdate 不会自动应用。
+-- ============================================================================
+
+-- ---------------------------------------------------------------------------
+-- ID BLOCK(固定确定性区间,已实测 13/13 表在该区间 collision = 0,仓内亦无同区间字面量)
+--   base = 3000000000000000000
+--   每表 = base + 表序号*1000 + 行序号
+--   3000000000000014004 < bigint max 9223372036854775807,安全
+-- ---------------------------------------------------------------------------
+
+SET @src     := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
+                 WHERE o.Code = 'AIDOP' AND t.Status = 1 LIMIT 1);
+SET @dst     := (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id = t.OrgId
+                 WHERE o.Code = 'UATTEST_CHL' AND t.Status = 1 LIMIT 1);
+SET @org_dst := (SELECT t.OrgId FROM SysTenant t WHERE t.Id = @dst LIMIT 1);
+
+-- 任一变量为 NULL 时,下方每条语句的 guard 使全脚本降为空操作。
+
+
+-- ===========================================================================
+-- 01 · qms_inspection_method  PURE COPY 5   ★ 必须最先(qms_inspectionitems 依赖)
+--      QM-001..005 → 3000000000000001001..1005
+-- ===========================================================================
+INSERT INTO qms_inspection_method
+    (id, tenant_id, FNUMBER, FNAME, FCTRLSTRATEGY, FSTATUS, FENABLE, FCOMMENT, FCREATETIME, FMODIFYTIME)
+SELECT CASE s.FNUMBER
+           WHEN 'QM-001' THEN 3000000000000001001
+           WHEN 'QM-002' THEN 3000000000000001002
+           WHEN 'QM-003' THEN 3000000000000001003
+           WHEN 'QM-004' THEN 3000000000000001004
+           WHEN 'QM-005' THEN 3000000000000001005
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FCTRLSTRATEGY, s.FSTATUS, s.FENABLE, s.FCOMMENT, s.FCREATETIME, s.FMODIFYTIME
+FROM qms_inspection_method s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('QM-001','QM-002','QM-003','QM-004','QM-005')
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspection_method x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 02 · qms_inspectionitems  PURE COPY 5
+--      QI-001..005 → 3000000000000002001..2005
+--      FCHECKMETHOD 经 FNUMBER 回绑目标 method(禁止直接复制 source id、禁止 id offset)
+--      预期映射:QI-001→QM-003 · QI-002→QM-001 · QI-003→QM-003 · QI-004→QM-005 · QI-005→QM-001
+--      FCHECKBASIS:797 侧 5/5 为 NULL,原样带过,无需映射
+-- ===========================================================================
+INSERT INTO qms_inspectionitems
+    (id, tenant_id, FNUMBER, FNAME, FCHECKMETHOD, FCHECKBASIS, FCHECKINSTRUCT,
+     FRADIOGROUPFIELD, FRADIOGROUPFIELD1, zblx, FSTATUS, FENABLE, FCOMMENT, FCREATETIME, FMODIFYTIME)
+SELECT CASE s.FNUMBER
+           WHEN 'QI-001' THEN 3000000000000002001
+           WHEN 'QI-002' THEN 3000000000000002002
+           WHEN 'QI-003' THEN 3000000000000002003
+           WHEN 'QI-004' THEN 3000000000000002004
+           WHEN 'QI-005' THEN 3000000000000002005
+       END,
+       @dst, s.FNUMBER, s.FNAME,
+       (SELECT t.id FROM qms_inspection_method t
+         WHERE t.tenant_id = @dst AND t.FNUMBER = m.FNUMBER LIMIT 1),
+       s.FCHECKBASIS, s.FCHECKINSTRUCT,
+       s.FRADIOGROUPFIELD, s.FRADIOGROUPFIELD1, s.zblx,
+       s.FSTATUS, s.FENABLE, s.FCOMMENT, s.FCREATETIME, s.FMODIFYTIME
+FROM qms_inspectionitems s
+LEFT JOIN qms_inspection_method m ON m.id = s.FCHECKMETHOD AND m.tenant_id = @src
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('QI-001','QI-002','QI-003','QI-004','QI-005')
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspectionitems x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 03 · qms_inspectioninstru  PURE COPY 5    QG-001..005 → ...003001..3005
+-- ===========================================================================
+INSERT INTO qms_inspectioninstru
+    (id, tenant_id, FNUMBER, FNAME, FMODEL, FSPECIFICATION, FMANUFACTURER,
+     FSTATUS, FENABLE, FCOMMENT, FCREATETIME, FMODIFYTIME,
+     gauge_category, calibration_cycle_days, next_calibration_date)
+SELECT CASE s.FNUMBER
+           WHEN 'QG-001' THEN 3000000000000003001
+           WHEN 'QG-002' THEN 3000000000000003002
+           WHEN 'QG-003' THEN 3000000000000003003
+           WHEN 'QG-004' THEN 3000000000000003004
+           WHEN 'QG-005' THEN 3000000000000003005
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FMODEL, s.FSPECIFICATION, s.FMANUFACTURER,
+       s.FSTATUS, s.FENABLE, s.FCOMMENT, s.FCREATETIME, s.FMODIFYTIME,
+       s.gauge_category, s.calibration_cycle_days, s.next_calibration_date
+FROM qms_inspectioninstru s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('QG-001','QG-002','QG-003','QG-004','QG-005')
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspectioninstru x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 04 · qms_inspectionfreq  PURE COPY 4      JYPC-001..004 → ...004001..4004
+-- ===========================================================================
+INSERT INTO qms_inspectionfreq
+    (id, tenant_id, FNUMBER, FNAME, FREMARK, FSTATUS, FENABLE, FCREATETIME, FMODIFYTIME)
+SELECT CASE s.FNUMBER
+           WHEN 'JYPC-001' THEN 3000000000000004001
+           WHEN 'JYPC-002' THEN 3000000000000004002
+           WHEN 'JYPC-003' THEN 3000000000000004003
+           WHEN 'JYPC-004' THEN 3000000000000004004
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FREMARK, s.FSTATUS, s.FENABLE, s.FCREATETIME, s.FMODIFYTIME
+FROM qms_inspectionfreq s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('JYPC-001','JYPC-002','JYPC-003','JYPC-004')
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspectionfreq x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 05 · qms_sampscheme  PURE COPY 4          QS-001..004 → ...005001..5004
+--      FINSPECTORGID / FINSPECTUSERID:797 侧全 NULL,原样带过
+-- ===========================================================================
+INSERT INTO qms_sampscheme
+    (id, tenant_id, FNUMBER, FNAME, FSAMPLINGTYPE, FINSPECTIONLEVEL, FSTRICTNESS, FAQLVALUE,
+     FINSPECTIONTYPE, FINSPECTORGID, FINSPECTUSERID, FSTATUS, FENABLE, FCOMMENT,
+     FCREATETIME, FMODIFYTIME, FFIXEDRATE)
+SELECT CASE s.FNUMBER
+           WHEN 'QS-001' THEN 3000000000000005001
+           WHEN 'QS-002' THEN 3000000000000005002
+           WHEN 'QS-003' THEN 3000000000000005003
+           WHEN 'QS-004' THEN 3000000000000005004
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FSAMPLINGTYPE, s.FINSPECTIONLEVEL, s.FSTRICTNESS, s.FAQLVALUE,
+       s.FINSPECTIONTYPE, s.FINSPECTORGID, s.FINSPECTUSERID, s.FSTATUS, s.FENABLE, s.FCOMMENT,
+       s.FCREATETIME, s.FMODIFYTIME, s.FFIXEDRATE
+FROM qms_sampscheme s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('QS-001','QS-002','QS-003','QS-004')
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_sampscheme x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 06 · qms_quality_base_type  PURE COPY 4   ★ 唯一 auto_increment 表,不给 id
+--      逻辑键 (tenant_id, type_category, type_code)
+-- ===========================================================================
+INSERT INTO qms_quality_base_type
+    (tenant_id, type_category, type_code, short_name, full_name, is_active, remark, create_time, modify_time)
+SELECT @dst, s.type_category, s.type_code, s.short_name, s.full_name, s.is_active, s.remark, s.create_time, s.modify_time
+FROM qms_quality_base_type s
+WHERE s.tenant_id = @src
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_quality_base_type x
+                  WHERE x.tenant_id = @dst AND x.type_category = s.type_category AND x.type_code = s.type_code);
+
+
+-- ===========================================================================
+-- 07 · qms_inspectioncrit  PURE COPY 3      JYYJ-001..003 → ...007001..7003
+--      ★ FCREATEORGID:797 根组织 → 目标租户组织
+-- ===========================================================================
+INSERT INTO qms_inspectioncrit
+    (id, tenant_id, FNUMBER, FNAME, FCTRLSTRATEGY, FCREATEORGID, FUSEORG,
+     FCOMMENT, FSTATUS, FENABLE, FCREATETIME, FMODIFYTIME)
+SELECT CASE s.FNUMBER
+           WHEN 'JYYJ-001' THEN 3000000000000007001
+           WHEN 'JYYJ-002' THEN 3000000000000007002
+           WHEN 'JYYJ-003' THEN 3000000000000007003
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FCTRLSTRATEGY,
+       CASE WHEN s.FCREATEORGID IS NULL THEN NULL ELSE @org_dst END,
+       s.FUSEORG, s.FCOMMENT, s.FSTATUS, s.FENABLE, s.FCREATETIME, s.FMODIFYTIME
+FROM qms_inspectioncrit s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('JYYJ-001','JYYJ-002','JYYJ-003')
+  AND @src IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspectioncrit x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 08 · qms_inspectionstd  PURE COPY 3       JYBZ-001..003 → ...008001..8003
+--      ★ FCREATEORGID 改写
+-- ===========================================================================
+INSERT INTO qms_inspectionstd
+    (id, tenant_id, FNUMBER, FNAME, FCOMMENT, FCTRLSTRATEGY, FCREATEORGID, FUSEORG, FSTATUS, FENABLE)
+SELECT CASE s.FNUMBER
+           WHEN 'JYBZ-001' THEN 3000000000000008001
+           WHEN 'JYBZ-002' THEN 3000000000000008002
+           WHEN 'JYBZ-003' THEN 3000000000000008003
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FCOMMENT, s.FCTRLSTRATEGY,
+       CASE WHEN s.FCREATEORGID IS NULL THEN NULL ELSE @org_dst END,
+       s.FUSEORG, s.FSTATUS, s.FENABLE
+FROM qms_inspectionstd s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('JYBZ-001','JYBZ-002','JYBZ-003')
+  AND @src IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspectionstd x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 09 · qms_inspectpro  PURE COPY 4          PLAN-* → ...009001..9004
+--      ★ FCREATEORGID + FUSEORGID 双改写
+--      FBIZSTYPEID 是字符串码(IQC/PQC/FQC/OQC),不是 id,原样带过
+-- ===========================================================================
+INSERT INTO qms_inspectpro
+    (id, tenant_id, FNUMBER, FNAME, FBIZSTYPEID, FCOMMENT, FCTRLSTRATEGY,
+     FCREATEORGID, FUSEORGID, FSTATUS, FENABLE, FCREATETIME, FMODIFYTIME)
+SELECT CASE s.FNUMBER
+           WHEN 'PLAN-FQC-001' THEN 3000000000000009001
+           WHEN 'PLAN-IQC-001' THEN 3000000000000009002
+           WHEN 'PLAN-OQC-001' THEN 3000000000000009003
+           WHEN 'PLAN-PQC-001' THEN 3000000000000009004
+       END,
+       @dst, s.FNUMBER, s.FNAME, s.FBIZSTYPEID, s.FCOMMENT, s.FCTRLSTRATEGY,
+       CASE WHEN s.FCREATEORGID IS NULL THEN NULL ELSE @org_dst END,
+       CASE WHEN s.FUSEORGID   IS NULL THEN NULL ELSE @org_dst END,
+       s.FSTATUS, s.FENABLE, s.FCREATETIME, s.FMODIFYTIME
+FROM qms_inspectpro s
+WHERE s.tenant_id = @src
+  AND s.FNUMBER IN ('PLAN-FQC-001','PLAN-IQC-001','PLAN-OQC-001','PLAN-PQC-001')
+  AND @src IS NOT NULL AND @dst IS NOT NULL AND @org_dst IS NOT NULL
+  AND NOT EXISTS (SELECT 1 FROM qms_inspectpro x WHERE x.tenant_id = @dst AND x.FNUMBER = s.FNUMBER);
+
+
+-- ===========================================================================
+-- 10 · qms_jygf  COPY + FK CLOSED 7         → ...010001..10007
+--      仅取 wlbm ∈ UAT A 现有 56 物料的行(797 共 4704 行,禁止整表迁移)
+--      ★ 逻辑键必须含版本 bb:Y101-1-11 存在 A.1 与 X.1 两版,两者都要保留
+-- ===========================================================================
+INSERT INTO qms_jygf
+    (id, tenant_id, wjbh, bb, th, yclmc, wlbm, sxrq, tzbb, czclph, xm, fj, filename, title, isEnable)
+SELECT CASE CONCAT(s.wjbh, '|', s.bb)
+           WHEN 'F03-1-21|A.0'  THEN 3000000000000010001
+           WHEN 'F101-1-39|A.0' THEN 3000000000000010002
+           WHEN 'M05-1-19|A.4'  THEN 3000000000000010003
+           WHEN 'U01-1-63|A.1'  THEN 3000000000000010004
+           WHEN 'Y101-1-11|A.1' THEN 3000000000000010005
+           WHEN 'Y101-1-11|X.1' THEN 3000000000000010006
+           WHEN 'Y101-1-36|X.1' THEN 3000000000000010007
+       END,
+       @dst, s.wjbh, s.bb, s.th, s.yclmc, s.wlbm, s.sxrq, s.tzbb, s.czclph, s.xm,
+       s.fj, s.filename, s.title, s.isEnable
+FROM qms_jygf s
+WHERE s.tenant_id = @src
+  AND @src IS NOT NULL AND @dst IS NOT NULL
+  AND EXISTS (SELECT 1 FROM ItemMaster i WHERE i.tenant_id = @dst AND i.ItemNum = s.wlbm)
+  AND NOT EXISTS (SELECT 1 FROM qms_jygf x
+                  WHERE x.tenant_id = @dst AND x.wjbh = s.wjbh AND x.bb <=> s.bb);
+
+
+-- ===========================================================================
+-- 11 · qms_gcjygf  CONSTRUCT 5              UATD-GC-001..005 → ...011001..11005
+--      797 侧 263 行与 UAT A 物料零交集(且含 3 行 [AI测试])→ 不复制,按 UAT A 自有制造件构造
+--      provenance:业务键前缀 UATD-(展示字段不带前缀)
+-- ===========================================================================
+INSERT INTO qms_gcjygf (id, tenant_id, syxh, wjbh, bb, sxrj, fj, wlbm, fj2, version)
+SELECT c.new_id, @dst, c.syxh, c.wjbh, 'A.0', CURDATE(), NULL, c.wlbm, NULL, 1
+FROM (
+          SELECT 3000000000000011001 AS new_id, 'UATD-GC-001' AS wjbh, '91HC0497' AS wlbm, '集控备机'        AS syxh
+    UNION ALL SELECT 3000000000000011002, 'UATD-GC-002', '3124C0015', 'IFT45PULB'
+    UNION ALL SELECT 3000000000000011003, 'UATD-GC-003', '3221C0031', '压(FBE6035B)'
+    UNION ALL SELECT 3000000000000011004, 'UATD-GC-004', '3121C0035', '上底(45PUL)'
+    UNION ALL SELECT 3000000000000011005, 'UATD-GC-005', '322AD001',  '上底(6035B)'
+) c
+WHERE @dst IS NOT NULL
+  AND EXISTS (SELECT 1 FROM ItemMaster i WHERE i.tenant_id = @dst AND i.ItemNum = c.wlbm)
+  AND NOT EXISTS (SELECT 1 FROM qms_gcjygf x WHERE x.tenant_id = @dst AND x.wjbh = c.wjbh);
+
+
+-- ===========================================================================
+-- 12 · qms_fqcjygf  CONSTRUCT 3             UATD-FQC-001..003 → ...012001..12003
+--      797 侧 3 行物料 1AB6753/91HC0857/1AB6755 均不在 UAT A → 不复制
+-- ===========================================================================
+INSERT INTO qms_fqcjygf (id, tenant_id, syxh, wjbh, bb, sxrj, fj, wlbm, fj2, version)
+SELECT c.new_id, @dst, c.syxh, c.wjbh, 'A.0', CURDATE(), NULL, c.wlbm, NULL, 1
+FROM (
+          SELECT 3000000000000012001 AS new_id, 'UATD-FQC-001' AS wjbh, '91HC0497' AS wlbm, '集控备机'      AS syxh
+    UNION ALL SELECT 3000000000000012002, 'UATD-FQC-002', '3124C0015', 'IFT45PULB'
+    UNION ALL SELECT 3000000000000012003, 'UATD-FQC-003', '3221C0031', '压(FBE6035B)'
+) c
+WHERE @dst IS NOT NULL
+  AND EXISTS (SELECT 1 FROM ItemMaster i WHERE i.tenant_id = @dst AND i.ItemNum = c.wlbm)
+  AND NOT EXISTS (SELECT 1 FROM qms_fqcjygf x WHERE x.tenant_id = @dst AND x.wjbh = c.wjbh);
+
+
+-- ===========================================================================
+-- 13 · qms_oqcjygf  CONSTRUCT 3             UATD-OQC-001..003 → ...013001..13003
+-- ===========================================================================
+INSERT INTO qms_oqcjygf (id, tenant_id, syxh, wjbh, bb, sxrj, fj, wlbm, fj2, version)
+SELECT c.new_id, @dst, c.syxh, c.wjbh, 'A.0', CURDATE(), NULL, c.wlbm, NULL, 1
+FROM (
+          SELECT 3000000000000013001 AS new_id, 'UATD-OQC-001' AS wjbh, '91HC0497' AS wlbm, '集控备机'      AS syxh
+    UNION ALL SELECT 3000000000000013002, 'UATD-OQC-002', '3124C0015', 'IFT45PULB'
+    UNION ALL SELECT 3000000000000013003, 'UATD-OQC-003', '3221C0031', '压(FBE6035B)'
+) c
+WHERE @dst IS NOT NULL
+  AND EXISTS (SELECT 1 FROM ItemMaster i WHERE i.tenant_id = @dst AND i.ItemNum = c.wlbm)
+  AND NOT EXISTS (SELECT 1 FROM qms_oqcjygf x WHERE x.tenant_id = @dst AND x.wjbh = c.wjbh);
+
+
+-- ===========================================================================
+-- 14 · qms_lymjbmd  CONSTRUCT 4             → ...014001..14004
+--      797 侧 4 行的供应商 10000000/10000001/10000002 与物料 91CC0136/1A03G87
+--      均不在 UAT A → 不复制;改用 UAT A 自有真实供应商与物料组合白名单。
+--      本表无任何 provenance 字段,且 gysbm/wlbm 必须是真实编码 → 不写 UATD 标记,
+--      provenance 由本注释、S0 Memory 与执行回执承载(CTO 2026-08-28 批准)。
+-- ===========================================================================
+INSERT INTO qms_lymjbmd (id, tenant_id, gysbm, gysmc, wlbm, wlmc, dim_type)
+SELECT c.new_id, @dst, c.gysbm, c.gysmc, c.wlbm, c.wlmc, c.dim_type
+FROM (
+          SELECT 3000000000000014001 AS new_id, '10003232' AS gysbm, '珩睿'   AS gysmc, NULL       AS wlbm, NULL                AS wlmc, 'supplier'          AS dim_type
+    UNION ALL SELECT 3000000000000014002, '10000015', '怡祥',   NULL,       NULL,                 'supplier'
+    UNION ALL SELECT 3000000000000014003, NULL,       NULL,     '91C0D2C',  '管组件-新EE2305H',   'material'
+    UNION ALL SELECT 3000000000000014004, '10001597', '奥博特', '91HC0497', '集控备机',           'material_supplier'
+) c
+WHERE @dst IS NOT NULL
+  AND (c.gysbm IS NULL OR EXISTS (SELECT 1 FROM SuppMaster s WHERE s.tenant_id = @dst AND s.Supp = c.gysbm))
+  AND (c.wlbm  IS NULL OR EXISTS (SELECT 1 FROM ItemMaster i WHERE i.tenant_id = @dst AND i.ItemNum = c.wlbm))
+  AND NOT EXISTS (SELECT 1 FROM qms_lymjbmd x
+                  WHERE x.tenant_id = @dst AND x.dim_type = c.dim_type
+                    AND IFNULL(x.gysbm,'') = IFNULL(c.gysbm,'')
+                    AND IFNULL(x.wlbm,'')  = IFNULL(c.wlbm,''));

+ 112 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.407.verify.sql

@@ -0,0 +1,112 @@
+-- ============================================================================
+-- S0 STEP 2A QUALITY · VERIFY
+--
+-- 执行契约(AutoVersionUpdate.RunVerifyScriptIfExists):
+--   每条语句经 SqlQuerySingle<object> 取首行首列并要求 IsTruthy == true。因此:
+--     ① 禁止 SET @var(返回 null 即判失败)→ 租户一律内联子查询,每条语句自包含
+--     ② 每条语句返回「通过为真」的标量(用 = 比较得 1/0),不得返回「错误条数」
+--     ③ 一条语句一个断言,不用多行 UNION 汇总
+--     ④ 文件必须以最后一条 SQL 的 ; 结束,末尾不得残留 comment-only 块
+--
+-- ⚠️ 作用域边界(CTO 2026-08-28 修正):
+--   本文件**不得**断言「全物理表不存在 tenant_id IN (0,1,1300000000001)」——
+--   默认租户存在 47 行历史 [AI测试] 质量数据、797 侧 qms_gcjygf 另有 3 行,
+--   均属另批 S0-DEFAULT-TENANT-SEED-CONTAMINATION-CLEANUP-1,本批 DO NOT TOUCH。
+--   §4 改为 TARGET PAYLOAD SCOPE:只验证本批 payload 在 @dst 精确存在、且未错落他租户。
+--   源租户 / 默认租户 MUTATION = 0 由 PRE/POST snapshot 证明,不进本永久契约。
+-- ============================================================================
+
+-- ---------------------------------------------------------------------------
+-- §1 目标计数(14 条)
+-- ---------------------------------------------------------------------------
+SELECT COUNT(*) = 5 FROM qms_inspection_method  WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 5 FROM qms_inspectionitems    WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 5 FROM qms_inspectioninstru   WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 4 FROM qms_inspectionfreq     WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 4 FROM qms_sampscheme         WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 4 FROM qms_quality_base_type  WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 3 FROM qms_inspectioncrit     WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 3 FROM qms_inspectionstd      WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 4 FROM qms_inspectpro         WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 7 FROM qms_jygf               WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 5 FROM qms_gcjygf             WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 3 FROM qms_fqcjygf            WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 3 FROM qms_oqcjygf            WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 4 FROM qms_lymjbmd            WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+
+-- ---------------------------------------------------------------------------
+-- §2 FK 闭合(6 条)
+-- ---------------------------------------------------------------------------
+-- 2.1 items → method 无悬空
+SELECT COUNT(*) = 0 FROM qms_inspectionitems i LEFT JOIN qms_inspection_method m ON m.id = i.FCHECKMETHOD AND m.tenant_id = i.tenant_id WHERE i.tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND i.FCHECKMETHOD IS NOT NULL AND m.id IS NULL;
+-- 2.2 items → method 已映射 5 条,且指向同租户 method
+SELECT COUNT(*) = 5 FROM qms_inspectionitems i JOIN qms_inspection_method m ON m.id = i.FCHECKMETHOD AND m.tenant_id = i.tenant_id WHERE i.tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+-- 2.3 语义正确:QI-001→QM-003 · QI-002→QM-001 · QI-003→QM-003 · QI-004→QM-005 · QI-005→QM-001
+SELECT COUNT(*) = 5 FROM qms_inspectionitems i JOIN qms_inspection_method m ON m.id = i.FCHECKMETHOD AND m.tenant_id = i.tenant_id WHERE i.tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND CONCAT(i.FNUMBER,'>',m.FNUMBER) IN ('QI-001>QM-003','QI-002>QM-001','QI-003>QM-003','QI-004>QM-005','QI-005>QM-001');
+-- 2.4 jygf / gcjygf / fqcjygf / oqcjygf → ItemMaster 无悬空
+SELECT COUNT(*) = 0 FROM (SELECT wlbm, tenant_id FROM qms_jygf UNION ALL SELECT wlbm, tenant_id FROM qms_gcjygf UNION ALL SELECT wlbm, tenant_id FROM qms_fqcjygf UNION ALL SELECT wlbm, tenant_id FROM qms_oqcjygf) q LEFT JOIN ItemMaster i ON i.tenant_id = q.tenant_id AND i.ItemNum = q.wlbm WHERE q.tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND q.wlbm IS NOT NULL AND i.RecID IS NULL;
+-- 2.5 lymjbmd → SuppMaster 无悬空
+SELECT COUNT(*) = 0 FROM qms_lymjbmd l LEFT JOIN SuppMaster s ON s.tenant_id = l.tenant_id AND s.Supp = l.gysbm WHERE l.tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND l.gysbm IS NOT NULL AND s.RecID IS NULL;
+-- 2.6 lymjbmd → ItemMaster 无悬空
+SELECT COUNT(*) = 0 FROM qms_lymjbmd l LEFT JOIN ItemMaster i ON i.tenant_id = l.tenant_id AND i.ItemNum = l.wlbm WHERE l.tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND l.wlbm IS NOT NULL AND i.RecID IS NULL;
+
+-- ---------------------------------------------------------------------------
+-- §3 组织引用改写(3 条):目标租户内不得残留 AIDOP 根组织 Id
+-- ---------------------------------------------------------------------------
+SELECT COUNT(*) = 0 FROM qms_inspectioncrit WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FCREATEORGID = (SELECT t2.OrgId FROM SysTenant t2 JOIN SysOrg o2 ON o2.Id=t2.OrgId WHERE o2.Code='AIDOP' AND t2.Status=1 LIMIT 1);
+SELECT COUNT(*) = 0 FROM qms_inspectionstd  WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FCREATEORGID = (SELECT t2.OrgId FROM SysTenant t2 JOIN SysOrg o2 ON o2.Id=t2.OrgId WHERE o2.Code='AIDOP' AND t2.Status=1 LIMIT 1);
+SELECT COUNT(*) = 0 FROM qms_inspectpro     WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND (FCREATEORGID = (SELECT t2.OrgId FROM SysTenant t2 JOIN SysOrg o2 ON o2.Id=t2.OrgId WHERE o2.Code='AIDOP' AND t2.Status=1 LIMIT 1) OR FUSEORGID = (SELECT t3.OrgId FROM SysTenant t3 JOIN SysOrg o3 ON o3.Id=t3.OrgId WHERE o3.Code='AIDOP' AND t3.Status=1 LIMIT 1));
+
+-- ---------------------------------------------------------------------------
+-- §4 TARGET PAYLOAD SCOPE(14 条)
+--     只验证「本批 payload 在 @dst 精确存在」+「CONSTRUCT payload 未错落他租户」。
+--     COPY 类业务键在源租户 797 本就合法存在,故不做「全库唯一」断言。
+-- ---------------------------------------------------------------------------
+SELECT COUNT(*) = 5 FROM qms_inspection_method WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('QM-001','QM-002','QM-003','QM-004','QM-005');
+SELECT COUNT(*) = 5 FROM qms_inspectionitems   WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('QI-001','QI-002','QI-003','QI-004','QI-005');
+SELECT COUNT(*) = 5 FROM qms_inspectioninstru  WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('QG-001','QG-002','QG-003','QG-004','QG-005');
+SELECT COUNT(*) = 4 FROM qms_inspectionfreq    WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('JYPC-001','JYPC-002','JYPC-003','JYPC-004');
+SELECT COUNT(*) = 4 FROM qms_sampscheme        WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('QS-001','QS-002','QS-003','QS-004');
+SELECT COUNT(*) = 4 FROM qms_quality_base_type WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND CONCAT(type_category,'|',type_code) IN ('检验类型|IQC','检验类型|PQC','不良分类|制成不良','判定结论|合格');
+SELECT COUNT(*) = 3 FROM qms_inspectioncrit    WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('JYYJ-001','JYYJ-002','JYYJ-003');
+SELECT COUNT(*) = 3 FROM qms_inspectionstd     WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('JYBZ-001','JYBZ-002','JYBZ-003');
+SELECT COUNT(*) = 4 FROM qms_inspectpro        WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND FNUMBER IN ('PLAN-FQC-001','PLAN-IQC-001','PLAN-OQC-001','PLAN-PQC-001');
+-- jygf:7 行且 Y101-1-11 的 A.1 / X.1 两版必须共存
+SELECT COUNT(*) = 7 FROM qms_jygf WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND CONCAT(wjbh,'|',bb) IN ('F03-1-21|A.0','F101-1-39|A.0','M05-1-19|A.4','U01-1-63|A.1','Y101-1-11|A.1','Y101-1-11|X.1','Y101-1-36|X.1');
+SELECT COUNT(*) = 2 FROM qms_jygf WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND wjbh = 'Y101-1-11' AND bb IN ('A.1','X.1');
+-- CONSTRUCT payload 必须只出现在 @dst
+SELECT COUNT(*) = 0 FROM qms_gcjygf  WHERE wjbh LIKE 'UATD-GC-%'  AND tenant_id <> (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 0 FROM qms_fqcjygf WHERE wjbh LIKE 'UATD-FQC-%' AND tenant_id <> (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 0 FROM qms_oqcjygf WHERE wjbh LIKE 'UATD-OQC-%' AND tenant_id <> (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+
+-- ---------------------------------------------------------------------------
+-- §5 逻辑业务键唯一性(14 条)
+--     DB 层这 14 张表**没有任何业务唯一键**,本节是唯一的重复防线。
+-- ---------------------------------------------------------------------------
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspection_method WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) a;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspectionitems   WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) b;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspectioninstru  WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) c;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspectionfreq    WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) d;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_sampscheme        WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) e;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspectioncrit    WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) f;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspectionstd     WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) g;
+SELECT COUNT(*) = 0 FROM (SELECT FNUMBER FROM qms_inspectpro        WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY FNUMBER HAVING COUNT(*) > 1) h;
+SELECT COUNT(*) = 0 FROM (SELECT type_category, type_code FROM qms_quality_base_type WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY type_category, type_code HAVING COUNT(*) > 1) i;
+SELECT COUNT(*) = 0 FROM (SELECT wjbh, bb FROM qms_jygf WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY wjbh, bb HAVING COUNT(*) > 1) j;
+SELECT COUNT(*) = 0 FROM (SELECT wjbh FROM qms_gcjygf  WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY wjbh HAVING COUNT(*) > 1) k;
+SELECT COUNT(*) = 0 FROM (SELECT wjbh FROM qms_fqcjygf WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY wjbh HAVING COUNT(*) > 1) l;
+SELECT COUNT(*) = 0 FROM (SELECT wjbh FROM qms_oqcjygf WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY wjbh HAVING COUNT(*) > 1) m;
+SELECT COUNT(*) = 0 FROM (SELECT dim_type, IFNULL(gysbm,'') g2, IFNULL(wlbm,'') w2 FROM qms_lymjbmd WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) GROUP BY dim_type, g2, w2 HAVING COUNT(*) > 1) n;
+
+-- ---------------------------------------------------------------------------
+-- §6 污染隔离(2 条):目标租户内不得出现历史 [AI测试] 痕迹
+-- ---------------------------------------------------------------------------
+SELECT COUNT(*) = 0 FROM qms_inspectionitems WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND (FNUMBER LIKE 'AI-%' OR FNAME LIKE '%AI测试%');
+SELECT COUNT(*) = 0 FROM qms_gcjygf WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1) AND (syxh LIKE '%AI测试%' OR fj LIKE '%AI测试%' OR wlbm LIKE '%AI测试%');
+
+-- ---------------------------------------------------------------------------
+-- §7 回归(3 条):本批不得触碰的既有 S0 主数据
+-- ---------------------------------------------------------------------------
+SELECT COUNT(*) =  5 FROM CustMaster       WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) =  7 FROM DepartmentMaster WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);
+SELECT COUNT(*) = 56 FROM ItemMaster       WHERE tenant_id = (SELECT t.Id FROM SysTenant t JOIN SysOrg o ON o.Id=t.OrgId WHERE o.Code='UATTEST_CHL' AND t.Status=1 LIMIT 1);