UNPKG

code996

Version:

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

141 lines 5.66 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.printTrendReport = printTrendReport; const chalk_1 = __importDefault(require("chalk")); const terminal_1 = require("../../../utils/terminal"); const formatter_1 = require("../../../utils/formatter"); /** * 打印月度趋势分析报告 */ function printTrendReport(result) { console.log(); console.log(chalk_1.default.blue.bold('📈 月度趋势分析报告')); console.log(); // 打印时间范围 console.log(chalk_1.default.gray(`分析时段: ${result.timeRange.since} 至 ${result.timeRange.until}`)); console.log(chalk_1.default.gray(`总计月份: ${result.summary.totalMonths} 个月`)); console.log(); // 打印月度数据表格 printMonthlyTable(result.monthlyData); // 打印趋势摘要 printTrendSummary(result); // 打印数据说明 printDataQualityLegend(); } /** * 打印月度数据表格 */ function printMonthlyTable(monthlyData) { const terminalWidth = Math.min((0, terminal_1.getTerminalWidth)(), 120); // 根据终端宽度动态计算7列表格的列宽,避免窄终端溢出 const adaptiveColWidths = (0, terminal_1.calculateTrendTableWidths)(terminalWidth); const table = (0, terminal_1.createAdaptiveTable)(terminalWidth, 'stats', {}, adaptiveColWidths); // 表头 table.push([ { content: chalk_1.default.bold('月份'), hAlign: 'center' }, { content: chalk_1.default.bold('996指数'), hAlign: 'center' }, { content: chalk_1.default.bold('平均工时'), hAlign: 'center' }, { content: chalk_1.default.bold('稳定性'), hAlign: 'center' }, { content: chalk_1.default.bold('最晚下班'), hAlign: 'center' }, { content: chalk_1.default.bold('提交数'), hAlign: 'center' }, { content: chalk_1.default.bold('工作天数'), hAlign: 'center' }, ]); // 数据行 for (const data of monthlyData) { const indexColor = (0, formatter_1.getIndexColor)(data.index996); const qualityMark = getQualityMark(data.dataQuality); // 格式化数据 const index996Text = data.totalCommits > 0 ? data.index996.toFixed(1) : '--'; const avgWorkSpanText = data.totalCommits > 0 ? `${data.avgWorkSpan.toFixed(1)}h` : '--'; const stdDevText = data.totalCommits > 0 ? `±${data.workSpanStdDev.toFixed(1)}h` : '--'; const latestEndTimeText = data.latestEndTime; const totalCommitsText = data.totalCommits.toString(); const workDaysText = `${data.workDays}天${qualityMark}`; table.push([ { content: data.month, hAlign: 'center' }, { content: indexColor(index996Text), hAlign: 'center' }, { content: avgWorkSpanText, hAlign: 'center' }, { content: chalk_1.default.gray(stdDevText), hAlign: 'center' }, { content: chalk_1.default.yellow(latestEndTimeText), hAlign: 'center' }, { content: totalCommitsText, hAlign: 'center' }, { content: workDaysText, hAlign: 'center' }, ]); } console.log(table.toString()); console.log(); } /** * 打印趋势摘要 */ function printTrendSummary(result) { console.log(chalk_1.default.blue('📊 整体趋势:')); console.log(); const terminalWidth = Math.min((0, terminal_1.getTerminalWidth)(), 80); const summaryTable = (0, terminal_1.createAdaptiveTable)(terminalWidth, 'core'); const avgIndexColor = (0, formatter_1.getIndexColor)(result.summary.avgIndex996); const trendText = getTrendText(result.summary.trend); const trendColor = getTrendColor(result.summary.trend); summaryTable.push([ { content: chalk_1.default.bold('平均996指数'), colSpan: 1 }, { content: avgIndexColor(result.summary.avgIndex996.toFixed(1)), colSpan: 1 }, ], [ { content: chalk_1.default.bold('平均工作时长'), colSpan: 1 }, { content: `${result.summary.avgWorkSpan.toFixed(1)} 小时`, colSpan: 1 }, ], [ { content: chalk_1.default.bold('趋势方向'), colSpan: 1 }, { content: trendColor(trendText), colSpan: 1 }, ]); console.log(summaryTable.toString()); console.log(); } /** * 打印数据质量说明 */ function printDataQualityLegend() { console.log(chalk_1.default.gray('数据质量标记:')); console.log(chalk_1.default.gray(' ✓ 数据充足 (≥10天) | ⚠ 数据有限 (5-9天) | ✗ 数据不足 (<5天)')); console.log(); } /** * 获取数据质量标记 */ function getQualityMark(quality) { switch (quality) { case 'sufficient': return chalk_1.default.green(' ✓'); case 'limited': return chalk_1.default.yellow(' ⚠'); case 'insufficient': return chalk_1.default.red(' ✗'); } } /** * 获取趋势文本 */ function getTrendText(trend) { switch (trend) { case 'increasing': return '📈 加班趋势上升'; case 'decreasing': return '📉 加班趋势下降'; case 'stable': return '📊 保持稳定'; } } /** * 获取趋势颜色 */ function getTrendColor(trend) { switch (trend) { case 'increasing': return (text) => chalk_1.default.red(text); case 'decreasing': return (text) => chalk_1.default.green(text); case 'stable': return (text) => chalk_1.default.blue(text); } } //# sourceMappingURL=trend-printer.js.map