gcx/frontend/admin-web/src/pages/reports/ReportsPage.tsx

109 lines
5.0 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import React from 'react';
/**
* D5. 报表中心 - 运营报表、合规报表、数据导出
*
* 日/周/月运营报表、监管合规报表、自定义数据导出
* 包括SOX审计、SEC Filing、税务合规
*/
const reportCategories = [
{
title: '运营报表',
icon: '📊',
reports: [
{ name: '日度运营报表', desc: '交易量/金额/用户/核销率', status: '已生成', date: '2026-02-10' },
{ name: '周度运营报表', desc: '周趋势分析', status: '已生成', date: '2026-02-09' },
{ name: '月度运营报表', desc: '月度综合分析', status: '已生成', date: '2026-01-31' },
],
},
{
title: '合规报表',
icon: '📋',
reports: [
{ name: 'SAR可疑活动报告', desc: '本月可疑交易汇总', status: '待审核', date: '2026-02-10' },
{ name: 'CTR大额交易报告', desc: '>$10,000交易申报', status: '已提交', date: '2026-02-10' },
{ name: 'OFAC筛查报告', desc: '制裁名单筛查结果', status: '已生成', date: '2026-02-09' },
],
},
{
title: '财务报表',
icon: '💰',
reports: [
{ name: '发行方结算报表', desc: '各发行方结算明细', status: '已生成', date: '2026-02-10' },
{ name: '平台收入报表', desc: '手续费/Breakage收入', status: '已生成', date: '2026-01-31' },
{ name: '税务合规报表', desc: '1099-K/消费税汇总', status: '待生成', date: '' },
],
},
{
title: '审计报表',
icon: '🔍',
reports: [
{ name: 'SOX合规检查', desc: '内部控制审计', status: '已通过', date: '2026-01-15' },
{ name: 'SEC Filing', desc: '证券类披露(预留)', status: 'N/A', date: '' },
{ name: '操作审计日志', desc: '管理员操作记录', status: '已生成', date: '2026-02-10' },
],
},
];
const statusStyle = (status: string): React.CSSProperties => {
const map: Record<string, { bg: string; color: string }> = {
'已生成': { bg: 'var(--color-success-light)', color: 'var(--color-success)' },
'已提交': { bg: 'var(--color-info-light)', color: 'var(--color-info)' },
'已通过': { bg: 'var(--color-success-light)', color: 'var(--color-success)' },
'待审核': { bg: 'var(--color-warning-light)', color: 'var(--color-warning)' },
'待生成': { bg: 'var(--color-gray-100)', color: 'var(--color-text-tertiary)' },
'N/A': { bg: 'var(--color-gray-100)', color: 'var(--color-text-tertiary)' },
};
const s = map[status] || map['N/A'];
return { padding: '2px 8px', borderRadius: 'var(--radius-full)', background: s.bg, color: s.color, font: 'var(--text-caption)', fontWeight: 600 };
};
export const ReportsPage: React.FC = () => {
return (
<div>
<div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: 24 }}>
<h1 style={{ font: 'var(--text-h1)', color: 'var(--color-text-primary)' }}></h1>
<button style={{
padding: '8px 16px', border: 'none', borderRadius: 'var(--radius-sm)',
background: 'var(--color-primary)', color: 'white', cursor: 'pointer', font: 'var(--text-label)',
}}></button>
</div>
<div style={{ display: 'grid', gridTemplateColumns: '1fr 1fr', gap: 24 }}>
{reportCategories.map(cat => (
<div key={cat.title} style={{
background: 'var(--color-surface)', borderRadius: 'var(--radius-md)',
border: '1px solid var(--color-border-light)', padding: 20,
}}>
<h2 style={{ font: 'var(--text-h2)', marginBottom: 16 }}>
<span style={{ marginRight: 8 }}>{cat.icon}</span>{cat.title}
</h2>
{cat.reports.map((r, i) => (
<div key={i} style={{
display: 'flex', alignItems: 'center', padding: '12px 0',
borderBottom: i < cat.reports.length - 1 ? '1px solid var(--color-border-light)' : 'none',
}}>
<div style={{ flex: 1 }}>
<div style={{ font: 'var(--text-label)', color: 'var(--color-text-primary)' }}>{r.name}</div>
<div style={{ font: 'var(--text-body-sm)', color: 'var(--color-text-tertiary)' }}>{r.desc}</div>
</div>
<div style={{ display: 'flex', alignItems: 'center', gap: 12 }}>
<span style={statusStyle(r.status)}>{r.status}</span>
{r.date && <span style={{ font: 'var(--text-caption)', color: 'var(--color-text-tertiary)' }}>{r.date}</span>}
{r.status !== 'N/A' && r.status !== '待生成' && (
<button style={{
padding: '4px 10px', border: '1px solid var(--color-border)', borderRadius: 'var(--radius-sm)',
background: 'transparent', cursor: 'pointer', font: 'var(--text-caption)', color: 'var(--color-text-secondary)',
}}></button>
)}
</div>
</div>
))}
</div>
))}
</div>
</div>
);
};