console
function generateMonthlyData(data, conditions) {
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;
});
_.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;
});
const values = months.map(({ numKey }) => {
const val = monthlyData[numKey];
return val !== "" ? parseFloat(val) || 0 : 0;
});
const avg = _.round(_.sum(values) / 12, 2);
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>