# -*- 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}")