Files
zentao-flow/tmp/check_june_formulas.py
T

87 lines
4.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""6月数据核对:Bug密度单位 / 检出率>20%合理性 / 线上Bug率‰ / 版本计划工时vs指数"""
import io, sys, pymysql
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
conn = pymysql.connect(host='192.168.1.161', user='devgps', password='dev@2021GPS',
database='zentao_dev', charset='utf8mb4')
cur = conn.cursor()
def q(sql, args=None):
cur.execute(sql, args or ())
return cur.fetchall()
print("### 0. 库时区/月份确认(2026-06)")
print(q("SELECT NOW()"))
print("\n### 1. Bug密度:按开发者(assignedTo) 6月done任务 分子=Bug数 分母=estimate")
rows = q("""
SELECT t.assignedTo, u.realname,
COUNT(DISTINCT t.id) tasks, SUM(t.estimate) est,
(SELECT COUNT(*) FROM zt_bug b WHERE b.task IN (SELECT id FROM zt_task t2 WHERE t2.assignedTo=t.assignedTo AND t2.status='done' AND t2.finishedDate>='2026-06-01' AND t2.finishedDate<'2026-07-01' AND t2.deleted='0')) bugs
FROM zt_task t LEFT JOIN zt_user u ON u.account=t.assignedTo
WHERE t.status='done' AND t.finishedDate>='2026-06-01' AND t.finishedDate<'2026-07-01' AND t.deleted='0' AND t.assignedTo!='' AND t.assignedTo!='closed'
GROUP BY t.assignedTo ORDER BY est DESC
""")
print("account | name | done任务 | Σestimate(h) | Bug数 | ×100=% | ×1000=‰")
for r in rows:
est = float(r[3] or 0); bugs = r[4] or 0
p100 = bugs/est*100 if est else None
p1000 = bugs/est*1000 if est else None
print(f"{r[0]} | {r[1]} | {r[2]} | {est:.1f} | {bugs} | {('%.2f'%p100) if p100 is not None else 'NA'} | {('%.1f'%p1000) if p1000 is not None else 'NA'}")
print("\n### 2. 线上Bug率:6月上线需求(releaseddate) 关联 prod Bug + devel任务estimate合计")
rows = q("""
SELECT s.product, COUNT(DISTINCT s.id) stories, SUM(s.estimate) story_est
FROM zt_story s
WHERE s.releaseddate>='2026-06-01' AND s.releaseddate<'2026-07-01' AND s.deleted='0'
GROUP BY s.product
""")
print("product | 上线需求数 | Σstory.estimate")
for r in rows: print(r)
print("-- devel任务工时合计(按需求):")
rows = q("""
SELECT s.product, SUM(t.estimate) devel_est, COUNT(DISTINCT t.id) devel_tasks
FROM zt_story s JOIN zt_task t ON t.story=s.id AND t.type='devel' AND t.deleted='0'
WHERE s.releaseddate>='2026-06-01' AND s.releaseddate<'2026-07-01' AND s.deleted='0'
GROUP BY s.product
""")
for r in rows: print(r)
print("-- 这些上线需求关联的Bug(zt_bug.story IN):")
rows = q("""
SELECT s.product, b.severity, COUNT(*) cnt
FROM zt_bug b JOIN zt_story s ON b.story=s.id
WHERE s.releaseddate>='2026-06-01' AND s.releaseddate<'2026-07-01' AND s.deleted='0' AND b.deleted='0'
GROUP BY s.product, b.severity
""")
for r in rows: print(r)
print("\n### 3. 缺陷检出率:测试需求(6月releaseddate)开发工时 vs Bug(普通×1+重大×5)")
rows = q("""
SELECT s.id, s.title, s.assignedTo, e.test_person, s.product,
(SELECT SUM(t.estimate) FROM zt_task t WHERE t.story=s.id AND t.type='devel' AND t.deleted='0') devel_est,
(SELECT COUNT(*) FROM zt_bug b WHERE b.story=s.id AND b.deleted='0' AND b.severity IN (3,4)) normal_bugs,
(SELECT COUNT(*) FROM zt_bug b WHERE b.story=s.id AND b.deleted='0' AND b.severity IN (1,2)) major_bugs
FROM zt_story s LEFT JOIN zt_story_expand e ON e.story=s.id
WHERE s.releaseddate>='2026-06-01' AND s.releaseddate<'2026-07-01' AND s.deleted='0'
ORDER BY s.id
""")
tot_dev=0; tot_weight=0
for r in rows:
dev = float(r[5] or 0); w = (r[6] or 0)*1 + (r[7] or 0)*5
tot_dev += dev; tot_weight += w
print(f"story {r[0]} prod={r[4]} test={r[3]} devel_h={dev:.1f} 普通Bug={r[6]} 重大={r[7]} 加权={w}")
print(f"合计: Σ开发工时={tot_dev:.1f} Σ加权Bug={tot_weight}")
if tot_dev:
print(f"检出率 ×100 = {tot_weight/tot_dev*100:.2f}% ×1000 = {tot_weight/tot_dev*1000:.1f}‰")
print("\n### 4. 版本计划:6月发布需求 工时加权 vs 指数加权")
rows = q("""
SELECT s.id, s.releaseddate, s.estimate, e.workload_index,
(SELECT SUM(t.estimate) FROM zt_task t WHERE t.story=s.id AND t.deleted='0') task_est
FROM zt_story s LEFT JOIN zt_story_expand e ON e.story=s.id
WHERE s.releaseddate>='2026-06-01' AND s.releaseddate<'2026-07-01' AND s.deleted='0'
""")
n=len(rows); with_idx=sum(1 for r in rows if r[3] not in (None,'','0'))
sum_est=sum(float(r[4] or 0) for r in rows); sum_task=sum(float(r[2] or 0) for r in rows)
print(f"发布需求数={n} 有指数={with_idx} Σtask.estimate={sum_task:.1f} Σstory.estimate={sum_est:.1f}")