-- =============================================================================
-- 批次：S5-S6-S7-T8-KPI-DATA-FOUNDATION-REFRESH-1
-- 范围：S5 物料仓储 / S6 生产执行 / S7 成品仓储 — T8 KPI 数据底座
-- 边界：
--   1. 只建 DOP 端 DWD 与元数据登记，不建 mdp_stg_t8_*（一期不做贴源层）
--   2. 不动 T8 源库任何对象
--   3. metric_value 保留 NULL 语义；分母缺失时禁止伪装 0
--   4. 所有 INSERT 使用 ON DUPLICATE KEY UPDATE 保证幂等
-- 上游 SQL：方老师 v5.4 KPI 字段对照表 J 列（DOP-T8字段对照表_v5.4(3) 的副本.xlsx）
-- 字段反推依据：lwb/对接T8/T8-KPI字段对照表-按SQL重新梳理-v1.md
-- 阶段 0 实测：lwb/对接T8/T8-KPI开发阶段0证据-v1.md
-- =============================================================================

-- -----------------------------------------------------------------------------
-- A. 9 张 DWD 主题宽表（dwd_t8_<业务主题>，统一 t8 前缀以标识源系统）
-- -----------------------------------------------------------------------------

-- A.1 #16 S5 物料上线周期（日 T+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_material_online_cycle` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_date` DATE NOT NULL COMMENT '业务日期（refresh 跑数日期）',
  `source_ztid` VARCHAR(64) NOT NULL COMMENT 'T8 账套（kc_tz_head.ztid）',
  `item_code` VARCHAR(64) NOT NULL COMMENT 'T8 kc_tz_list.code 物料编码',
  `online_date` DATETIME NULL COMMENT '配送到产线日期=lbs=生产领料最早 shtime',
  `receipt_date` DATETIME NULL COMMENT '物料收货日期=lbs=采购入库最早 shtime',
  `cycle_days` INT NULL COMMENT 'DATEDIFF(day, receipt_date, online_date)；任一端 NULL 时 NULL',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_mat_online_cycle` (`tenant_id`,`factory_id`,`biz_date`,`source_ztid`,`item_code`),
  KEY `idx_t8_mat_online_cycle_biz_date` (`biz_date`),
  KEY `idx_t8_mat_online_cycle_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #16 物料上线周期 DWD';

-- A.2 #17 S5 物料上线满足率（日 T+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_material_online_fulfillment` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_date` DATE NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `work_order_no` VARCHAR(64) NOT NULL COMMENT 'T8 kc_dd_head.noid = kc_tz_list.lynoid',
  `before_kgdate_rows` INT NOT NULL DEFAULT 0 COMMENT '工单开工日期前完成物料上线行数（分子）',
  `total_rows` INT NOT NULL DEFAULT 0 COMMENT '工单物料总行数（分母，来自 kc_dd_list_cllist）',
  `fulfillment_rate` DECIMAL(18,4) NULL COMMENT '分母=0 时 NULL；不伪装 0',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_mat_online_full` (`tenant_id`,`factory_id`,`biz_date`,`source_ztid`,`work_order_no`),
  KEY `idx_t8_mat_online_full_biz_date` (`biz_date`),
  KEY `idx_t8_mat_online_full_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #17 物料上线满足率 DWD';

-- A.3 #18 S5 物料仓储人效（月 M+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_material_warehouse_efficiency` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_month` CHAR(7) NOT NULL COMMENT 'YYYY-MM',
  `source_ztid` VARCHAR(64) NOT NULL,
  `period_start` DATE NOT NULL COMMENT '统计区间起（含）',
  `period_end` DATE NOT NULL COMMENT '统计区间止（含）',
  `online_qty` DECIMAL(18,4) NULL COMMENT 'SUM(kc_tz_list.slzx) where lbs=生产领料（分子）',
  `warehouse_headcount` INT NULL COMMENT 'sys_pelist count where gw=仓管 zzzt=在职（分母）',
  `efficiency` DECIMAL(18,4) NULL COMMENT 'online_qty/warehouse_headcount；分母 0 或 NULL 时 NULL',
  `denominator_status` VARCHAR(32) NOT NULL DEFAULT 'OK' COMMENT 'OK | NO_HEADCOUNT | NO_NUMERATOR',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_mat_wh_eff` (`tenant_id`,`factory_id`,`biz_month`,`source_ztid`),
  KEY `idx_t8_mat_wh_eff_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #18 物料仓储人效 DWD（人效类分母缺失保留 NULL）';

-- A.4 #19 S5 品类物料库存周转（月 M+1，来源 TVF Rep_总账_存货_V3）
CREATE TABLE IF NOT EXISTS `dwd_t8_material_inventory_turnover` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_month` CHAR(7) NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `period_start_yyyymm` CHAR(6) NOT NULL COMMENT 'TVF 入参起期 YYYYMM',
  `period_end_yyyymm` CHAR(6) NOT NULL COMMENT 'TVF 入参止期 YYYYMM',
  `warehouse_code` VARCHAR(64) NULL COMMENT 'TVF.ckcode',
  `warehouse_name` VARCHAR(200) NULL COMMENT 'TVF.ckname',
  `item_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'TVF.code',
  `item_name` VARCHAR(200) NULL COMMENT 'TVF.cname',
  `category_code` VARCHAR(64) NULL COMMENT 'TVF.pcode',
  `category_name` VARCHAR(200) NULL COMMENT 'TVF.pname',
  `avg_inventory_value` DECIMAL(18,4) NULL COMMENT 'TVF.je3 月平均库存金额（D1）',
  `monthly_outbound_cost` DECIMAL(18,4) NULL COMMENT 'TVF.je2 当月出库成本（D2）',
  `turnover_days` DECIMAL(18,4) NULL COMMENT 'D1/D2 × 30；D2 NULL 或 0 时 NULL',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_mat_inv_turn` (`tenant_id`,`factory_id`,`biz_month`,`source_ztid`,`warehouse_code`,`item_code`),
  KEY `idx_t8_mat_inv_turn_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #19 品类物料库存周转 DWD（TVF Rep_总账_存货_V3）';

-- A.5 #22 S6 工单制造满足率（日 T+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_work_order_mfg_fulfillment` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_date` DATE NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `order_no` VARCHAR(64) NOT NULL COMMENT 'T8 kc_dd_head.noid 工单号',
  `task_no` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'T8 kc_dd_list.rwnoid 任务号',
  `item_code` VARCHAR(64) NOT NULL DEFAULT '' COMMENT 'T8 物料编码',
  `plan_qty` DECIMAL(18,4) NULL COMMENT 'kc_dd_list.sl 计划数量（分母）',
  `done_qty_in_window` DECIMAL(18,4) NULL COMMENT 'SUM(d.slzx) 计划完工时间内累计报工数量（分子）',
  `fulfillment_rate` DECIMAL(18,4) NULL COMMENT 'done/plan；plan<=0 或 NULL 时 NULL',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_wo_mfg_full` (`tenant_id`,`factory_id`,`biz_date`,`source_ztid`,`order_no`,`task_no`,`item_code`),
  KEY `idx_t8_wo_mfg_full_biz_date` (`biz_date`),
  KEY `idx_t8_wo_mfg_full_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #22 工单制造满足率 DWD';

-- A.6 #23 S6 工单制造人效（月 M+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_work_order_mfg_efficiency` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_month` CHAR(7) NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `period_start` DATE NOT NULL,
  `period_end` DATE NOT NULL,
  `done_count` INT NULL COMMENT 'count(*) where lbs=生产入库 且 (slzx>=sl OR gdyn=1)（分子）',
  `production_headcount` INT NULL COMMENT 'sys_pelist count where gw=生产 zzzt=在职（分母）',
  `efficiency` DECIMAL(18,4) NULL COMMENT 'done_count/production_headcount；分母 0 或 NULL 时 NULL',
  `denominator_status` VARCHAR(32) NOT NULL DEFAULT 'OK',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_wo_mfg_eff` (`tenant_id`,`factory_id`,`biz_month`,`source_ztid`),
  KEY `idx_t8_wo_mfg_eff_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #23 工单制造人效 DWD（人效类分母缺失保留 NULL）';

-- A.7 #25 S7 订单发货周期（日 T+1，5 表 JOIN）
CREATE TABLE IF NOT EXISTS `dwd_t8_order_shipment_cycle` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_date` DATE NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `order_no` VARCHAR(64) NOT NULL COMMENT 'T8 kc_dd_head.noid 销售订单号',
  `cycle_days` INT NULL COMMENT 'datediff(day,min(shdate),max(shtime))；仅含 min(wczt)=1 的订单',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_ord_ship_cycle` (`tenant_id`,`factory_id`,`biz_date`,`source_ztid`,`order_no`),
  KEY `idx_t8_ord_ship_cycle_biz_date` (`biz_date`),
  KEY `idx_t8_ord_ship_cycle_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #25 订单发货周期 DWD（5 表 JOIN）';

-- A.8 #26 S7 订单发货满足率（日 T+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_order_shipment_fulfillment` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_date` DATE NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `order_no` VARCHAR(64) NOT NULL,
  `total_rows` INT NOT NULL DEFAULT 0 COMMENT '该订单总行数',
  `in_window_rows` INT NOT NULL DEFAULT 0 COMMENT '在确认交期前发货的行数',
  `fulfillment_rate` DECIMAL(18,4) NULL COMMENT '(in_window/total)×100；total=0 时 NULL',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_ord_ship_full` (`tenant_id`,`factory_id`,`biz_date`,`source_ztid`,`order_no`),
  KEY `idx_t8_ord_ship_full_biz_date` (`biz_date`),
  KEY `idx_t8_ord_ship_full_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #26 订单发货满足率 DWD';

-- A.9 #27 S7 成品仓储人效（月 M+1）
CREATE TABLE IF NOT EXISTS `dwd_t8_finished_warehouse_efficiency` (
  `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  `tenant_id` BIGINT NOT NULL DEFAULT 0,
  `factory_id` BIGINT NOT NULL DEFAULT 1,
  `biz_month` CHAR(7) NOT NULL,
  `source_ztid` VARCHAR(64) NOT NULL,
  `period_start` DATE NOT NULL,
  `period_end` DATE NOT NULL,
  `shipment_qty` DECIMAL(18,4) NULL COMMENT 'SUM(b.slzx) where lbs=销售出库（分子）',
  `warehouse_headcount` INT NULL COMMENT 'sys_pelist count where gw=仓管 zzzt=在职（分母，与 S5 共用枚举，待业务侧拆物料仓 vs 成品仓）',
  `efficiency` DECIMAL(18,4) NULL COMMENT 'shipment_qty/warehouse_headcount；分母 0 或 NULL 时 NULL',
  `denominator_status` VARCHAR(32) NOT NULL DEFAULT 'OK',
  `batch_id` VARCHAR(100) NOT NULL,
  `create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `update_time` DATETIME NULL ON UPDATE CURRENT_TIMESTAMP,
  UNIQUE KEY `uk_t8_fin_wh_eff` (`tenant_id`,`factory_id`,`biz_month`,`source_ztid`),
  KEY `idx_t8_fin_wh_eff_batch` (`batch_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='T8 #27 成品仓储人效 DWD（人效类分母缺失保留 NULL）';

-- -----------------------------------------------------------------------------
-- B. mdp_source 登记 T8 数据源（密码不入库，凭据在 Database.json + CLAUDE.md）
-- -----------------------------------------------------------------------------

INSERT INTO `mdp_source` (
  `tenant_id`,`source_code`,`source_name`,`source_type`,`status`,
  `db_type`,`db_host`,`db_port`,`db_name`,`db_user`,
  `db_password_enc`,`db_extra_params`,
  `remark`
) VALUES (
  0,'T8_V5_SQLSERVER','T8 一站式系统源库（SQL Server 只读）','DB',1,
  'SQLServer','39.105.125.212',29289,'t8_V5_09_56','dopsa',
  NULL,'ConfigId=t8_v5;TrustServerCertificate=true;Encrypt=false',
  'S5/S6/S7 KPI 数据贴源同步用；只读 SELECT；凭据见 CLAUDE.md「T8 源库连接信息」与 Database.json'
)
ON DUPLICATE KEY UPDATE
  `source_name`=VALUES(`source_name`),
  `db_host`=VALUES(`db_host`),
  `db_port`=VALUES(`db_port`),
  `db_name`=VALUES(`db_name`),
  `db_user`=VALUES(`db_user`),
  `db_extra_params`=VALUES(`db_extra_params`),
  `remark`=VALUES(`remark`),
  `update_time`=CURRENT_TIMESTAMP;

-- -----------------------------------------------------------------------------
-- C. mdp_entity 登记 9 个 KPI 用到的 T8 表/TVF（target_table_name 一期为 NULL，不贴源）
-- -----------------------------------------------------------------------------

INSERT INTO `mdp_entity` (
  `tenant_id`,`source_id`,`entity_code`,`entity_name`,`entity_type`,
  `source_table_name`,`target_table_name`,`sync_mode`,`batch_size`,`status`,`remark`
)
SELECT 0, s.id, v.entity_code, v.entity_name, v.entity_type,
       v.source_table_name, NULL, 'NONE', 0, 1, v.remark
FROM `mdp_source` s
CROSS JOIN (
  SELECT 'T8_KC_TZ_HEAD'          AS entity_code, 'T8 出入库流水头表'                  AS entity_name, 'TABLE'    AS entity_type, 'kc_tz_head'        AS source_table_name, 'S5/S6/S7 KPI 共用；按 lbs 区分生产领料/采购入库/生产入库/销售出库' AS remark
  UNION ALL SELECT 'T8_KC_TZ_LIST',          'T8 出入库流水明细', 'TABLE',    'kc_tz_list',        '与 kc_tz_head 关联，含 code/slzx/sl/lynoid 等'
  UNION ALL SELECT 'T8_KC_DD_HEAD',          'T8 单据头表', 'TABLE',    'kc_dd_head',        'S6/S7 KPI 用；按 lbs 区分生产任务/销售订单'
  UNION ALL SELECT 'T8_KC_DD_LIST',          'T8 单据明细', 'TABLE',    'kc_dd_list',        '与 kc_dd_head 关联，含 sl/jhdate/rwnoid'
  UNION ALL SELECT 'T8_KC_DD_LIST_CLLIST',   'T8 单据物料行', 'TABLE',    'kc_dd_list_cllist', 'S5 #17 工单物料总行数'
  UNION ALL SELECT 'T8_KC_ZJ_LIST',          'T8 检验/质检流水', 'TABLE',    'kc_zj_list',        'S7 #25 FQC 报检关联'
  UNION ALL SELECT 'T8_CJ_BG_HEAD_REP',      'T8 员工报工头表', 'TABLE',    'Cj_Bg_Head_Rep',    'S5 #17 工单开工时间（kgdate）'
  UNION ALL SELECT 'T8_SYS_PELIST',          'T8 人员主数据', 'TABLE',    'sys_pelist',        'S5/S6/S7 人效 KPI 分母（gw=仓管/生产；zzzt=在职）'
  UNION ALL SELECT 'T8_REP_ZONGZHANG_CUNHUO_V3','T8 总账存货月报 TVF', 'TVF', 'Rep_总账_存货_V3', 'S5 #19 品类物料库存周转；返回月均库存金额 je3 与出库成本 je2'
) v
WHERE s.source_code='T8_V5_SQLSERVER' AND s.tenant_id=0
ON DUPLICATE KEY UPDATE
  `entity_name`=VALUES(`entity_name`),
  `entity_type`=VALUES(`entity_type`),
  `source_table_name`=VALUES(`source_table_name`),
  `remark`=VALUES(`remark`),
  `update_time`=CURRENT_TIMESTAMP;

-- -----------------------------------------------------------------------------
-- D. ado_smart_ops_kpi_master 注册 9 个 KPI（L1）
--   - Direction 沿用既有枚举：lower_is_better / higher_is_better
--   - YellowThreshold / RedThreshold 一期 NULL（业务侧上线前回填）
--   - DataSource 普通表填 T8.dbo.<表名>；TVF 填 T8.dbo.Rep_总账_存货_V3
--   - StatFrequency 沿用既有 "天" / "月" 中文风格
-- -----------------------------------------------------------------------------

INSERT INTO `ado_smart_ops_kpi_master` (
  `MetricCode`,`ModuleCode`,`MetricLevel`,`ParentId`,`MetricName`,`Description`,`Formula`,`CalcRule`,
  `DataSource`,`StatFrequency`,`Department`,`DopFields`,`Unit`,`Direction`,
  `IsHomePage`,`SortNo`,`Remark`,`IsEnabled`,`TenantId`,`CreatedAt`,
  `YellowThreshold`,`RedThreshold`
) VALUES
  ('S5_L1_001','S5',1,NULL,'物料上线周期',
   'S5 物料仓储：物料从供应商收货入库到配送上线之间的天数差',
   '物料上线周期 = 物料配送到生产线日期 - 物料收货日期',
   '物料配送到生产线日期 = T8 kc_tz_head + kc_tz_list 中 lbs=生产领料的最早 shtime；物料收货日期 = lbs=采购入库的最早 shtime；按 code 分组取 MIN',
   'T8.dbo.kc_tz_head','天','物料仓储',NULL,'天','lower_is_better',
   0,510,'方老师 v5.4 KPI #16；T8 SQL 原逻辑直发（路径 A）',1,0,NOW(),
   NULL,NULL),
  ('S5_L1_002','S5',1,NULL,'物料上线满足率',
   'S5 物料仓储：工单开工日期前完成物料上线行数占工单物料总行数比率',
   'S = 工单开工日期前完成物料上线行数 / 工单物料总行数',
   '分子=T8 kc_tz_head/list 中 lbs=生产领料 且 shtime <= 工单开工时间 kgdate（Cj_Bg_Head_Rep.noid）；分母=kc_dd_head/kc_dd_list_cllist 中 lbs=生产任务 行数',
   'T8.dbo.kc_tz_head','天','物料仓储',NULL,'%','higher_is_better',
   0,520,'方老师 v5.4 KPI #17；分母为 0 时 fulfillment_rate 写 NULL',1,0,NOW(),
   NULL,NULL),
  ('S5_L1_003','S5',1,NULL,'物料仓储人效',
   'S5 物料仓储：单位仓储人员完成的上线物料数量',
   'H = 完成上线的工单物料数量 / 物料仓储人数',
   '分子=统计期 SUM(kc_tz_list.slzx) where lbs=生产领料；分母=sys_pelist count where gw=仓管 AND zzzt=在职',
   'T8.dbo.kc_tz_head','月','物料仓储',NULL,'个/人','higher_is_better',
   0,530,'方老师 v5.4 KPI #18；当前 T8 中 gw 全空，分母为 NULL 时 efficiency 写 NULL（不伪装 0），denominator_status=NO_HEADCOUNT',1,0,NOW(),
   NULL,NULL),
  ('S5_L1_004','S5',1,NULL,'品类物料库存周转',
   'S5 物料仓储：按品类的物料库存周转天数',
   'D1 / D2 × 30',
   'D1=月平均库存金额=TVF Rep_总账_存货_V3.je3；D2=当月出库成本=TVF Rep_总账_存货_V3.je2；TVF 入参：(账套, 普通, 正常, 起期 YYYYMM, 止期 YYYYMM)',
   'T8.dbo.Rep_总账_存货_V3','月','物料仓储',NULL,'天','lower_is_better',
   0,540,'方老师 v5.4 KPI #19；D2 为 0 或 NULL 时 turnover_days 写 NULL',1,0,NOW(),
   NULL,NULL),
  ('S6_L1_001','S6',1,NULL,'工单制造满足率',
   'S6 生产执行：计划完工时间内累计报工数量占工单计划生产数量的比率',
   '工单制造满足率 = 计划完工时间内累计报工数量 / 工单计划生产数量',
   '分母=kc_dd_list.sl where lbs=生产任务；分子=SUM(kc_tz_list.slzx) where lbs=生产入库 AND shtime <= jhdate；按 (noid, rwnoid, code) 关联',
   'T8.dbo.kc_dd_head','天','生产执行',NULL,'%','higher_is_better',
   0,610,'方老师 v5.4 KPI #22；plan_qty<=0 或 NULL 时 fulfillment_rate 写 NULL',1,0,NOW(),
   NULL,NULL),
  ('S6_L1_002','S6',1,NULL,'工单制造人效',
   'S6 生产执行：单位生产人员完成的工单数量',
   '工单制造人效 = 统计期内完成制造的工单数量 / 生产人数',
   '分子=count(*) from kc_tz_head/list where lbs=生产入库 AND date0 在窗口 AND (slzx>=sl OR gdyn=1)；分母=sys_pelist count where gw=生产 AND zzzt=在职',
   'T8.dbo.kc_tz_head','月','生产执行',NULL,'个/人','higher_is_better',
   0,620,'方老师 v5.4 KPI #23；当前 T8 中 gw 全空，分母为 NULL 时 efficiency 写 NULL（不伪装 0）',1,0,NOW(),
   NULL,NULL),
  ('S7_L1_001','S7',1,NULL,'订单发货周期',
   'S7 成品仓储：订单最后一行物料发货日期与最早一行物料 FQC 报检日期的天数差',
   '订单发货周期 = 订单最后一行物料发货日期 - 订单最早一行物料 FQC 报检日期',
   '基于 kc_dd_head/list + kc_tz_head/list + kc_zj_list 5 表 JOIN，按 noid 分组取 datediff(day,min(shdate),max(shtime))；仅保留 min(wczt)=1 的订单',
   'T8.dbo.kc_dd_head','天','成品仓储',NULL,'天','lower_is_better',
   0,710,'方老师 v5.4 KPI #25；最复杂 5 表 JOIN',1,0,NOW(),
   NULL,NULL),
  ('S7_L1_002','S7',1,NULL,'订单发货满足率',
   'S7 成品仓储：在确认交期前发货的行数占订单总行数的比率',
   '订单发货满足率 = (在确认交期前发货的行数 / 该订单总行数) × 100%',
   '按 (noid, rwnoid, code) 关联，wczt = case when SUM(kc_tz_list.slzx where lbs=销售出库 AND shtime<=jhdate) >= kc_dd_list.sl then 1 else 0',
   'T8.dbo.kc_dd_head','天','成品仓储',NULL,'%','higher_is_better',
   0,720,'方老师 v5.4 KPI #26；total_rows=0 时 fulfillment_rate 写 NULL',1,0,NOW(),
   NULL,NULL),
  ('S7_L1_003','S7',1,NULL,'成品仓储人效',
   'S7 成品仓储：单位仓储人员完成的发货物料数量',
   'H = 完成发货的订单物料数量 / 成品仓储人数',
   '分子=SUM(kc_tz_list.slzx) where lbs=销售出库 AND shtime 在窗口；分母=sys_pelist count where gw=仓管 AND zzzt=在职（与 S5 #18 共用 gw 枚举）',
   'T8.dbo.kc_tz_head','月','成品仓储',NULL,'个/人','higher_is_better',
   0,730,'方老师 v5.4 KPI #27；分母 NULL 或 0 时 efficiency 写 NULL（不伪装 0）；gw 是否区分物料仓 vs 成品仓待业务侧确认',1,0,NOW(),
   NULL,NULL)
ON DUPLICATE KEY UPDATE
  `MetricName`=VALUES(`MetricName`),
  `Description`=VALUES(`Description`),
  `Formula`=VALUES(`Formula`),
  `CalcRule`=VALUES(`CalcRule`),
  `DataSource`=VALUES(`DataSource`),
  `StatFrequency`=VALUES(`StatFrequency`),
  `Department`=VALUES(`Department`),
  `Unit`=VALUES(`Unit`),
  `Direction`=VALUES(`Direction`),
  `SortNo`=VALUES(`SortNo`),
  `Remark`=VALUES(`Remark`),
  `IsEnabled`=VALUES(`IsEnabled`),
  `UpdatedAt`=NOW();
