code996
Version:
通过分析 Git commit 的时间分布,计算出项目的'996指数'
141 lines • 5.66 kB
JavaScript
"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