补挂金三角业绩_jsjid_202607.sql 11.9 KB
-- =============================================================================
-- 补挂金三角业绩 jsj_id / F_jsjid(2026年7月)
-- =============================================================================
-- ⚠️ 若全量执行易报 2013 Lost connection,请改用分批版:
--    项目文档相关/sql/2026-07-30/补挂金三角业绩_jsjid_202607_v2_分批.sql
-- =============================================================================
-- 背景:
--   1) 7/29 前无入库兜底,部分开单/耗卡业绩行 jsj_id 为空
--   2) 跨战队合开时,开单头只挂了其中一个战队,其他战队健康师业绩行漏挂
--
-- 原则(与 GoldTriangleBindingHelper 一致):
--   - 按「健康师匹配键 + 业绩月份」查 lq_jinsanjiao_user 活跃绑定
--   - 每人补挂【自己当月战队】,不按开单头战队整单覆盖(支持跨战队)
--   - 仅补 jsj_id / F_jsjid 为空的有效业绩行,已有值不覆盖
--   - 同一人同月多条 ACTIVE 绑定时,取 F_CreatorTime 最新且战队主档存在的记录
--
-- 已核对(dev 库 2026-07-30):
--   虎啸龙吟三人未挂:开单 3 笔 / 耗卡 13 笔,共 16 条
--   跨战队样例 849167374304150789:唐宇欣 → 虎啸龙吟,柳全菊保持卧虎藏龙
--   7 月全量可补:开单 316 条、耗卡 866 条(有当月绑定且当前为空)
--
-- 执行顺序:备份 → 预览 → 更新 → 验证
-- =============================================================================

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. 备份(强烈建议)
-- -----------------------------------------------------------------------------
DROP TABLE IF EXISTS bak_kd_jksyj_jsjid_202607;
CREATE TABLE bak_kd_jksyj_jsjid_202607 AS
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;

DROP TABLE IF EXISTS bak_xh_jksyj_jsjid_202607;
CREATE TABLE bak_xh_jksyj_jsjid_202607 AS
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;

-- -----------------------------------------------------------------------------
-- 1. 公共:当月「健康师 → 战队」映射(去重后每人每月一条)
--    预览绑定映射(可选,执行下面 SELECT)
-- -----------------------------------------------------------------------------
/*
SELECT
  ju1.user_id,
  ju1.F_Month,
  ju1.jsj_id,
  j.jsj AS team_name,
  ju1.F_CreatorTime
FROM lq_jinsanjiao_user ju1
INNER JOIN lq_ycsd_jsj j
  ON j.F_Id = ju1.jsj_id
 AND j.yf = ju1.F_Month
WHERE ju1.F_DeleteMark = 0
  AND ju1.status = 'ACTIVE'
  AND ju1.jsj_id IS NOT NULL
  AND ju1.jsj_id <> ''
  AND ju1.F_Month = @perf_month
  AND ju1.F_CreatorTime = (
    SELECT MAX(ju2.F_CreatorTime)
    FROM lq_jinsanjiao_user ju2
    INNER JOIN lq_ycsd_jsj j2
      ON j2.F_Id = ju2.jsj_id
     AND j2.yf = ju2.F_Month
    WHERE ju2.user_id = ju1.user_id
      AND ju2.F_Month = ju1.F_Month
      AND ju2.F_DeleteMark = 0
      AND ju2.status = 'ACTIVE'
  );
*/

-- -----------------------------------------------------------------------------
-- 2. 预览:7 月待补挂开单业绩(跨战队会按健康师分别映射)
-- -----------------------------------------------------------------------------
SELECT
  k.F_Id AS perf_id,
  k.glkdbh AS order_id,
  k.jksxm,
  kd.jsj AS header_team_name,
  k.jsj_id AS old_jsj_id,
  b.jsj_id AS new_jsj_id,
  j.jsj AS new_team_name
FROM lq_kd_jksyj k
INNER JOIN (
  SELECT ju1.user_id, ju1.F_Month, ju1.jsj_id
  FROM lq_jinsanjiao_user ju1
  INNER JOIN lq_ycsd_jsj jx ON jx.F_Id = ju1.jsj_id AND jx.yf = ju1.F_Month
  WHERE ju1.F_DeleteMark = 0
    AND ju1.status = 'ACTIVE'
    AND ju1.jsj_id IS NOT NULL AND ju1.jsj_id <> ''
    AND ju1.F_CreatorTime = (
      SELECT MAX(ju2.F_CreatorTime)
      FROM lq_jinsanjiao_user ju2
      INNER JOIN lq_ycsd_jsj j2 ON j2.F_Id = ju2.jsj_id AND j2.yf = ju2.F_Month
      WHERE ju2.user_id = ju1.user_id
        AND ju2.F_Month = ju1.F_Month
        AND ju2.F_DeleteMark = 0
        AND ju2.status = 'ACTIVE'
    )
) b
  ON b.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
 AND b.F_Month = DATE_FORMAT(k.yjsj, '%Y%m')
INNER JOIN lq_ycsd_jsj j ON j.F_Id = b.jsj_id
LEFT JOIN lq_kd_kdjlb kd ON kd.F_Id = k.glkdbh
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
ORDER BY k.yjsj, k.jksxm;
-- 预期约 316 行

-- -----------------------------------------------------------------------------
-- 3. 预览:7 月待补挂耗卡业绩
-- -----------------------------------------------------------------------------
SELECT
  x.F_Id AS perf_id,
  x.glkdbh AS order_id,
  x.jksxm,
  x.F_jsjid AS old_jsj_id,
  b.jsj_id AS new_jsj_id,
  j.jsj AS new_team_name
FROM lq_xh_jksyj x
INNER JOIN (
  SELECT ju1.user_id, ju1.F_Month, ju1.jsj_id
  FROM lq_jinsanjiao_user ju1
  INNER JOIN lq_ycsd_jsj jx ON jx.F_Id = ju1.jsj_id AND jx.yf = ju1.F_Month
  WHERE ju1.F_DeleteMark = 0
    AND ju1.status = 'ACTIVE'
    AND ju1.jsj_id IS NOT NULL AND ju1.jsj_id <> ''
    AND ju1.F_CreatorTime = (
      SELECT MAX(ju2.F_CreatorTime)
      FROM lq_jinsanjiao_user ju2
      INNER JOIN lq_ycsd_jsj j2 ON j2.F_Id = ju2.jsj_id AND j2.yf = ju2.F_Month
      WHERE ju2.user_id = ju1.user_id
        AND ju2.F_Month = ju1.F_Month
        AND ju2.F_DeleteMark = 0
        AND ju2.status = 'ACTIVE'
    )
) b
  ON b.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
 AND b.F_Month = DATE_FORMAT(x.yjsj, '%Y%m')
INNER JOIN lq_ycsd_jsj j ON j.F_Id = b.jsj_id
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
ORDER BY x.yjsj, x.jksxm;
-- 预期约 866 行

-- -----------------------------------------------------------------------------
-- 4A. 【可选·最小范围】仅补虎啸龙吟三人 16 条(已逐条核对 F_Id)
--     跨战队单 849167374304150789 只补唐宇欣,不动柳全菊卧虎藏龙
-- -----------------------------------------------------------------------------
UPDATE lq_kd_jksyj
SET jsj_id = @huxiao_jsj
WHERE F_Id IN (
  '849792273540449542', -- 唐宇欣,开单 849167374304150789(头=卧虎藏龙)
  '852022282741089541', -- 唐宇欣,开单 851999330188395781
  '852022282741089542'  -- 李萌,  开单 851999330188395781
)
  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 = '');

-- -----------------------------------------------------------------------------
-- 4B. 【推荐·全量兜底】7 月所有漏挂且能匹配当月绑定的业绩行(含跨战队)
--     若已执行 4A,重复执行 4B 也安全(仅补空值)
-- -----------------------------------------------------------------------------
UPDATE lq_kd_jksyj k
INNER JOIN (
  SELECT ju1.user_id, ju1.F_Month, ju1.jsj_id
  FROM lq_jinsanjiao_user ju1
  INNER JOIN lq_ycsd_jsj jx ON jx.F_Id = ju1.jsj_id AND jx.yf = ju1.F_Month
  WHERE ju1.F_DeleteMark = 0
    AND ju1.status = 'ACTIVE'
    AND ju1.jsj_id IS NOT NULL AND ju1.jsj_id <> ''
    AND ju1.F_CreatorTime = (
      SELECT MAX(ju2.F_CreatorTime)
      FROM lq_jinsanjiao_user ju2
      INNER JOIN lq_ycsd_jsj j2 ON j2.F_Id = ju2.jsj_id AND j2.yf = ju2.F_Month
      WHERE ju2.user_id = ju1.user_id
        AND ju2.F_Month = ju1.F_Month
        AND ju2.F_DeleteMark = 0
        AND ju2.status = 'ACTIVE'
    )
) b
  ON b.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
 AND b.F_Month = DATE_FORMAT(k.yjsj, '%Y%m')
SET k.jsj_id = b.jsj_id
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;

UPDATE lq_xh_jksyj x
INNER JOIN (
  SELECT ju1.user_id, ju1.F_Month, ju1.jsj_id
  FROM lq_jinsanjiao_user ju1
  INNER JOIN lq_ycsd_jsj jx ON jx.F_Id = ju1.jsj_id AND jx.yf = ju1.F_Month
  WHERE ju1.F_DeleteMark = 0
    AND ju1.status = 'ACTIVE'
    AND ju1.jsj_id IS NOT NULL AND ju1.jsj_id <> ''
    AND ju1.F_CreatorTime = (
      SELECT MAX(ju2.F_CreatorTime)
      FROM lq_jinsanjiao_user ju2
      INNER JOIN lq_ycsd_jsj j2 ON j2.F_Id = ju2.jsj_id AND j2.yf = ju2.F_Month
      WHERE ju2.user_id = ju1.user_id
        AND ju2.F_Month = ju1.F_Month
        AND ju2.F_DeleteMark = 0
        AND ju2.status = 'ACTIVE'
    )
) b
  ON b.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
 AND b.F_Month = DATE_FORMAT(x.yjsj, '%Y%m')
SET x.F_jsjid = b.jsj_id
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;

-- -----------------------------------------------------------------------------
-- 5. 验证:虎啸龙吟 7 月战队业绩(应与接口 GetMyTeamPerformance 一致)
-- -----------------------------------------------------------------------------
SELECT
  k.jksxm,
  SUM(CAST(k.jksyj AS DECIMAL(18,2))) AS billing_amt,
  COUNT(*) AS billing_cnt
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;
-- 预期:李巧娇 42380 / 唐宇欣 37520 / 李萌 16056,合计 95956

SELECT
  x.jksxm,
  SUM(x.jksyj) AS consume_amt,
  COUNT(*) AS consume_cnt
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;
-- 预期:唐宇欣 25961.33 / 李巧娇 18508.17 / 李萌 10979.03,合计 55448.53

-- 跨战队单验证:同一开单两行应分属不同战队
SELECT k.F_Id, 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;
-- 预期:柳全菊→卧虎藏龙(841830264337335557),唐宇欣→虎啸龙吟(841830228446676229)

-- 仍为空且当月有绑定的残留(应为 0)
SELECT 'kd' AS typ, COUNT(*) AS remain
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
  AND EXISTS (
    SELECT 1 FROM lq_jinsanjiao_user ju
    WHERE ju.F_DeleteMark = 0 AND ju.status = 'ACTIVE'
      AND ju.F_Month = DATE_FORMAT(k.yjsj, '%Y%m')
      AND ju.user_id = COALESCE(NULLIF(TRIM(k.jkszh), ''), NULLIF(TRIM(k.jks), ''))
  )
UNION ALL
SELECT 'xh', COUNT(*)
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
  AND EXISTS (
    SELECT 1 FROM lq_jinsanjiao_user ju
    WHERE ju.F_DeleteMark = 0 AND ju.status = 'ACTIVE'
      AND ju.F_Month = DATE_FORMAT(x.yjsj, '%Y%m')
      AND ju.user_id = COALESCE(NULLIF(TRIM(x.jkszh), ''), NULLIF(TRIM(x.jks), ''))
  );

-- -----------------------------------------------------------------------------
-- 6. 回滚(如需)
-- -----------------------------------------------------------------------------
-- 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;