禪道統計BUG解決時長過濾節假日和跨天問題


之前發過禪道的各種數據統計報表,使用過程中優化了一些,反映最多的是項目bug的解決時長統計問題:

1.比如當天下班左右提交的bug,研發第二天來解決,晚上這段時間應該去掉,不應計算在內

2.節假日、周末這些時間也應該去掉

python有公用模塊chinesecalendar可以解決解決第二個問題,不過這個模塊有個缺陷,每年需要更新一下,獲取當年的節假日,當然你也可以把節假日周末信息存入數據庫動態調整獲取。

common_workday.py  計算兩個時間內的休息日天數
 1 ##common_workday.py
 2 
 3 
 4 # coding = utf-8
 5 # 計算周末、節假日時間天數
 6 
 7 from datetime import datetime, timedelta
 8 from chinese_calendar import is_workday
 9 
10 
11 def workdays(start, end):
12     """
13     :param start:
14     :param end:
15     :return:
16     """
17     # 字符串格式日期的處理
18     if type(start) == str:
19         start = datetime.strptime(start, '%Y-%m-%d').date()
20     if type(end) == str:
21         end = datetime.strptime(end, '%Y-%m-%d').date()
22     # 開始日期大,顛倒開始日期和結束日期
23     if start > end:
24         start, end = end, start
25     counts = 0
26     while True:
27         if start > end:
28             break
29         # 計算兩個日期間的節假日和周末數
30         if is_workday(start) is False:
31             counts += 1
32         start += timedelta(days=1)
33     return counts

 

bug_time_summary.py  統計匯總時間(從數據庫查詢出數據后直接處理)

## bug_time_summary.py

##*****代碼片段*****##

mysql_l = deal_mysql(sys._getframe())
if len(mysql_l) > 0:
    le = []
    for i in mysql_l:
        le.append(list(i))
    for i in le:
        # bug解決時間減去bug提交時間
        ta = round(float((i[7] - i[6]).total_seconds() / 3600), 2)
        # 兩個時間之間的周末、節假日天數
        tb = float(workday.workdays(i[6].date(), i[7].date()) * 24)
        hour_sub = 0
        if i[6].day != i[7].day and i[6].hour >= 17:
            # 17點后提交的bug,計算需扣除的跨天小時數【8.5:計算方式自己動態調整,9點上班,考慮有人8點半來就修復bug了,所以取個8.5,提交bug分鍾數舍棄計算,影響不大;另外17點之前提交的bug,不排除跨天時間】
            hour_sub = 24 - i[6].hour + 8.5
        # 最終結果
        time_subtract = round(ta - tb - hour_sub, 2)
        i.append(time_subtract)
    end = []
    name = ''
    count = 0
    avg_time = 0
    for index, i in enumerate(le):
        if index == 0:
            name = i[5]
            count = 1
            avg_time = i[8]
        else:
            if i[5] == name:
                count += 1
                avg_time += i[8]
                if index == len(le) - 1:
                    end.append([le[index][0], le[index][1], le[index][5], count, round(avg_time / count, 2)])
            else:
                end.append([le[index - 1][0], le[index - 1][1], le[index - 1][5], count, round(avg_time / count, 2)])
                name = i[5]
                count = 1
                avg_time = i[8]
                if index == len(le) - 1:
                    end.append([le[index][0], le[index][1], le[index][5], count, round(avg_time / count, 2)])
    sum_p = 0
    sum_time = 0
    for i in end:
        sum_p += i[3]
        sum_time += i[4]*i[3]
    avn = round(sum_time / sum_p, 2)
    end = sorted(end, key=lambda x: x[3], reverse=True)
    data = np.tile(end, 1)
    d = data.T
    # 獲取列表合並算法
    al = dt.find_same_column(d, 1)
    # td 處理
    td = deal_td(al)
    # tr處理
    tr = deal_tr(td)
    s, h = deal_html(tr, avn)
##*****代碼片段*****##

 

 

改進前:

 

 

 改進后:

 

 

 

同樣的詳情表也可以這樣處理~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM