import { useEffect, useMemo, useState } from 'react'; import { Plus, Search } from 'lucide-react'; import { adminApi, type AdminChannel, type ChannelReportField } from '@/api/adminApi'; import { Breadcrumb, Button, Input, Modal, Select, Table, Textarea, Tag, type TableColumn } from '@/components/ui'; export function AdminChannelReportPage() { const [channels, setChannels] = useState([]); const [fields, setFields] = useState([]); const [channelId, setChannelId] = useState(''); const [keyword, setKeyword] = useState(''); const [modalOpen, setModalOpen] = useState(false); const [code, setCode] = useState(''); const [name, setName] = useState(''); const [fieldType, setFieldType] = useState('string'); const [description, setDescription] = useState(''); const [error, setError] = useState(''); function loadData(nextChannelId = channelId) { Promise.all([adminApi.listChannels(), adminApi.listChannelReportFields(nextChannelId || undefined)]) .then(([channelItems, fieldItems]) => { setChannels(channelItems.filter((item) => item.status !== 'deleted')); setFields(fieldItems); setError(''); }) .catch((failure: Error) => setError(failure.message || '通道报备配置加载失败')); } useEffect(() => { loadData(''); }, []); const filteredFields = useMemo(() => fields.filter((field) => !keyword || [field.code, field.name, field.fieldType, field.description].join(' ').includes(keyword)), [fields, keyword]); function createField() { adminApi.createChannelReportField({ channelId, code, name, fieldType, description, status: 'active' }) .then(() => { setModalOpen(false); setCode(''); setName(''); setFieldType('string'); setDescription(''); loadData(); }) .catch((failure: Error) => setError(failure.message || '报备字段保存失败')); } const columns: Array> = [ { key: 'channel', title: '通道', width: '220px', render: (record) => channels.find((item) => item.id === record.channelId)?.name ?? record.channelId }, { key: 'code', title: '字段代码', width: '160px', render: (record) => {record.code} }, { key: 'name', title: '字段名称', width: '160px', render: (record) => record.name }, { key: 'type', title: '字段类型', width: '120px', render: (record) => record.fieldType }, { key: 'required', title: '必填', width: '90px', render: (record) => {record.required ? '是' : '否'} }, { key: 'description', title: '说明', render: (record) => record.description ?? '-' }, ]; return (

通道报备配置

{error ?

{error}

: null}
setKeyword(event.target.value)} placeholder="搜索字段代码、名称或说明" prefix={} value={keyword} />
} onClose={() => setModalOpen(false)} open={modalOpen} title="新增通道报备字段" >
setCode(event.target.value)} value={code} /> setName(event.target.value)} value={name} />