import React, { useEffect, useMemo, useState } from 'react'; import { Divider, Button, Space, Table, Tag, Modal, Form, Input, Select, Upload, message, Tooltip, Popconfirm, Segmented, ConfigProvider, Statistic, Badge, } from 'antd'; import type { TableProps } from 'antd'; import { getTestAuth, apiInterceptors, getEvaluations, getDataSets, uploadDataSets, delDataSet, downloadDataSet, createEvaluations, getSpaceList, getAppList, getStorageTypes, uploadDataSetsContent, uploadDataSetsFile, delEvaluation, showEvaluation, getMetrics, updateEvaluations, downloadEvaluation, } from '@/client/api'; type Props = {}; import { useRequest } from 'ahooks'; import { InfoCircleOutlined, UploadOutlined } from '@ant-design/icons'; const { TextArea } = Input; const { useWatch } = Form; interface DataSetItemType { code: string; name: string; file_type: string; storage_type: string; storage_position: string; datasets_count: string; have_answer: boolean; members: string; user_name: string; user_id: string; sys_code: string; gmt_create: string; gmt_modified: string; } interface EvaluationItemType { evaluate_code: string; scene_key: string; scene_value: string; datasets: string; evaluate_metrics: string; context: Object; user_name: string; user_id: string; sys_code: string; parallel_num: string; state: string; result: string; average_score: string; log_info: string; gmt_create: string; gmt_modified: string; } const Evaluation = (props: Props) => { const [isModalOpen, setIsModalOpen] = useState(false); const [isDataSetModalOpen, setIsDataSetModalOpen] = useState(false); const [evaluationList, setEvaluationList] = useState([]); const [evaluationTotal, setEvaluationTotal] = useState(0); const [dataSetsTotal, setDataSetsTotal] = useState(0); const [sceneValueOptions, setSceneValueOptions] = useState<{ label: string; value: string }[]>(); const [metricOptions, setMetricOptions] = useState<{ label: string; value: string }[]>(); const [sceneValueOptionLoading, setSceneValueOptionLoading] = useState(false); const [currentTable, setCurrentTable] = useState('evaluations'); const [isModalVisible, setIsModalVisible] = useState(false); const [isAddDataSet, setIsAddDataSet] = useState(true); const [evaluationShowData, setEvaluationShowData] = useState[]>([{}]); const [storageTypeOptions, setStorageTypeOptions] = useState<{ label: string; value: string }[]>(); const [dataSetsList, setDataSetsList] = useState([]); const [currentEvaluationCode, setCurrentEvaluationCode] = useState(''); const [dataSetModalLoading, setDataSetModalLoading] = useState(false); const [evaluationModalLoading, setEvaluationModalLoading] = useState(false); const [commonLoading, setCommonLoading] = useState(false); const dataSetsOptions = useMemo(() => { return dataSetsList?.map((item) => { return { label: item?.name, value: item?.code, }; }); }, [dataSetsList]); const [form] = Form.useForm(); const [dataSetForm] = Form.useForm(); //getMetrics const { run: runGetMetrics, loading: getMetricsLoading } = useRequest( async (params) => { const [_, data] = await apiInterceptors(getMetrics(params)); return data; }, { manual: true, onSuccess: (data) => { console.log( data, data?.map((i: Record) => { return { label: i.describe, value: i.name }; }), ); setMetricOptions( data?.map((i: Record) => { return { label: i.describe, value: i.name }; }), ); }, }, ); //showEvaluation const { run: runShowEvaluation, loading: showEvaluationLoading } = useRequest( async (params) => { const [_, data] = await apiInterceptors(showEvaluation(params)); return data; }, { manual: true, onSuccess: (data) => { if (data && data.length) { setEvaluationShowData(data); setIsModalVisible(true); } }, }, ); //getStorageTypes const { run: runGetStorageTypes } = useRequest( async () => { const [_, data] = await apiInterceptors(getStorageTypes()); return data; }, { onSuccess: (data) => { data && setStorageTypeOptions( data.map((i: Record[]) => { let [k, v] = Object.entries(i)[0]; return { label: v, value: k }; }), ); }, }, ); const { run: runGetEvaluations, loading: getEvaluationsLoading, refresh: getEvaluationsRefresh, } = useRequest( async (page = 1, page_size = 10) => { const [_, data] = await apiInterceptors( getEvaluations({ page, page_size, }), ); return data; }, { // manual: true, onSuccess: (data) => { console.log(data); setEvaluationList(data?.items); setEvaluationTotal(data?.total_count); }, }, ); const { run: runGetDataSets, loading: getDataSetsLoading, refresh: getDataSetsRefresh, } = useRequest( async (page = 1, page_size = 10) => { const [_, data] = await apiInterceptors( getDataSets({ page, page_size, }), ); return data; }, { // manual: true, onSuccess: (data) => { setDataSetsList(data?.items); setDataSetsTotal(data?.total_count); }, }, ); //uploadDataSets const { run: runUploadDataSets, loading: uploadDataSetsLoading, refresh: uploadDataSetsRefresh, } = useRequest( async (data) => { const [_, res] = await apiInterceptors( uploadDataSets({ ...data, }), ); return res; }, { manual: true, onSuccess: (res) => { setEvaluationList(res?.items); }, }, ); const columns: TableProps['columns'] = [ { title: '名称', dataIndex: 'name', key: 'name', width: '10%', fixed: 'left', }, { title: '编码', dataIndex: 'code', key: 'code', width: '20%', // render: (text) => {text}, }, { title: '储存方式', dataIndex: 'storage_type', key: 'storage_type', }, { title: '数据集数量', dataIndex: 'datasets_count', key: 'datasets_count', }, { title: '创建时间', dataIndex: 'gmt_create', key: 'gmt_create', }, { title: '成员', dataIndex: 'members', key: 'members', width: '10%', render: (text) => { return text?.split(',').map((item: string) => { return {item}; }); }, }, { title: '更新时间', dataIndex: 'gmt_modified', key: 'gmt_modified', }, { title: 'Action', key: 'action', render: (_, record) => ( { const [, , res] = await apiInterceptors( delDataSet({ code: record?.code, }), ); console.log(res); if (res?.success == true) { message.success('删除成功'); getDataSetsRefresh(); } }} > ), }, ]; /* evaluations Columns */ const evaluationsColumns: TableProps['columns'] = [ { title: '数据集名称', dataIndex: 'datasets_name', key: 'datasets_name', fixed: 'left', width: '15%', render: (text) => ( {text} ), }, { title: '测评状态', dataIndex: 'state', key: 'state', render: (text) => { return ; }, }, { title: '测评编码', dataIndex: 'evaluate_code', key: 'evaluate_code', }, { title: '场景', dataIndex: 'scene_key', key: 'scene_key', }, { title: '测评指标', dataIndex: 'evaluate_metrics', key: 'evaluate_metrics', }, { title: '创建时间', dataIndex: 'gmt_create', key: 'gmt_create', }, { title: '更新时间', dataIndex: 'gmt_modified', key: 'gmt_modified', }, Table.EXPAND_COLUMN, { title: ( 详情 ), render: () => (
), }, { title: '测评结果', key: 'result', render: (_, record) => ( <> ), }, { title: '操作', key: 'action', width: '25%', render: (_, record) => ( <> { let [, , res] = await apiInterceptors( delEvaluation({ evaluation_code: record?.evaluate_code, }), ); if (res?.success == true) { message.success('删除成功'); getEvaluationsRefresh(); } }} > ), }, ]; const handleModalClose = () => { setIsModalVisible(false); }; return (
{ setCurrentTable(type as string); }} value={currentTable} /> {currentTable === 'dataSet' && ( <>
)} {currentTable === 'evaluations' && ( <>
record.evaluate_code} expandable={{ expandedRowRender: ({ average_score, log_info }) => { return (
{(() => { if (!average_score) return <>; try { const jsonData = JSON.parse(average_score); return (
{Object.entries(jsonData)?.map((item) => { let [k, v] = item; return ; })}
); } catch { return <>; } })()} {log_info && (
log: {log_info}
)}
); }, }} scroll={{ x: '100%' }} loading={getEvaluationsLoading} columns={evaluationsColumns} dataSource={evaluationList} /> )} { const values = await form.validateFields(); setEvaluationModalLoading(true); if (values) { let [, , res] = await apiInterceptors( createEvaluations({ ...values, }), ); if (res?.success) { message.success('发起成功'); getEvaluationsRefresh(); form.resetFields(); } } setIsModalOpen(false); setEvaluationModalLoading(false); }} confirmLoading={evaluationModalLoading} onCancel={() => { setIsModalOpen(false); }} >
{ dataSetForm.validateFields().then((values) => { setDataSetModalLoading(true); if (isAddDataSet) { const storageType = values.storage_type; if (storageType === 'oss') { // 创建FormData对象 const formData = new FormData(); formData.append('dataset_name', values.dataset_name); values.members && formData.append('members', values.members.join(',')); const file = values.doc_file.file; // 获取文件对象 formData.append('doc_file', file, file.name); uploadDataSetsFile(formData) .then((response) => { console.log(response); if (response.data.success) { message.success('上传成功'); runGetDataSets(); } else { message.error(response.data.err_msg); } }) .catch((error) => { console.error('上传失败', error); message.error(error?.response?.data?.err_msg || '上传失败'); }) .finally(() => { setIsDataSetModalOpen(false); setDataSetModalLoading(false); }); } else if (storageType === 'db') { uploadDataSetsContent({ dataset_name: values.dataset_name, members: values.members.join(','), content: values.content, }) .then((res) => { console.log(res); if (res.data.success) { message.success('上传成功'); runGetDataSets(); } else { message.error(res.data.err_msg); } }) .catch((err) => { console.log(err); message.error(err?.response?.data?.err_msg || '上传失败'); }) .finally(() => { setIsDataSetModalOpen(false); setDataSetModalLoading(false); dataSetForm.resetFields(); }); } } else { updateEvaluations({ code: currentEvaluationCode, members: values.members.join(','), }) .then((res) => { if (res.data.success) { message.success('更新成功'); runGetDataSets(); } else { message.error(res.data.err_msg); } }) .catch((err) => { console.log(err); message.error('更新失败'); }) .finally(() => { setIsDataSetModalOpen(false); setDataSetModalLoading(false); }); } }); }} onCancel={() => { setIsDataSetModalOpen(false); }} >
)} {useWatch('storage_type', dataSetForm) === 'oss' && isAddDataSet && ( { // console.log(file, dataSetForm.getFieldsValue()); dataSetForm.setFieldsValue({ doc_file: file, }); return false; }} onRemove={() => { dataSetForm.setFieldsValue({ doc_file: undefined, }); }} > )} {useWatch('storage_type', dataSetForm) === 'db' && isAddDataSet && (