1
This commit is contained in:
Vendored
+137
-137
File diff suppressed because one or more lines are too long
Vendored
+1
-1
@@ -28,7 +28,7 @@
|
||||
}
|
||||
})();
|
||||
</script>
|
||||
<script type="module" crossorigin src="/assets/index-222rrxOK.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-D9cWJZKc.js"></script>
|
||||
<link rel="stylesheet" crossorigin href="/assets/index-D3fwIbOp.css">
|
||||
</head>
|
||||
<body>
|
||||
|
||||
@@ -794,6 +794,8 @@ export async function getAdminGenerationRecords(params?: {
|
||||
status?: string;
|
||||
engineId?: string;
|
||||
includeMediaReferences?: boolean;
|
||||
startDate?: string;
|
||||
endDate?: string;
|
||||
page?: number;
|
||||
pageSize?: number;
|
||||
}): Promise<{ total: number; items: any[] }> {
|
||||
@@ -804,6 +806,8 @@ export async function getAdminGenerationRecords(params?: {
|
||||
if (params?.includeMediaReferences !== undefined) {
|
||||
q.set('include_media_references', String(params.includeMediaReferences));
|
||||
}
|
||||
if (params?.startDate) q.set('start_date', params.startDate);
|
||||
if (params?.endDate) q.set('end_date', params.endDate);
|
||||
if (params?.page) q.set('page', String(params.page));
|
||||
if (params?.pageSize) q.set('page_size', String(params.pageSize));
|
||||
const qs = q.toString();
|
||||
|
||||
@@ -2,6 +2,7 @@ import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'
|
||||
import {
|
||||
Button,
|
||||
Card,
|
||||
DatePicker,
|
||||
Empty,
|
||||
Input,
|
||||
message,
|
||||
@@ -24,6 +25,7 @@ import {
|
||||
VideoCameraOutlined,
|
||||
FileImageOutlined,
|
||||
} from '@ant-design/icons';
|
||||
import dayjs from 'dayjs';
|
||||
import { getAdminGenerationRecords, getVideoEngines, getImageEngines } from '../api';
|
||||
import type { AdminGenerationRecord, GenerationAIMediaReference } from '../types';
|
||||
import { formatDate } from '../utils/formatDate';
|
||||
@@ -178,6 +180,9 @@ const InfoItem: React.FC<{ label: string; value?: React.ReactNode }> = ({ label,
|
||||
</div>
|
||||
);
|
||||
|
||||
const todayStart = () => dayjs().startOf('day');
|
||||
const todayEnd = () => dayjs().endOf('day');
|
||||
|
||||
const AdminGenerationRecords: React.FC = () => {
|
||||
const [records, setRecords] = useState<AdminGenerationRecord[]>([]);
|
||||
const [total, setTotal] = useState(0);
|
||||
@@ -195,6 +200,10 @@ const AdminGenerationRecords: React.FC = () => {
|
||||
const [videoPlaying, setVideoPlaying] = useState(false);
|
||||
const videoRef = useRef<HTMLVideoElement | null>(null);
|
||||
|
||||
// 时间筛选(默认当天)
|
||||
const [createdRange, setCreatedRange] = useState<any>([todayStart(), todayEnd()]);
|
||||
const [queryCreatedRange, setQueryCreatedRange] = useState<any>([todayStart(), todayEnd()]);
|
||||
|
||||
const load = useCallback(async () => {
|
||||
setLoading(true);
|
||||
try {
|
||||
@@ -203,6 +212,8 @@ const AdminGenerationRecords: React.FC = () => {
|
||||
status: filterStatus || undefined,
|
||||
engineId: filterEngineId || undefined,
|
||||
includeMediaReferences: filterIncludeMedia === '' ? undefined : filterIncludeMedia === 'true',
|
||||
startDate: queryCreatedRange?.[0]?.format?.('YYYY-MM-DD'),
|
||||
endDate: queryCreatedRange?.[1]?.format?.('YYYY-MM-DD'),
|
||||
page,
|
||||
pageSize,
|
||||
});
|
||||
@@ -246,7 +257,7 @@ const AdminGenerationRecords: React.FC = () => {
|
||||
} finally {
|
||||
setLoading(false);
|
||||
}
|
||||
}, [filterStatus, filterUserId, filterEngineId, filterIncludeMedia, page, pageSize]);
|
||||
}, [filterStatus, filterUserId, filterEngineId, filterIncludeMedia, page, pageSize, queryCreatedRange]);
|
||||
|
||||
useEffect(() => {
|
||||
load();
|
||||
@@ -300,6 +311,19 @@ const AdminGenerationRecords: React.FC = () => {
|
||||
}, [preview]);
|
||||
|
||||
const handleSearch = () => {
|
||||
setPage(1);
|
||||
setQueryCreatedRange(createdRange);
|
||||
setReloadKey((v) => v + 1);
|
||||
};
|
||||
|
||||
const handleReset = () => {
|
||||
setFilterStatus('');
|
||||
setFilterUserId('');
|
||||
setFilterEngineId('');
|
||||
setFilterIncludeMedia('');
|
||||
const defaultRange = [todayStart(), todayEnd()];
|
||||
setCreatedRange(defaultRange);
|
||||
setQueryCreatedRange(defaultRange);
|
||||
setPage(1);
|
||||
setReloadKey((v) => v + 1);
|
||||
};
|
||||
@@ -870,9 +894,23 @@ const AdminGenerationRecords: React.FC = () => {
|
||||
onPressEnter={handleSearch}
|
||||
allowClear
|
||||
/>
|
||||
<DatePicker.RangePicker
|
||||
value={createdRange}
|
||||
onChange={(dates) => {
|
||||
if (dates && dates[0] && dates[1]) {
|
||||
setCreatedRange([dates[0].startOf('day'), dates[1].endOf('day')]);
|
||||
} else {
|
||||
setCreatedRange(dates);
|
||||
}
|
||||
}}
|
||||
placeholder={['开始日期', '结束日期']}
|
||||
/>
|
||||
<Button type="primary" onClick={handleSearch} style={{ borderRadius: 8 }}>
|
||||
搜索
|
||||
</Button>
|
||||
<Button onClick={handleReset} style={{ borderRadius: 8 }}>
|
||||
重置
|
||||
</Button>
|
||||
</Space>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { Table, Button, Tag, Space, Typography, message, Modal, Card, Popconfirm, Empty, Input, DatePicker } from 'antd';
|
||||
import { CheckOutlined, CloseOutlined, EyeOutlined, FileTextOutlined, FilterOutlined } from '@ant-design/icons';
|
||||
import dayjs from 'dayjs';
|
||||
import { getAdminInvoices, getAdminInvoiceDetail, updateInvoiceStatus } from '../api';
|
||||
import { formatDate } from '../utils/formatDate';
|
||||
import type { InvoiceItem, InvoiceDetail } from '../types';
|
||||
@@ -13,8 +14,8 @@ const AdminInvoices: React.FC = () => {
|
||||
const [pageSize, setPageSize] = useState(10);
|
||||
const [statusFilter, setStatusFilter] = useState<string | null>(null);
|
||||
const [phoneFilter, setPhoneFilter] = useState<string>('');
|
||||
const [startDate, setStartDate] = useState<string>('');
|
||||
const [endDate, setEndDate] = useState<string>('');
|
||||
const [createdRange, setCreatedRange] = useState<any>([dayjs().startOf('day'), dayjs().endOf('day')]);
|
||||
const [queryCreatedRange, setQueryCreatedRange] = useState<any>([dayjs().startOf('day'), dayjs().endOf('day')]);
|
||||
|
||||
// 详情弹窗
|
||||
const [detailModalOpen, setDetailModalOpen] = useState(false);
|
||||
@@ -35,8 +36,8 @@ const AdminInvoices: React.FC = () => {
|
||||
pageSize,
|
||||
status: statusFilter || undefined,
|
||||
phone: phoneFilter || undefined,
|
||||
startDate: startDate || undefined,
|
||||
endDate: endDate || undefined,
|
||||
startDate: queryCreatedRange?.[0]?.format?.('YYYY-MM-DD'),
|
||||
endDate: queryCreatedRange?.[1]?.format?.('YYYY-MM-DD'),
|
||||
});
|
||||
setData(res.items);
|
||||
setTotal(res.total);
|
||||
@@ -49,11 +50,20 @@ const AdminInvoices: React.FC = () => {
|
||||
|
||||
useEffect(() => {
|
||||
fetchData();
|
||||
}, [page, pageSize, statusFilter, startDate, endDate]);
|
||||
}, [page, pageSize, statusFilter, queryCreatedRange]);
|
||||
|
||||
const handleSearch = () => {
|
||||
setPage(1);
|
||||
fetchData();
|
||||
setQueryCreatedRange(createdRange);
|
||||
};
|
||||
|
||||
const handleReset = () => {
|
||||
setStatusFilter(null);
|
||||
setPhoneFilter('');
|
||||
const defaultRange = [dayjs().startOf('day'), dayjs().endOf('day')];
|
||||
setCreatedRange(defaultRange);
|
||||
setQueryCreatedRange(defaultRange);
|
||||
setPage(1);
|
||||
};
|
||||
|
||||
const handleViewDetail = async (id: string) => {
|
||||
@@ -267,15 +277,19 @@ const AdminInvoices: React.FC = () => {
|
||||
allowClear
|
||||
onPressEnter={handleSearch}
|
||||
/>
|
||||
<DatePicker
|
||||
placeholder="开始日期"
|
||||
onChange={(d) => setStartDate(d ? d.format('YYYY-MM-DD') : '')}
|
||||
/>
|
||||
<DatePicker
|
||||
placeholder="结束日期"
|
||||
onChange={(d) => setEndDate(d ? d.format('YYYY-MM-DD') : '')}
|
||||
<DatePicker.RangePicker
|
||||
value={createdRange}
|
||||
onChange={(dates) => {
|
||||
if (dates && dates[0] && dates[1]) {
|
||||
setCreatedRange([dates[0].startOf('day'), dates[1].endOf('day')]);
|
||||
} else {
|
||||
setCreatedRange(dates);
|
||||
}
|
||||
}}
|
||||
placeholder={['开始日期', '结束日期']}
|
||||
/>
|
||||
<Button type="primary" onClick={handleSearch}>搜索</Button>
|
||||
<Button onClick={handleReset}>重置</Button>
|
||||
</div>
|
||||
|
||||
{loading ? (
|
||||
|
||||
Reference in New Issue
Block a user