1、修复后台首页数据概览的团队积分消耗排行情况
2、修复后台交易流水数据
This commit is contained in:
@@ -3,7 +3,7 @@ import {
|
||||
Button, Card, DatePicker, Input, message, Select, Space, Table, Tag, Typography,
|
||||
} from 'antd';
|
||||
import {
|
||||
ArrowDownOutlined, ArrowUpOutlined, DownloadOutlined, ReloadOutlined, RollbackOutlined, WalletOutlined,
|
||||
ArrowDownOutlined, ArrowUpOutlined, DollarOutlined, DownloadOutlined, ReloadOutlined, RollbackOutlined, WalletOutlined,
|
||||
} from '@ant-design/icons';
|
||||
import { exportStyledExcel, type StyledExcelColumn } from '../utils/excelExport';
|
||||
import dayjs from 'dayjs';
|
||||
@@ -17,6 +17,11 @@ const DEFAULT_SUMMARY: AdminCreditRecordSummary = {
|
||||
totalRecharge: 0,
|
||||
totalConsume: 0,
|
||||
totalRefund: 0,
|
||||
totalCharge: 0,
|
||||
totalHold: 0,
|
||||
totalRefundReal: 0,
|
||||
totalHoldRelease: 0,
|
||||
netConsume: 0,
|
||||
transactionCount: 0,
|
||||
generationCount: 0,
|
||||
generationAttemptCount: 0,
|
||||
@@ -310,17 +315,22 @@ const AdminCreditRecords: React.FC = () => {
|
||||
],
|
||||
summaryRows: [
|
||||
['总充值', exportSummary.totalRecharge],
|
||||
['总消费', exportSummary.totalConsume],
|
||||
['总回退', exportSummary.totalRefund],
|
||||
['总消费(真实扣费 + 预扣占用)', exportSummary.totalConsume],
|
||||
[' · 真实扣费(独立统计:type=消费 & action=charge/NULL)', exportSummary.totalCharge],
|
||||
[' · 预扣占用(独立统计:type=消费 & action=hold)', exportSummary.totalHold],
|
||||
['总回退(真实退款 + 预扣释放)', exportSummary.totalRefund],
|
||||
[' · 真实退款(独立统计:type=回退 & action=refund/NULL)', exportSummary.totalRefundReal],
|
||||
[' · 预扣释放(独立统计:type=回退 & action=hold_release)', exportSummary.totalHoldRelease],
|
||||
['净消耗(总消费 − 总回退,≥ 0)', exportSummary.netConsume],
|
||||
['交易笔数', exportSummary.transactionCount],
|
||||
['生成条数', exportSummary.generationCount],
|
||||
['生成尝试次数', exportSummary.generationAttemptCount],
|
||||
['图片生成条数', exportSummary.imageGenerationCount],
|
||||
['视频生成条数', exportSummary.videoGenerationCount],
|
||||
['图片消费积分', exportSummary.imageConsume],
|
||||
['视频消费积分', exportSummary.videoConsume],
|
||||
['提词消费积分', exportSummary.textConsume],
|
||||
['视频分析积分', exportSummary.analysisConsume],
|
||||
['图片消费积分(仅真实扣费)', exportSummary.imageConsume],
|
||||
['视频消费积分(仅真实扣费)', exportSummary.videoConsume],
|
||||
['提词消费积分(仅真实扣费)', exportSummary.textConsume],
|
||||
['视频分析积分(仅真实扣费)', exportSummary.analysisConsume],
|
||||
['总 Token', exportSummary.totalTokens],
|
||||
['输入 Token', exportSummary.inputTokens],
|
||||
['输出 Token', exportSummary.outputTokens],
|
||||
@@ -358,11 +368,64 @@ const AdminCreditRecords: React.FC = () => {
|
||||
|
||||
return (
|
||||
<div>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: 16, marginBottom: 16 }}>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}><Space><ArrowUpOutlined style={{ color: '#10b981', fontSize: 22 }} /><div><div style={{ color: '#94a3b8' }}>总充值</div><div style={{ fontSize: 22, fontWeight: 800, color: '#10b981' }}>+{n(summary.totalRecharge)}</div></div></Space></Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}><Space><ArrowDownOutlined style={{ color: '#ef4444', fontSize: 22 }} /><div><div style={{ color: '#94a3b8' }}>总消费</div><div style={{ fontSize: 22, fontWeight: 800, color: '#ef4444' }}>-{n(summary.totalConsume)}</div></div></Space></Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}><Space><RollbackOutlined style={{ color: '#3b82f6', fontSize: 22 }} /><div><div style={{ color: '#94a3b8' }}>总回退</div><div style={{ fontSize: 22, fontWeight: 800, color: '#3b82f6' }}>+{n(summary.totalRefund)}</div></div></Space></Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}><Space><WalletOutlined style={{ color: '#6366f1', fontSize: 22 }} /><div><div style={{ color: '#94a3b8' }}>交易 / 生成</div><div style={{ fontSize: 22, fontWeight: 800 }}>{n(summary.transactionCount)} / {n(summary.generationCount)}</div></div></Space></Card>
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(5, minmax(0, 1fr))', gap: 16, marginBottom: 16 }}>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}>
|
||||
<Space><ArrowUpOutlined style={{ color: '#10b981', fontSize: 22 }} />
|
||||
<div>
|
||||
<div style={{ color: '#94a3b8' }}>总充值</div>
|
||||
<div style={{ fontSize: 22, fontWeight: 800, color: '#10b981' }}>+{n(summary.totalRecharge)}</div>
|
||||
</div>
|
||||
</Space>
|
||||
</Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}>
|
||||
<Space><ArrowDownOutlined style={{ color: '#ef4444', fontSize: 22 }} />
|
||||
<div style={{ minWidth: 0 }}>
|
||||
<div style={{ color: '#94a3b8' }}>
|
||||
总消费
|
||||
<span style={{ marginLeft: 6, fontSize: 10, color: '#94a3b8' }}>(真实扣费 + 预扣占用)</span>
|
||||
</div>
|
||||
<div style={{ fontSize: 22, fontWeight: 800, color: '#ef4444' }}>-{n(summary.totalConsume)}</div>
|
||||
<div style={{ fontSize: 11, color: '#94a3b8', marginTop: 2 }}>
|
||||
真实 <span style={{ color: '#b91c1c', fontWeight: 600 }}>{n(summary.totalCharge)}</span>
|
||||
<span style={{ margin: '0 4px', color: '#cbd5e1' }}>|</span>
|
||||
预扣 <span style={{ color: '#d97706', fontWeight: 600 }}>{n(summary.totalHold)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</Space>
|
||||
</Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}>
|
||||
<Space><RollbackOutlined style={{ color: '#3b82f6', fontSize: 22 }} />
|
||||
<div style={{ minWidth: 0 }}>
|
||||
<div style={{ color: '#94a3b8' }}>
|
||||
总回退
|
||||
<span style={{ marginLeft: 6, fontSize: 10, color: '#94a3b8' }}>(真实退款 + 预扣释放)</span>
|
||||
</div>
|
||||
<div style={{ fontSize: 22, fontWeight: 800, color: '#3b82f6' }}>+{n(summary.totalRefund)}</div>
|
||||
<div style={{ fontSize: 11, color: '#94a3b8', marginTop: 2 }}>
|
||||
退款 <span style={{ color: '#1d4ed8', fontWeight: 600 }}>{n(summary.totalRefundReal)}</span>
|
||||
<span style={{ margin: '0 4px', color: '#cbd5e1' }}>|</span>
|
||||
释放 <span style={{ color: '#047857', fontWeight: 600 }}>{n(summary.totalHoldRelease)}</span>
|
||||
</div>
|
||||
</div>
|
||||
</Space>
|
||||
</Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5', background: 'linear-gradient(135deg, #faf5ff 0%, #eef2ff 100%)' }}>
|
||||
<Space><DollarOutlined style={{ color: '#6366f1', fontSize: 22 }} />
|
||||
<div>
|
||||
<div style={{ color: '#6366f1' }}>净消耗(实际用掉)</div>
|
||||
<div style={{ fontSize: 22, fontWeight: 800, color: '#4338ca' }}>{n(summary.netConsume)}</div>
|
||||
<div style={{ fontSize: 11, color: '#818cf8', marginTop: 2 }}>总消费 − 总回退(≥ 0)</div>
|
||||
</div>
|
||||
</Space>
|
||||
</Card>
|
||||
<Card bordered={false} style={{ borderRadius: 12, border: '1px solid #f0f0f5' }}>
|
||||
<Space><WalletOutlined style={{ color: '#6366f1', fontSize: 22 }} />
|
||||
<div>
|
||||
<div style={{ color: '#94a3b8' }}>交易 / 生成</div>
|
||||
<div style={{ fontSize: 22, fontWeight: 800 }}>{n(summary.transactionCount)} / {n(summary.generationCount)}</div>
|
||||
</div>
|
||||
</Space>
|
||||
</Card>
|
||||
</div>
|
||||
|
||||
<div style={{ display: 'grid', gridTemplateColumns: 'repeat(4, minmax(0, 1fr))', gap: 16, marginBottom: 16 }}>
|
||||
|
||||
@@ -868,16 +868,32 @@ export interface VideoPromptSchemaPreviewOut {
|
||||
|
||||
export interface AdminCreditRecordSummary {
|
||||
totalRecharge: number;
|
||||
/** 总消费(仅 type=consume,不含团队内部转账)= 真实扣费 + 预扣占用 */
|
||||
totalConsume: number;
|
||||
/** 总回退(仅 type=refund)= 真实退款 + 预扣释放 */
|
||||
totalRefund: number;
|
||||
/** 独立统计列:真实扣费 charge(含历史 NULL),对应"筛选类型=消费 & action=charge/NULL"求和 */
|
||||
totalCharge: number;
|
||||
/** 独立统计列:预扣占用 hold */
|
||||
totalHold: number;
|
||||
/** 独立统计列:真实退款 refund(含历史 NULL) */
|
||||
totalRefundReal: number;
|
||||
/** 独立统计列:预扣释放 hold_release(type=refund, action=hold_release) */
|
||||
totalHoldRelease: number;
|
||||
/** 净消耗 = max(totalConsume - totalRefund, 0),即真正"用掉了"的积分 */
|
||||
netConsume: number;
|
||||
transactionCount: number;
|
||||
generationCount: number;
|
||||
generationAttemptCount: number;
|
||||
imageGenerationCount: number;
|
||||
videoGenerationCount: number;
|
||||
/** 子分类消费(图片)仅真实扣费 charge 口径 */
|
||||
imageConsume: number;
|
||||
/** 子分类消费(视频)仅真实扣费 charge 口径 */
|
||||
videoConsume: number;
|
||||
/** 子分类消费(提词)仅真实扣费 charge 口径 */
|
||||
textConsume: number;
|
||||
/** 子分类消费(分析)仅真实扣费 charge 口径 */
|
||||
analysisConsume: number;
|
||||
totalTokens: number;
|
||||
inputTokens: number;
|
||||
|
||||
Reference in New Issue
Block a user