SOURCE

console 命令行工具 X clear

                    
>
console
function generateMonthlyData(data, conditions) {
    // 初始化1-12个月的数据模板
    const months = _.range(1, 13).map(month => ({
        key: `date${month < 10 ? '0' + month : month}`,
        date: month < 10 ? '0' + month : month,
        numKey: `date${month < 10 ? '0' + month : month }-num`
    }));

    // 按月份分组数据
    const dataByMonth = _.groupBy(data, item => item.recordDate.substring(0, 7));

    // 处理每个条件
    return _.flatMap(conditions, condition => {
        const [categoryName, fields] = _.toPairs(condition)[0];

        // 处理每个字段
        return _.map(fields, field => {
            const fieldMappings = {
                'totalNum': '反馈台数',
                'totalInstallShipping': '当月直签在途数',
                'totalBuyoutShipping': '买断18个月在途',
                'complaintRate': '总投诉率',
                'complaintRateTarget': '总投诉率指标',
                'installNum': '安装台数',
                'installComplaintRate': '安装投诉率',
                'maintenanceNum': '维保台数',
                'maintenanceComplaintRate': '维保投诉率'
            };

            const name = fieldMappings[field] || field;

            // 初始化每个月份的默认值
            const monthlyData = {};
            months.forEach(({ key, date, numKey }) => {
                monthlyData[key] = date;
                monthlyData[numKey] = 0; // 默认0,后续填充真实数据
            });
            // 填充实际数据
            _.forEach(dataByMonth, (items, month) => {
                const monthValue = dayjs(month).format('MM');
                const monthKey = `date${monthValue}`;
                const numKey = `${monthKey}-num`;
                const value = _.get(items[0], field, 0);
                monthlyData[numKey] = value !== undefined ? value : 0;
            });

            // 计算平均值(不忽略0,直接累加12个月后除以12)
            const values = months.map(({ numKey }) => {
                const val = monthlyData[numKey];
                return val !== "" ? parseFloat(val) || 0 : 0; // 空值视为0
            });

            const avg = _.round(_.sum(values) / 12, 2); // 直接计算12个月的平均值

            return {
                ...monthlyData,
                complaintCateName: categoryName,
                complaintCateNameId: categoryName,
                name
            };
        });
    });
}

// 使用示例
const data = [
    {"id":"1921745702099095553","createduserid":"","createddate":"2025-05-12 09:54:14.000","updateduserid":"","updateddate":"","tenantId":"","totalNum":605,"totalInstallShipping":3057,"totalBuyoutShipping":10490,"complaintRate":"10490.06","complaintRateTarget":"","installNum":155,"installComplaintRate":"12490.01","maintenanceNum":7,"maintenanceComplaintRate":"30490.00","recordDate":"2025-01-12"},
    {"id":"1921745702099095553","createduserid":"","createddate":"2025-05-12 09:54:14.000","updateduserid":"","updateddate":"","tenantId":"","totalNum":305,"totalInstallShipping":5011,"totalBuyoutShipping":20490,"complaintRate":"20490.06","complaintRateTarget":"","installNum":55,"installComplaintRate":"20490.01","maintenanceNum":7,"maintenanceComplaintRate":"20490.00","recordDate":"2025-04-12"}
];
const conditions = [
    { '总投诉率': ['totalNum', 'totalInstallShipping', 'totalBuyoutShipping', 'complaintRate', 'complaintRateTarget'] },
    { '安装阶段': ['totalNum', 'totalInstallShipping', 'totalBuyoutShipping', 'installNum', 'installComplaintRate'] },
    { '维保阶段': ['totalNum', 'totalInstallShipping', 'totalBuyoutShipping', 'maintenanceNum', 'maintenanceComplaintRate'] }
];

const result = generateMonthlyData(data, conditions);
console.log(result);
<script src="https://unpkg.com/lodash@4.17.21"></script>
<script src="https://unpkg.com/dayjs@1.11.13"></script>