import React, { useState, useEffect } from 'react'; import { useDebounce } from '../hooks/useDebounce'; import { Table, Button, Modal, Form, Input, InputNumber, Select, message, Card, Space, Popconfirm, Tag, } from 'antd'; import { PlusOutlined, EditOutlined, DeleteOutlined, SearchOutlined } from '@ant-design/icons'; import axios from 'axios'; import CloseButton from '../components/CloseButton'; import { inputStyles, selectStyles, textAreaStyles, inputNumberStyles, filterInputStyles, inputPlaceholders, inputValidationRules, } from '../styles/deviceManagementStyles'; const { Option } = Select; function CategoryManagement() { const [categories, setCategories] = useState([]); const [loading, setLoading] = useState(true); const [modalVisible, setModalVisible] = useState(false); const [editingCategory, setEditingCategory] = useState(null); const [form] = Form.useForm(); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0, showTotal: total => `共 ${total} 条记录`, }); const [keyword, setKeyword] = useState(''); const debouncedKeyword = useDebounce(keyword, 300); const [status, setStatus] = useState('all'); const fetchCategories = async (page = 1, pageSize = 10) => { try { setLoading(true); const response = await axios.get('/api/consumable-categories', { params: { page, pageSize, keyword: debouncedKeyword, status }, }); setCategories(response.data.categories); setPagination(prev => ({ ...prev, current: page, pageSize, total: response.data.total })); } catch (error) { message.error('获取分类列表失败'); console.error('获取分类列表失败:', error); } finally { setLoading(false); } }; useEffect(() => { fetchCategories(); }, [debouncedKeyword, status]); const showModal = (category = null) => { setEditingCategory(category); if (category) { form.setFieldsValue(category); } else { form.resetFields(); form.setFieldsValue({ status: 'active', sortOrder: 0 }); } setModalVisible(true); }; const handleCancel = () => { setModalVisible(false); setEditingCategory(null); }; const handleSubmit = async values => { try { if (editingCategory) { await axios.put(`/api/consumable-categories/${editingCategory.id}`, values); message.success('分类更新成功'); } else { await axios.post('/api/consumable-categories', values); message.success('分类创建成功'); } setModalVisible(false); fetchCategories(); setEditingCategory(null); } catch (error) { message.error( error.response?.data?.error || (editingCategory ? '分类更新失败' : '分类创建失败') ); console.error('提交失败:', error); } }; const handleDelete = async id => { Modal.confirm({ title: '确认删除', content: '确定要删除这个耗材分类吗?此操作不可恢复!', okText: '删除', okType: 'danger', cancelText: '取消', onOk: async () => { try { await axios.delete(`/api/consumable-categories/${id}`); message.success('删除成功'); fetchCategories(); } catch (error) { message.error(error.response?.data?.error || '删除失败'); console.error('删除失败:', error); } }, }); }; const columns = [ { title: 'ID', dataIndex: 'id', key: 'id', width: 80, }, { title: '分类名称', dataIndex: 'name', key: 'name', width: 150, }, { title: '描述', dataIndex: 'description', key: 'description', width: 200, render: value => value || '-', }, { title: '排序', dataIndex: 'sortOrder', key: 'sortOrder', width: 80, }, { title: '状态', dataIndex: 'status', key: 'status', width: 100, render: value => ( {value === 'active' ? '启用' : '停用'} ), }, { title: '创建时间', dataIndex: 'createdAt', key: 'createdAt', width: 180, render: value => (value ? new Date(value).toLocaleString('zh-CN') : '-'), }, { title: '操作', key: 'action', width: 150, render: (_, record) => ( handleDelete(record.id)}> ), }, ]; return (
} onClick={() => showModal()}> 添加分类 } > setKeyword(e.target.value)} allowClear prefix={} /> fetchCategories(pagination.current, pagination.pageSize)} scroll={{ x: 1000 }} /> } onCancel={handleCancel} footer={null} width={500} >
); } export default CategoryManagement;