From 3c7f5d8d9cc64f1d459f5e199f556a5d1e68ce49 Mon Sep 17 00:00:00 2001
From: wangrong <wangrong@shsening.com>
Date: 星期六, 26 九月 2026 12:15:27 +0800
Subject: [PATCH] add screen-chart.ts
---
src/modules/report/data/screen-chart.ts | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 55 insertions(+), 0 deletions(-)
diff --git a/src/modules/report/data/screen-chart.ts b/src/modules/report/data/screen-chart.ts
new file mode 100644
index 0000000..6cf1685
--- /dev/null
+++ b/src/modules/report/data/screen-chart.ts
@@ -0,0 +1,55 @@
+export type ChartRow<T> = { item: T; value: number; even: boolean };
+
+/** 鍥捐〃鍙栧�硷細0 涓嶇敾锛涚⒊鍑忔帓鍙负璐燂紝灞曠ず鏃跺彇缁濆鍊笺�� */
+export function chartValue(raw: number, carbon = false) {
+ const n = Number(raw);
+ if (!Number.isFinite(n) || n === 0) return 0;
+ return carbon ? Math.abs(n) : n;
+}
+
+/**
+ * 鍒嗙被鍥炬暟鎹細
+ * - 閮ㄥ垎鏈夊�硷細鍙繚鐣欏綋鍓嶆寚鏍� > 0 鐨勭被
+ * - 鍏ㄩ儴涓� 0锛歟venSplit 鏃跺潎鍒嗘墖鍖猴紙value=1 浠呯敤浜庡嚑浣曪紝even 鏍囪缁� tooltip 鏄剧ず 0锛�
+ */
+export function chartSeries<T>(
+ items: T[] | undefined,
+ pick: (item: T) => number,
+ opts?: { carbon?: boolean; evenSplit?: boolean }
+): ChartRow<T>[] {
+ const list = items || [];
+ const rows = list.map(item => ({
+ item,
+ raw: chartValue(pick(item), opts?.carbon)
+ }));
+ const positive = rows.filter(e => e.raw > 0);
+ if (positive.length) {
+ return positive.map(e => ({ item: e.item, value: e.raw, even: false }));
+ }
+ if (opts?.evenSplit === false) {
+ return rows.map(e => ({ item: e.item, value: 0, even: false }));
+ }
+ return rows.map(e => ({ item: e.item, value: 1, even: true }));
+}
+
+export function pieTooltipFormatter(unit = '') {
+ return (p: any) => {
+ const val = p.data?.even ? 0 : p.value;
+ const u = unit ? ` ${unit}` : '';
+ const pct = p.percent != null ? ` (${p.percent}%)` : '';
+ return `${p.name}<br/>${val}${u}${pct}`;
+ };
+}
+
+export function toPieData<T>(
+ rows: ChartRow<T>[],
+ name: (item: T) => string,
+ color: (item: T) => string | undefined
+) {
+ return rows.map(row => ({
+ name: name(row.item),
+ value: row.value,
+ even: row.even,
+ itemStyle: { color: color(row.item) }
+ }));
+}
--
Gitblit v1.9.1