wangrong
2026-09-26 3c7f5d8d9cc64f1d459f5e199f556a5d1e68ce49
add screen-chart.ts
1个文件已添加
55 ■■■■■ 已修改文件
src/modules/report/data/screen-chart.ts 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/modules/report/data/screen-chart.ts
New file
@@ -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:evenSplit 时均分扇区(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) }
    }));
}