Просмотр исходного кода

feat: enhance dashboard charts with improved dimension handling and ranking logic

CaIon 3 недель назад
Родитель
Сommit
7cfaf6c335
1 измененных файлов с 57 добавлено и 1 удалено
  1. 57 1
      web/src/hooks/dashboard/useDashboardCharts.jsx

+ 57 - 1
web/src/hooks/dashboard/useDashboardCharts.jsx

@@ -214,6 +214,29 @@ export const useDashboardCharts = (
           },
           },
         ],
         ],
       },
       },
+      dimension: {
+        content: [
+          {
+            key: (datum) => datum['Model'],
+            value: (datum) => datum['Count'] || 0,
+          },
+        ],
+        updateContent: (array) => {
+          array.sort((a, b) => b.value - a.value);
+          let sum = 0;
+          for (let i = 0; i < array.length; i++) {
+            let value = parseFloat(array[i].value);
+            if (isNaN(value)) value = 0;
+            sum += value;
+            array[i].value = renderNumber(value);
+          }
+          array.unshift({
+            key: t('总计'),
+            value: renderNumber(sum),
+          });
+          return array;
+        },
+      },
     },
     },
     color: {
     color: {
       specified: modelColorMap,
       specified: modelColorMap,
@@ -335,6 +358,27 @@ export const useDashboardCharts = (
           value: (datum) => renderQuota(datum['rawQuota'] || 0, 4),
           value: (datum) => renderQuota(datum['rawQuota'] || 0, 4),
         }],
         }],
       },
       },
+      dimension: {
+        content: [{
+          key: (datum) => datum['User'],
+          value: (datum) => datum['rawQuota'] || 0,
+        }],
+        updateContent: (array) => {
+          array.sort((a, b) => b.value - a.value);
+          let sum = 0;
+          for (let i = 0; i < array.length; i++) {
+            let value = parseFloat(array[i].value);
+            if (isNaN(value)) value = 0;
+            sum += value;
+            array[i].value = renderQuota(value, 4);
+          }
+          array.unshift({
+            key: t('总计'),
+            value: renderQuota(sum, 4),
+          });
+          return array;
+        },
+      },
     },
     },
     color: { type: 'ordinal', range: USER_COLORS },
     color: { type: 'ordinal', range: USER_COLORS },
   });
   });
@@ -463,13 +507,25 @@ export const useDashboardCharts = (
       modelLineData.sort((a, b) => a.Time.localeCompare(b.Time));
       modelLineData.sort((a, b) => a.Time.localeCompare(b.Time));
 
 
       // ===== 模型调用次数排行柱状图 =====
       // ===== 模型调用次数排行柱状图 =====
-      const rankData = Array.from(modelTotals)
+      const MAX_RANK_MODELS = 20;
+      const allRankData = Array.from(modelTotals)
         .map(([model, count]) => ({
         .map(([model, count]) => ({
           Model: model,
           Model: model,
           Count: count,
           Count: count,
         }))
         }))
         .sort((a, b) => b.Count - a.Count);
         .sort((a, b) => b.Count - a.Count);
 
 
+      let rankData;
+      if (allRankData.length > MAX_RANK_MODELS) {
+        const topModels = allRankData.slice(0, MAX_RANK_MODELS);
+        const otherCount = allRankData
+          .slice(MAX_RANK_MODELS)
+          .reduce((sum, item) => sum + item.Count, 0);
+        rankData = [...topModels, { Model: t('其他'), Count: otherCount }];
+      } else {
+        rankData = allRankData;
+      }
+
       updateChartSpec(
       updateChartSpec(
         setSpecModelLine,
         setSpecModelLine,
         modelLineData,
         modelLineData,