UNPKG

code996

Version:

通过分析 Git commit 的时间分布,计算出项目的'996指数'

176 lines 7.31 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitParser = void 0; const calculator_1 = require("../core/calculator"); const work_time_analyzer_1 = require("../core/work-time-analyzer"); const overtime_analyzer_1 = require("../core/overtime-analyzer"); class GitParser { /** * 将原始Git数据转换为标准化格式 * @param rawData 原始Git数据 * @param customWorkHours 可选的自定义工作时间(格式:"9-18"),如果不提供则自动识别 * @param since 开始日期 * @param until 结束日期 */ static parseGitData(rawData, customWorkHours, since, until) { // 智能识别或使用自定义的工作时间 const workTimeDetection = customWorkHours ? this.parseCustomWorkHours(customWorkHours) : work_time_analyzer_1.WorkTimeAnalyzer.detectWorkingHours(rawData.byHour, rawData.dailyFirstCommits || []); // 计算加班相关分析 const weekdayOvertime = rawData.dayHourCommits && rawData.dayHourCommits.length > 0 ? overtime_analyzer_1.OvertimeAnalyzer.calculateWeekdayOvertime(rawData.dayHourCommits, workTimeDetection) : undefined; const weekendOvertime = rawData.dailyCommitHours && rawData.dailyCommitHours.length > 0 ? overtime_analyzer_1.OvertimeAnalyzer.calculateWeekendOvertime(rawData.dailyCommitHours) : undefined; const lateNightAnalysis = rawData.dailyLatestCommits && rawData.dailyLatestCommits.length > 0 && rawData.dailyFirstCommits && rawData.dailyFirstCommits.length > 0 ? overtime_analyzer_1.OvertimeAnalyzer.calculateLateNightAnalysis(rawData.dailyLatestCommits, rawData.dailyFirstCommits, workTimeDetection, since, until) : undefined; return { hourData: rawData.byHour, dayData: rawData.byDay, totalCommits: rawData.totalCommits, workHourPl: this.calculateWorkHourPl(rawData.byHour, workTimeDetection), workWeekPl: this.calculateWorkWeekPl(rawData.byDay), detectedWorkTime: workTimeDetection, // 保存识别的工作时间 dailyFirstCommits: rawData.dailyFirstCommits, weekdayOvertime, weekendOvertime, lateNightAnalysis, }; } /** * 解析自定义工作时间字符串 * @param customWorkHours 格式:"9-18" 或 "10-19" * @returns 工作时间识别结果 */ static parseCustomWorkHours(customWorkHours) { const parts = customWorkHours.split('-'); if (parts.length !== 2) { throw new Error(`无效的工作时间格式: ${customWorkHours},正确格式为 "9-18"`); } const startHour = parseInt(parts[0], 10); const endHour = parseInt(parts[1], 10); if (isNaN(startHour) || isNaN(endHour) || startHour < 0 || startHour > 23 || endHour < 0 || endHour > 23) { throw new Error(`无效的工作时间: ${customWorkHours},小时必须在 0-23 之间`); } if (startHour >= endHour) { throw new Error(`无效的工作时间: ${customWorkHours},上班时间必须早于下班时间`); } return { startHour, endHour, isReliable: true, sampleCount: -1, // -1 表示手动指定 detectionMethod: 'manual', confidence: 100, // 手动指定视为最高可信度 startHourRange: { startHour, endHour: Math.min(endHour, startHour + 1), }, endHourRange: { startHour: Math.max(startHour, endHour - 1), endHour, }, endDetectionMethod: 'manual', }; } /** * 计算工作时间分布(按小时) * @param hourData 按小时统计的commit数据 * @param workTimeDetection 工作时间识别结果 */ static calculateWorkHourPl(hourData, workTimeDetection) { let workCount = 0; let overtimeCount = 0; for (const item of hourData) { const hour = parseInt(item.time, 10); // 判断是否在工作时间内 if (work_time_analyzer_1.WorkTimeAnalyzer.isWorkingHour(hour, workTimeDetection)) { workCount += item.count; } else { overtimeCount += item.count; } } return [ { time: '工作', count: workCount }, { time: '加班', count: overtimeCount }, ]; } /** * 计算工作时间分布(按星期) * 假设工作日为周一到周五,周末为加班 */ static calculateWorkWeekPl(dayData) { let workDayCount = 0; let weekendCount = 0; for (const item of dayData) { const day = parseInt(item.time, 10); // 工作日:周一到周五(1-5) if (day >= 1 && day <= 5) { workDayCount += item.count; } else { weekendCount += item.count; } } return [ { time: '工作日', count: workDayCount }, { time: '周末', count: weekendCount }, ]; } /** * 验证数据的完整性 */ static validateData(data) { const errors = []; const warnings = []; // 检查总commit数是否一致 const hourTotal = data.hourData.reduce((sum, item) => sum + item.count, 0); const dayTotal = data.dayData.reduce((sum, item) => sum + item.count, 0); if (hourTotal !== data.totalCommits) { errors.push(`按小时统计的总commit数(${hourTotal})与实际总commit数(${data.totalCommits})不一致`); } if (dayTotal !== data.totalCommits) { errors.push(`按星期统计的总commit数(${dayTotal})与实际总commit数(${data.totalCommits})不一致`); } // 检查是否有足够的数据 if (data.totalCommits === 0) { warnings.push('仓库中没有找到commit记录'); } // 检查数据分布 const workHourCount = data.workHourPl[0].count; const overtimeHourCount = data.workHourPl[1].count; const workDayCount = data.workWeekPl[0].count; const weekendCount = data.workWeekPl[1].count; if (workHourCount === 0 && overtimeHourCount > 0) { warnings.push('所有commit都在非工作时间,可能是加班严重或工作时间设置不合理'); } if (workDayCount === 0 && weekendCount > 0) { warnings.push('所有commit都在周末,可能是周末工作或工作日设置不合理'); } return { isValid: errors.length === 0, errors, warnings, }; } /** * 计算 996 指数 */ static calculate996Index(data) { const workTimeData = { workHourPl: data.workHourPl, workWeekPl: data.workWeekPl, hourData: data.hourData, }; return (0, calculator_1.calculate996Index)(workTimeData); } } exports.GitParser = GitParser; //# sourceMappingURL=git-parser.js.map