import { useState, useCallback, useEffect } from 'react'; import { Button, Form, Input, InputNumber, message, Modal, Popconfirm, Result, Select, Space, Switch, Table, Tag, } from 'antd'; import type { ColumnsType } from 'antd/es/table'; import { criticalValueThresholdApi, type CriticalValueThreshold, type CreateThresholdReq, type UpdateThresholdReq, INDICATOR_OPTIONS, DIRECTION_OPTIONS, LEVEL_OPTIONS, LEVEL_COLOR, INDICATOR_LABEL, DIRECTION_LABEL, LEVEL_LABEL, } from '../../api/health/criticalValueThresholds'; import { PageContainer } from '../../components/PageContainer'; import { usePermission } from '../../hooks/usePermission'; export default function CriticalValueThresholdList() { const { hasPermission } = usePermission('health.critical-value-thresholds.list'); const [data, setData] = useState([]); const [loading, setLoading] = useState(false); const [loaded, setLoaded] = useState(false); const [modalOpen, setModalOpen] = useState(false); const [editRecord, setEditRecord] = useState(null); const [submitting, setSubmitting] = useState(false); const [form] = Form.useForm(); const fetchData = useCallback(async () => { setLoading(true); try { const list = await criticalValueThresholdApi.list(); setData(list); setLoaded(true); } catch { message.error('加载危急值阈值失败'); } finally { setLoading(false); } }, []); useEffect(() => { fetchData(); }, [fetchData]); const handleCreate = () => { setEditRecord(null); form.resetFields(); form.setFieldsValue({ level: 'critical' }); setModalOpen(true); }; const handleEdit = (record: CriticalValueThreshold) => { setEditRecord(record); form.setFieldsValue({ indicator: record.indicator, direction: record.direction, threshold_value: record.threshold_value, level: record.level, department: record.department, age_min: record.age_min, age_max: record.age_max, }); setModalOpen(true); }; const handleSubmit = async () => { try { const values = await form.validateFields(); setSubmitting(true); if (editRecord) { const req: UpdateThresholdReq = { threshold_value: values.threshold_value, level: values.level, department: values.department, age_min: values.age_min, age_max: values.age_max, version: editRecord.version, }; await criticalValueThresholdApi.update(editRecord.id, req); message.success('阈值已更新'); } else { const req: CreateThresholdReq = values; await criticalValueThresholdApi.create(req); message.success('阈值已创建'); } setModalOpen(false); fetchData(); } catch { // validation } finally { setSubmitting(false); } }; const handleDelete = async (record: CriticalValueThreshold) => { try { await criticalValueThresholdApi.delete(record.id); message.success('阈值已删除'); fetchData(); } catch { message.error('删除失败'); } }; const columns: ColumnsType = [ { title: '指标', dataIndex: 'indicator', width: 120, render: (v: string) => INDICATOR_LABEL[v] ?? v, }, { title: '方向', dataIndex: 'direction', width: 80, render: (v: string) => DIRECTION_LABEL[v] ?? v, }, { title: '阈值', dataIndex: 'threshold_value', width: 100, render: (v: number) => v, }, { title: '级别', dataIndex: 'level', width: 80, render: (v: string) => ( {LEVEL_LABEL[v] ?? v} ), }, { title: '科室', dataIndex: 'department', width: 100, render: (v: string) => v ?? '通用', }, { title: '年龄范围', width: 120, render: (_, record) => { if (record.age_min == null && record.age_max == null) return '不限'; return `${record.age_min ?? 0} - ${record.age_max ?? '∞'}`; }, }, { title: '状态', dataIndex: 'is_active', width: 80, render: (v: boolean) => {v ? '启用' : '停用'}, }, { title: '操作', width: 140, render: (_, record) => ( handleDelete(record)}> ), }, ]; if (!hasPermission) { return ; } return ( 添加阈值} > {loaded && ( rowKey="id" columns={columns} dataSource={data} loading={loading} pagination={false} /> )} setModalOpen(false)} confirmLoading={submitting} width={520} >
{!editRecord && ( <> )}
); }