// ModelSettingsVisualEditor.js import React, { useEffect, useState } from 'react'; import { Table, Button, Input, Modal, Form, Space } from '@douyinfe/semi-ui'; import { IconDelete, IconPlus, IconSearch, IconSave } from '@douyinfe/semi-icons'; import { showError, showSuccess } from '../../../helpers'; import { API } from '../../../helpers'; import { useTranslation } from 'react-i18next'; export default function ModelSettingsVisualEditor(props) { const { t } = useTranslation(); const [models, setModels] = useState([]); const [visible, setVisible] = useState(false); const [currentModel, setCurrentModel] = useState(null); const [searchText, setSearchText] = useState(''); const [currentPage, setCurrentPage] = useState(1); const [loading, setLoading] = useState(false); const pageSize = 10; useEffect(() => { try { const modelPrice = JSON.parse(props.options.ModelPrice || '{}'); const modelRatio = JSON.parse(props.options.ModelRatio || '{}'); const completionRatio = JSON.parse(props.options.CompletionRatio || '{}'); // 合并所有模型名称 const modelNames = new Set([ ...Object.keys(modelPrice), ...Object.keys(modelRatio), ...Object.keys(completionRatio) ]); const modelData = Array.from(modelNames).map(name => ({ name, price: modelPrice[name] === undefined ? '' : modelPrice[name], ratio: modelRatio[name] === undefined ? '' : modelRatio[name], completionRatio: completionRatio[name] === undefined ? '' : completionRatio[name] })); setModels(modelData); } catch (error) { console.error('JSON解析错误:', error); } }, [props.options]); // 首先声明分页相关的工具函数 const getPagedData = (data, currentPage, pageSize) => { const start = (currentPage - 1) * pageSize; const end = start + pageSize; return data.slice(start, end); }; // 在 return 语句之前,先处理过滤和分页逻辑 const filteredModels = models.filter(model => searchText ? model.name.toLowerCase().includes(searchText.toLowerCase()) : true ); // 然后基于过滤后的数据计算分页数据 const pagedData = getPagedData(filteredModels, currentPage, pageSize); const SubmitData = async () => { setLoading(true); const output = { ModelPrice: {}, ModelRatio: {}, CompletionRatio: {} }; let currentConvertModelName = ''; try { // 数据转换 models.forEach(model => { currentConvertModelName = model.name; if (model.price !== '') { // 如果价格不为空,则转换为浮点数,忽略倍率参数 output.ModelPrice[model.name] = parseFloat(model.price) } else { if (model.ratio !== '') output.ModelRatio[model.name] = parseFloat(model.ratio); if (model.completionRatio !== '') output.CompletionRatio[model.name] = parseFloat(model.completionRatio); } }); // 准备API请求数组 const finalOutput = { ModelPrice: JSON.stringify(output.ModelPrice, null, 2), ModelRatio: JSON.stringify(output.ModelRatio, null, 2), CompletionRatio: JSON.stringify(output.CompletionRatio, null, 2) }; const requestQueue = Object.entries(finalOutput).map(([key, value]) => { return API.put('/api/option/', { key, value }); }); // 批量处理请求 const results = await Promise.all(requestQueue); // 验证结果 if (requestQueue.length === 1) { if (results.includes(undefined)) return; } else if (requestQueue.length > 1) { if (results.includes(undefined)) { return showError('部分保存失败,请重试'); } } // 检查每个请求的结果 for (const res of results) { if (!res.data.success) { return showError(res.data.message); } } showSuccess('保存成功'); props.refresh(); } catch (error) { console.error('保存失败:', error); showError('保存失败,请重试'); } finally { setLoading(false); } }; const columns = [ { title: t('模型名称'), dataIndex: 'name', key: 'name', }, { title: t('模型固定价格'), dataIndex: 'price', key: 'price', render: (text, record) => ( updateModel(record.name, 'price', value)} /> ) }, { title: t('模型倍率'), dataIndex: 'ratio', key: 'ratio', render: (text, record) => ( updateModel(record.name, 'ratio', value)} /> ) }, { title: t('补全倍率'), dataIndex: 'completionRatio', key: 'completionRatio', render: (text, record) => ( updateModel(record.name, 'completionRatio', value)} /> ) }, { title: t('操作'), key: 'action', render: (_, record) => ( } placeholder={t('搜索模型名称')} value={searchText} onChange={value => { setSearchText(value) setCurrentPage(1); }} style={{ width: 200 }} /> setCurrentPage(page), formatPageText: (page) => t('第 {{start}} - {{end}} 条,共 {{total}} 条', { start: page.currentStart, end: page.currentEnd, total: filteredModels.length }), showTotal: true, showSizeChanger: false }} /> setVisible(false)} onOk={() => { currentModel && addModel(currentModel); }} >
setCurrentModel(prev => ({ ...prev, name: value }))} /> {t('定价模式')}:{currentModel?.priceMode ? t("固定价格") : t("倍率模式")}} onChange={checked => { setCurrentModel(prev => ({ ...prev, price: '', ratio: '', completionRatio: '', priceMode: checked })); }} /> {currentModel?.priceMode ? ( setCurrentModel(prev => ({ ...prev, price: value }))} /> ) : ( <> setCurrentModel(prev => ({ ...prev, ratio: value }))} /> setCurrentModel(prev => ({ ...prev, completionRatio: value }))} /> )}
); }