-- ============================================================================
-- S7 FQC 成品检验全链路 · 阶段 1A · P0 基础设施迁移
-- 内容：① 报检/检验单幂等 UNIQUE(G3) ② SQLSERVER 入站实体 status→0 切源护栏(P0)
--       ③ 检规↔物料映射桥表(G1，不改原始 qms_ccjygf.wlbm)
-- 幂等：全部 IF-NOT-EXISTS 守卫，可重复执行。
-- 迁移前已实测三处 UNIQUE 目标 0 冲突、桥表不存在。
-- 占位名：提交那刻 rename 为正式 1.0.<next>.sql 并登记 csproj Copy。
-- ============================================================================

-- ---- ① qms_fqcbj: 报检单号租户内唯一 ----
SET @exist := (SELECT COUNT(1) FROM information_schema.statistics
  WHERE table_schema=DATABASE() AND table_name='qms_fqcbj' AND index_name='uk_qms_fqcbj_tenant_billno');
SET @sql := IF(@exist=0,
  'ALTER TABLE qms_fqcbj ADD UNIQUE KEY uk_qms_fqcbj_tenant_billno (tenant_id, FBILLNO)',
  'SELECT 1');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

-- ---- ② qms_qcpp_inspbill: 检验单号租户内唯一 ----
SET @exist := (SELECT COUNT(1) FROM information_schema.statistics
  WHERE table_schema=DATABASE() AND table_name='qms_qcpp_inspbill' AND index_name='uk_qms_qcpp_inspbill_tenant_billno');
SET @sql := IF(@exist=0,
  'ALTER TABLE qms_qcpp_inspbill ADD UNIQUE KEY uk_qms_qcpp_inspbill_tenant_billno (tenant_id, FBILLNO)',
  'SELECT 1');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

-- ---- ③ qms_qcpp_inspbill: 一个报检(lydjbh=报检FBILLNO, hid=报检id)只生成一张检验单(G3 DB层幂等) ----
SET @exist := (SELECT COUNT(1) FROM information_schema.statistics
  WHERE table_schema=DATABASE() AND table_name='qms_qcpp_inspbill' AND index_name='uk_qms_qcpp_inspbill_source');
SET @sql := IF(@exist=0,
  'ALTER TABLE qms_qcpp_inspbill ADD UNIQUE KEY uk_qms_qcpp_inspbill_source (tenant_id, lydjbh, hid)',
  'SELECT 1');
PREPARE s FROM @sql; EXECUTE s; DEALLOCATE PREPARE s;

-- ---- ④ 切源护栏：FQC 三个 SQLSERVER 入站实体 status→0(就位不启用)，防 RunSourceSwitchFull 覆盖 DOP 写入 ----
UPDATE mdp_entity SET status=0
 WHERE entity_code IN ('S7_FQC_TASK_SQLSERVER','S7_FQC_RESULT_SQLSERVER','S7_FQC_RESULT_DETAIL_SQLSERVER')
   AND status<>0;

-- ---- ⑤ 检规↔标准物料 派生映射桥表(G1)。不改原始 qms_ccjygf.wlbm，此表为派生+人工订正层 ----
CREATE TABLE IF NOT EXISTS ado_s7_fqc_spec_material_map (
  id                        BIGINT       NOT NULL COMMENT '主键(雪花)',
  tenant_id                 BIGINT       NOT NULL COMMENT '租户Id',
  jygfid                    BIGINT       NOT NULL COMMENT '检规主表 qms_ccjygf.id',
  wjbh                      VARCHAR(100) NULL     COMMENT '检规文件编号(冗余便于查)',
  bb                        VARCHAR(50)  NULL     COMMENT '检规版本',
  seq                       INT          NULL     COMMENT 'wlbm 内序号',
  raw_token                 VARCHAR(200) NULL     COMMENT 'wlbm 拆出的原始 token',
  cleaned_token             VARCHAR(200) NULL     COMMENT '分隔符归一后 token',
  material_code             VARCHAR(100) NULL     COMMENT '匹配到的 ItemMaster.ItemNum(EXACT/MANUAL 时有值)',
  match_status              VARCHAR(30)  NOT NULL DEFAULT 'NOT_FOUND' COMMENT 'EXACT/RANGE_EXPANDED/GLUE_UNRESOLVED/NOT_FOUND/MANUAL',
  normalized_effective_date DATETIME     NULL     COMMENT '规范化生效日期(源 sxrq 清洗，原值不改)',
  note                      VARCHAR(500) NULL     COMMENT '备注/unresolved 原因',
  is_manual                 TINYINT      NOT NULL DEFAULT 0 COMMENT '1=人工维护绑定',
  status                    TINYINT      NOT NULL DEFAULT 1 COMMENT '1启用 0停用',
  create_time               DATETIME     NULL     COMMENT '创建时间',
  create_user_id            BIGINT       NULL     COMMENT '创建人',
  update_time               DATETIME     NULL     COMMENT '更新时间',
  update_user_id            BIGINT       NULL     COMMENT '更新人',
  PRIMARY KEY (id),
  UNIQUE KEY uk_fqc_spec_map (tenant_id, jygfid, raw_token, is_manual),
  KEY idx_fqc_spec_map_mat (tenant_id, material_code, status),
  KEY idx_fqc_spec_map_jygf (tenant_id, jygfid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='S7 FQC 检规↔标准物料 派生映射桥(不改源 wlbm)';
