// ============================================================ // 行业配置管理 // ============================================================ import { useState, useEffect } from 'react' import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query' import { Button, message, Tag, Modal, Form, Input, Select, Space, Popconfirm, Tabs, Typography, Spin, Empty, } from 'antd' import { PlusOutlined, EditOutlined, CheckCircleOutlined, StopOutlined, ShopOutlined, SettingOutlined, } from '@ant-design/icons' import type { ProColumns } from '@ant-design/pro-components' import { ProTable } from '@ant-design/pro-components' import { industryService } from '@/services/industries' import type { IndustryListItem, IndustryFullConfig, UpdateIndustryRequest } from '@/services/industries' import { PageHeader } from '@/components/PageHeader' const { TextArea } = Input const { Text } = Typography const statusLabels: Record = { active: '启用', inactive: '禁用' } const statusColors: Record = { active: 'green', inactive: 'default' } const sourceLabels: Record = { builtin: '内置', admin: '自定义', custom: '自定义' } // === 行业列表 === function IndustryListPanel() { const queryClient = useQueryClient() const [page, setPage] = useState(1) const [pageSize, setPageSize] = useState(20) const [filters, setFilters] = useState<{ status?: string; source?: string }>({}) const [editId, setEditId] = useState(null) const [createOpen, setCreateOpen] = useState(false) const { data, isLoading } = useQuery({ queryKey: ['industries', page, pageSize, filters], queryFn: ({ signal }) => industryService.list({ page, page_size: pageSize, ...filters }, signal), }) const updateStatusMutation = useMutation({ mutationFn: ({ id, status }: { id: string; status: string }) => industryService.update(id, { status }), onSuccess: () => { message.success('状态已更新') queryClient.invalidateQueries({ queryKey: ['industries'] }) }, onError: (err: Error) => message.error(err.message || '更新失败'), }) const columns: ProColumns[] = [ { title: '图标', dataIndex: 'icon', width: 50, search: false, render: (_, r) => {r.icon}, }, { title: '行业名称', dataIndex: 'name', width: 150, }, { title: '描述', dataIndex: 'description', width: 250, search: false, ellipsis: true, }, { title: '来源', dataIndex: 'source', width: 80, valueType: 'select', valueEnum: { builtin: { text: '内置' }, admin: { text: '自定义' }, custom: { text: '自定义' }, }, render: (_, r) => {sourceLabels[r.source] || r.source}, }, { title: '关键词数', dataIndex: 'keywords_count', width: 90, search: false, render: (_, r) => {r.keywords_count}, }, { title: '状态', dataIndex: 'status', width: 80, valueType: 'select', valueEnum: { active: { text: '启用', status: 'Success' }, inactive: { text: '禁用', status: 'Default' }, }, render: (_, r) => {statusLabels[r.status] || r.status}, }, { title: '更新时间', dataIndex: 'updated_at', width: 160, valueType: 'dateTime', search: false, }, { title: '操作', width: 180, search: false, render: (_, r) => ( {r.status === 'active' ? ( updateStatusMutation.mutate({ id: r.id, status: 'inactive' })}> ) : ( updateStatusMutation.mutate({ id: r.id, status: 'active' })}> )} ), }, ] return (
columns={columns} dataSource={data?.items || []} loading={isLoading} rowKey="id" search={{ onReset: () => { setFilters({}); setPage(1) }, onSearch: (values) => { setFilters(values); setPage(1) }, }} toolBarRender={() => [ , ]} pagination={{ current: page, pageSize, total: data?.total || 0, showSizeChanger: true, onChange: (p, ps) => { setPage(p); setPageSize(ps) }, }} options={{ density: false, fullScreen: false, reload: () => queryClient.invalidateQueries({ queryKey: ['industries'] }) }} /> setEditId(null)} /> setCreateOpen(false)} />
) } // === 行业编辑弹窗 === function IndustryEditModal({ open, industryId, onClose }: { open: boolean industryId: string | null onClose: () => void }) { const queryClient = useQueryClient() const [form] = Form.useForm() const { data, isLoading } = useQuery({ queryKey: ['industry-full-config', industryId], queryFn: ({ signal }) => industryService.getFullConfig(industryId!, signal), enabled: !!industryId, }) useEffect(() => { if (data && open && data.id === industryId) { form.setFieldsValue({ name: data.name, icon: data.icon, description: data.description, keywords: data.keywords, system_prompt: data.system_prompt, cold_start_template: data.cold_start_template, pain_seed_categories: data.pain_seed_categories, }) } }, [data, open, industryId, form]) const updateMutation = useMutation({ mutationFn: (body: UpdateIndustryRequest) => industryService.update(industryId!, body), onSuccess: () => { message.success('行业配置已更新') queryClient.invalidateQueries({ queryKey: ['industries'] }) queryClient.invalidateQueries({ queryKey: ['industry-full-config'] }) onClose() }, onError: (err: Error) => message.error(err.message || '更新失败'), }) return ( 编辑行业配置 — {data?.name || ''}} open={open} onCancel={() => { onClose(); form.resetFields() }} onOk={() => form.submit()} confirmLoading={updateMutation.isPending} width={720} destroyOnClose > {isLoading ? (
) : data ? (
updateMutation.mutate(values)} >