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