补挂金三角业绩_jsjid_202607_v2_分批.sql 11.6 KB
-- =============================================================================
-- 补挂金三角业绩 jsj_id / F_jsjid(2026年7月)— V2 分批版【全公司】
-- =============================================================================
-- 范围说明(生产数据迁库后 2026-07-30 核对):
--   - 7 月未挂:开单约 3339、耗卡约 3638(含大量「当月无战队绑定」历史行,勿全量盲补)
--   - 本脚本可安全补挂:开单 319、耗卡 891(当月有 ACTIVE 绑定且 jsj_id 为空)
--   - 虎啸龙吟仍待补:开单 3 + 耗卡 13 = 16 条(步骤 2 可先秒级验证)
--
-- 适用场景:
--   全量 UPDATE + 关联子查询易触发 2013 Lost connection,本脚本改为:
--   1) 先建「健康师→战队」映射临时表(只算一次)
--   2) 每次 UPDATE LIMIT 100,可反复执行直到影响 0 行
--   3) 仅补空值,不覆盖已有 jsj_id(支持跨战队、支持断点续跑)
--
-- 执行建议(Navicat / DBeaver):
--   - 不要一次运行整个文件;按「步骤」分段选中执行
--   - 执行前可先跑:SET SESSION net_read_timeout = 600;
--   - 步骤 C/D 重复执行同一段,直到「影响行数 = 0」
-- =============================================================================

SET NAMES utf8mb4;

-- 可选:拉长会话超时,减少 2013
SET SESSION net_read_timeout = 600;
SET SESSION net_write_timeout = 600;
SET SESSION wait_timeout = 600;
SET SESSION innodb_lock_wait_timeout = 120;

SET @month_start = '2026-07-01 00:00:00';
SET @month_end   = '2026-07-31 23:59:59';
SET @perf_month  = '202607';
SET @huxiao_jsj  = '841830228446676229'; -- 虎啸龙吟

-- =============================================================================
-- 步骤 0:断点检查(看上次是否已部分执行)
-- =============================================================================
SELECT 'bak_kd' AS item, COUNT(*) AS cnt
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bak_kd_jksyj_jsjid_202607'
UNION ALL
SELECT 'bak_xh', COUNT(*)
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = 'bak_xh_jksyj_jsjid_202607';

-- 虎啸龙吟三人 16 条关键行状态(空=未补,有值=已补)
SELECT 'kd' AS typ, k.F_Id, k.jksxm, k.jsj_id
FROM lq_kd_jksyj k
WHERE k.F_Id IN (
  '849792273540449542','852022282741089541','852022282741089542'
)
UNION ALL
SELECT 'xh', x.F_Id, x.jksxm, x.F_jsjid
FROM lq_xh_jksyj x
WHERE x.F_Id IN (
  '843749838901216517','843749838901216518','844872313659720965',
  '846897478727894277','846652670822319365','846692856495080709',
  '848020321473660165','848553719795549445','849587037194421509',
  '850906583914251525','851690507896620293','851690507900814597',
  '851690507905008901'
);

-- =============================================================================
-- 步骤 1:备份(仅未挂行,很快;若已存在可跳过)
-- =============================================================================
CREATE TABLE IF NOT EXISTS bak_kd_jksyj_jsjid_202607 (
  F_Id          VARCHAR(64)  NOT NULL,
  glkdbh        VARCHAR(64)  NULL,
  jks           VARCHAR(64)  NULL,
  jkszh         VARCHAR(64)  NULL,
  jksxm         VARCHAR(128) NULL,
  yjsj          DATETIME     NULL,
  jsj_id        VARCHAR(64)  NULL,
  F_IsEffective INT          NULL,
  PRIMARY KEY (F_Id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

CREATE TABLE IF NOT EXISTS bak_xh_jksyj_jsjid_202607 (
  F_Id          VARCHAR(64)  NOT NULL,
  glkdbh        VARCHAR(64)  NULL,
  jks           VARCHAR(64)  NULL,
  jkszh         VARCHAR(64)  NULL,
  jksxm         VARCHAR(128) NULL,
  yjsj          DATETIME     NULL,
  F_jsjid       VARCHAR(64)  NULL,
  F_IsEffective INT          NULL,
  PRIMARY KEY (F_Id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT IGNORE INTO bak_kd_jksyj_jsjid_202607
SELECT k.F_Id, k.glkdbh, k.jks, k.jkszh, k.jksxm, k.yjsj, k.jsj_id, k.F_IsEffective
FROM lq_kd_jksyj k
WHERE k.F_IsEffective = 1
  AND (k.jsj_id IS NULL OR k.jsj_id = '')
  AND k.yjsj >= @month_start
  AND k.yjsj <= @month_end;

INSERT IGNORE INTO bak_xh_jksyj_jsjid_202607
SELECT x.F_Id, x.glkdbh, x.jks, x.jkszh, x.jksxm, x.yjsj, x.F_jsjid, x.F_IsEffective
FROM lq_xh_jksyj x
WHERE x.F_IsEffective = 1
  AND (x.F_jsjid IS NULL OR x.F_jsjid = '')
  AND x.yjsj >= @month_start
  AND x.yjsj <= @month_end;

-- =============================================================================
-- 步骤 2:虎啸龙吟三人 16 条(秒级完成,建议先跑这段)
--         跨战队单 849167374304150789:只补唐宇欣,不动柳全菊
-- =============================================================================
UPDATE lq_kd_jksyj
SET jsj_id = @huxiao_jsj
WHERE F_Id IN (
  '849792273540449542',
  '852022282741089541',
  '852022282741089542'
)
  AND F_IsEffective = 1
  AND (jsj_id IS NULL OR jsj_id = '');

UPDATE lq_xh_jksyj
SET F_jsjid = @huxiao_jsj
WHERE F_Id IN (
  '843749838901216517','843749838901216518','844872313659720965',
  '846897478727894277','846652670822319365','846692856495080709',
  '848020321473660165','848553719795549445','849587037194421509',
  '850906583914251525','851690507896620293','851690507900814597',
  '851690507905008901'
)
  AND F_IsEffective = 1
  AND (F_jsjid IS NULL OR F_jsjid = '');

-- =============================================================================
-- 步骤 3:构建映射表 tmp_jsj_user_bind_202607(全公司 7 月,每人一条)
-- =============================================================================
DROP TABLE IF EXISTS tmp_jsj_user_bind_202607;

CREATE TABLE tmp_jsj_user_bind_202607 (
  user_id   VARCHAR(64) NOT NULL,
  jsj_id    VARCHAR(64) NOT NULL,
  team_name VARCHAR(128) NULL,
  PRIMARY KEY (user_id),
  KEY idx_jsj_id (jsj_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO tmp_jsj_user_bind_202607 (user_id, jsj_id, team_name)
SELECT
  x.user_id,
  MIN(x.jsj_id) AS jsj_id,
  MIN(j.jsj)    AS team_name
FROM (
  SELECT ju.user_id, ju.jsj_id
  FROM lq_jinsanjiao_user ju
  INNER JOIN (
    SELECT user_id, MAX(F_CreatorTime) AS max_ct
    FROM lq_jinsanjiao_user
    WHERE F_DeleteMark = 0
      AND status = 'ACTIVE'
      AND F_Month = @perf_month
      AND jsj_id IS NOT NULL
      AND jsj_id <> ''
    GROUP BY user_id
  ) latest
    ON latest.user_id = ju.user_id
   AND latest.max_ct = ju.F_CreatorTime
  INNER JOIN lq_ycsd_jsj j0
    ON j0.F_Id = ju.jsj_id
   AND j0.yf = ju.F_Month
  WHERE ju.F_DeleteMark = 0
    AND ju.status = 'ACTIVE'
    AND ju.F_Month = @perf_month
    AND ju.jsj_id IS NOT NULL
    AND ju.jsj_id <> ''
) x
INNER JOIN lq_ycsd_jsj j ON j.F_Id = x.jsj_id
GROUP BY x.user_id;

-- 映射表行数预览(应有当月绑定健康师人数)
SELECT COUNT(*) AS bind_user_cnt FROM tmp_jsj_user_bind_202607;

-- =============================================================================
-- 步骤 4:待补数量(执行前后对比用)
-- =============================================================================
SELECT 'kd_todo' AS typ, COUNT(*) AS cnt
FROM lq_kd_jksyj k
INNER JOIN tmp_jsj_user_bind_202607 b
  ON b.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
WHERE k.F_IsEffective = 1
  AND (k.jsj_id IS NULL OR k.jsj_id = '')
  AND k.yjsj >= @month_start
  AND k.yjsj <= @month_end
UNION ALL
SELECT 'xh_todo', COUNT(*)
FROM lq_xh_jksyj x
INNER JOIN tmp_jsj_user_bind_202607 b
  ON b.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
WHERE x.F_IsEffective = 1
  AND (x.F_jsjid IS NULL OR x.F_jsjid = '')
  AND x.yjsj >= @month_start
  AND x.yjsj <= @month_end;

-- =============================================================================
-- 步骤 5C:分批补开单(每次 100 行 —— 重复执行本段直到影响 0 行)
-- =============================================================================
UPDATE lq_kd_jksyj k
INNER JOIN (
  SELECT k2.F_Id, b2.jsj_id
  FROM lq_kd_jksyj k2
  INNER JOIN tmp_jsj_user_bind_202607 b2
    ON b2.user_id = COALESCE(NULLIF(TRIM(k2.jkszh), ''), NULLIF(TRIM(k2.jks), ''))
  WHERE k2.F_IsEffective = 1
    AND (k2.jsj_id IS NULL OR k2.jsj_id = '')
    AND k2.yjsj >= @month_start
    AND k2.yjsj <= @month_end
  ORDER BY k2.F_Id
  LIMIT 100
) batch ON batch.F_Id = k.F_Id
SET k.jsj_id = batch.jsj_id;

-- 查看还剩多少(应为 0 才停)
SELECT COUNT(*) AS kd_remain
FROM lq_kd_jksyj k
INNER JOIN tmp_jsj_user_bind_202607 b
  ON b.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
WHERE k.F_IsEffective = 1
  AND (k.jsj_id IS NULL OR k.jsj_id = '')
  AND k.yjsj >= @month_start
  AND k.yjsj <= @month_end;

-- =============================================================================
-- 步骤 5D:分批补耗卡(每次 100 行 —— 重复执行本段直到影响 0 行)
-- =============================================================================
UPDATE lq_xh_jksyj x
INNER JOIN (
  SELECT x2.F_Id, b2.jsj_id
  FROM lq_xh_jksyj x2
  INNER JOIN tmp_jsj_user_bind_202607 b2
    ON b2.user_id = COALESCE(NULLIF(TRIM(x2.jkszh), ''), NULLIF(TRIM(x2.jks), ''))
  WHERE x2.F_IsEffective = 1
    AND (x2.F_jsjid IS NULL OR x2.F_jsjid = '')
    AND x2.yjsj >= @month_start
    AND x2.yjsj <= @month_end
  ORDER BY x2.F_Id
  LIMIT 100
) batch ON batch.F_Id = x.F_Id
SET x.F_jsjid = batch.jsj_id;

SELECT COUNT(*) AS xh_remain
FROM lq_xh_jksyj x
INNER JOIN tmp_jsj_user_bind_202607 b
  ON b.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
WHERE x.F_IsEffective = 1
  AND (x.F_jsjid IS NULL OR x.F_jsjid = '')
  AND x.yjsj >= @month_start
  AND x.yjsj <= @month_end;

-- =============================================================================
-- 步骤 6:验证(虎啸龙吟 7 月)
-- =============================================================================
SELECT j.jsj AS team_name, SUM(CAST(k.jksyj AS DECIMAL(18,2))) AS billing_total
FROM lq_kd_jksyj k
LEFT JOIN lq_ycsd_jsj j ON j.F_Id = k.jsj_id
WHERE k.jsj_id = @huxiao_jsj
  AND k.F_IsEffective = 1
  AND k.yjsj >= @month_start AND k.yjsj <= @month_end
  AND k.jksyj IS NOT NULL AND k.jksyj <> '' AND k.jksyj <> '0';

-- 预期 billing_total(生产迁库后):120756.00(修复前约 115576 + 待补 5180)

SELECT k.jksxm, SUM(CAST(k.jksyj AS DECIMAL(18,2))) AS billing_amt
FROM lq_kd_jksyj k
WHERE k.jsj_id = @huxiao_jsj
  AND k.F_IsEffective = 1
  AND k.yjsj >= @month_start AND k.yjsj <= @month_end
  AND k.jksyj IS NOT NULL AND k.jksyj <> '' AND k.jksyj <> '0'
GROUP BY k.jksxm ORDER BY billing_amt DESC;

SELECT x.jksxm, SUM(x.jksyj) AS consume_amt
FROM lq_xh_jksyj x
WHERE x.F_jsjid = @huxiao_jsj
  AND x.F_IsEffective = 1
  AND x.yjsj >= @month_start AND x.yjsj <= @month_end
  AND x.jksyj IS NOT NULL AND x.jksyj <> 0
GROUP BY x.jksxm ORDER BY consume_amt DESC;
-- 预期 consume 合计(生产迁库后):84469.49(修复前约 78920.31 + 待补 5549.18)

-- 跨战队单:柳全菊=卧虎藏龙,唐宇欣=虎啸龙吟
SELECT k.jksxm, k.jsj_id, j.jsj
FROM lq_kd_jksyj k
LEFT JOIN lq_ycsd_jsj j ON j.F_Id = k.jsj_id
WHERE k.glkdbh = '849167374304150789' AND k.F_IsEffective = 1;

-- =============================================================================
-- 步骤 7:清理临时表(验证通过后)
-- =============================================================================
-- DROP TABLE IF EXISTS tmp_jsj_user_bind_202607;

-- =============================================================================
-- 回滚(慎用,按备份表恢复)
-- =============================================================================
-- UPDATE lq_kd_jksyj k
-- INNER JOIN bak_kd_jksyj_jsjid_202607 b ON b.F_Id = k.F_Id
-- SET k.jsj_id = b.jsj_id;
--
-- UPDATE lq_xh_jksyj x
-- INNER JOIN bak_xh_jksyj_jsjid_202607 b ON b.F_Id = x.F_Id
-- SET x.F_jsjid = b.F_jsjid;