import { Alert, Button, Card, Col, Descriptions, Input, Modal, Row, Select, Space, Statistic, Tag, Typography, message } from "antd"; import { EyeOutlined, ReloadOutlined, SearchOutlined } from "@ant-design/icons"; import { useEffect, useMemo, useState } from "react"; import PageContainer from "@/components/shared/PageContainer"; import ListTable from "@/components/shared/ListTable/ListTable"; import AppPagination from "@/components/shared/AppPagination"; import { getMeetingPointsLedgerDetail, getMeetingPointsLedgerPage, getMeetingPointsOverview, type MeetingPointsLedgerDetailVO, type MeetingPointsLedgerListItemVO, type MeetingPointsOverviewVO, } from "@/api/business/meetingPoints"; const { Text } = Typography; const POINTS_TYPE_OPTIONS = [ { label: "全部类型", value: "" }, { label: "转录", value: "ASR" }, { label: "总结", value: "LLM" }, ]; function getAccountModeLabel(mode?: string) { return mode === "PERSONAL" ? "个人账户" : "公共账户"; } function getPointsTypeLabel(value?: string) { if (value === "ASR") { return "转录"; } if (value === "LLM") { return "总结"; } if (value === "INIT") { return "初始化"; } if (value === "RECHARGE") { return "充值"; } return value || "-"; } function getPointsTypeColor(value?: string) { if (value === "ASR") { return "blue"; } if (value === "LLM") { return "purple"; } if (value === "RECHARGE") { return "green"; } return "default"; } function getChargeTriggerLabel(value?: string) { if (value === "RESUMMARY") { return "重新总结"; } if (value === "AUTO_SUMMARY") { return "自动总结"; } return "-"; } function formatDateTime(value?: string) { return value ? value.replace("T", " ").substring(0, 19) : "-"; } export default function MeetingPointsManagement() { const [overview, setOverview] = useState(null); const [loading, setLoading] = useState(false); const [detailLoading, setDetailLoading] = useState(false); const [records, setRecords] = useState([]); const [total, setTotal] = useState(0); const [detailOpen, setDetailOpen] = useState(false); const [detail, setDetail] = useState(null); const [params, setParams] = useState({ current: 1, size: 20, username: "", pointsType: "", }); const loadOverview = async () => { const data = await getMeetingPointsOverview(); setOverview(data); }; const loadPage = async (nextParams = params) => { setLoading(true); try { const result = await getMeetingPointsLedgerPage(nextParams); setRecords(result.records || []); setTotal(result.total || 0); } finally { setLoading(false); } }; useEffect(() => { void loadOverview(); void loadPage(); }, []); const handleSearch = () => { const nextParams = { ...params, current: 1 }; setParams(nextParams); void loadPage(nextParams); }; const handleReset = () => { const nextParams = { current: 1, size: 20, username: "", pointsType: "", }; setParams(nextParams); void loadPage(nextParams); }; const handleRefresh = async () => { await Promise.all([loadOverview(), loadPage()]); message.success("已刷新积分数据"); }; const handleOpenDetail = async (ledgerId: number) => { setDetailLoading(true); setDetailOpen(true); try { const data = await getMeetingPointsLedgerDetail(ledgerId); setDetail(data); } finally { setDetailLoading(false); } }; const columns = useMemo( () => [ { title: "用户名", dataIndex: "ownerUserName", key: "ownerUserName", width: 140, render: (value: string) => {value || "-"}, }, { title: "消耗类型", dataIndex: "pointsType", key: "pointsType", width: 100, render: (value: string) => {getPointsTypeLabel(value)}, }, { title: "消耗积分", dataIndex: "consumedPoints", key: "consumedPoints", width: 110, render: (value: number) => {value ?? 0}, }, { title: "会议标题", dataIndex: "meetingTitle", key: "meetingTitle", ellipsis: true, render: (value: string) => {value || "-"}, }, { title: "触发类型", dataIndex: "chargeTriggerType", key: "chargeTriggerType", width: 130, render: (value: string) => {getChargeTriggerLabel(value)}, }, { title: "消耗时间", dataIndex: "createdAt", key: "createdAt", width: 180, render: (value: string) => {formatDateTime(value)}, }, { title: "操作", key: "action", width: 88, fixed: "right" as const, render: (_: unknown, record: MeetingPointsLedgerListItemVO) => ( ), }, ], [], ); return ( {/*当前结算模式:{getAccountModeLabel(overview?.accountMode)}*/} } toolbar={ setParams((prev) => ({ ...prev, username: event.target.value }))} style={{ width: 220 }} prefix={} allowClear />