import React, { useState, useEffect } from 'react'; import { Button, Table, Form, Input, Select, message, Card, Badge, Space, Modal, DatePicker, InputNumber, Switch, Tag, Checkbox, Divider, Progress } from 'antd'; import { DeviceTypeAPI } from './api/device_type.ts'; import { UserAPI } from './api/users.ts'; const { RangePicker } = DatePicker; const { TextArea } = Input; import dayjs from 'dayjs'; import 'dayjs/locale/zh-cn'; import { InspectionsAPI } from './api/inspections.ts'; import type { InspectionTask, InspectionTemplate, ListResponse } from './api/inspections.ts'; import { getEnumOptions } from './utils.ts'; const PriorityOptions = [ { label: '低', value: 'low' }, { label: '中', value: 'medium' }, { label: '高', value: 'high' }, { label: '紧急', value: 'urgent' } ]; const StatusOptions = [ { label: '待处理', value: 'pending' }, { label: '进行中', value: 'in_progress' }, { label: '已完成', value: 'completed' }, { label: '已失败', value: 'failed' } ]; const getStatusBadge = (status: InspectionTask['status']) => { switch (status) { case 'pending': return ; case 'in_progress': return ; case 'completed': return ; case 'failed': return ; default: return ; } }; const getPriorityTag = (priority: string) => { switch (priority) { case 'low': return ; case 'medium': return ; case 'high': return ; case 'urgent': return 紧急; default: return 未知; } }; export const InspectionsPage = () => { const [loading, setLoading] = useState(false); const [data, setData] = useState([]); const [deviceTypes, setDeviceTypes] = useState<{label: string, value: string}[]>([]); const [autoInspectionLoading, setAutoInspectionLoading] = useState(false); const [manualInspectionVisible, setManualInspectionVisible] = useState(false); const [progress, setProgress] = useState(0); const [autoForm] = Form.useForm(); const [manualForm] = Form.useForm(); const [pagination, setPagination] = useState({ current: 1, pageSize: 10, total: 0, }); const [formRef] = Form.useForm(); const [modalVisible, setModalVisible] = useState(false); const [editingId, setEditingId] = useState(null); useEffect(() => { fetchData(); fetchDeviceTypes(); }, [pagination.current, pagination.pageSize]); const fetchDeviceTypes = async () => { try { const response = await DeviceTypeAPI.getDeviceTypes({pageSize: 100}); setDeviceTypes(response.data.map((item: any) => ({ label: item.name, value: item.code }))); } catch (error) { console.error('获取设备类型失败:', error); message.error('获取设备类型失败'); } }; const fetchData = async () => { setLoading(true); try { const values = formRef.getFieldsValue(); const { title, priority, status, timeRange } = formRef.getFieldsValue(); const params: Record = { page: pagination.current, limit: pagination.pageSize, status, templateId: priority ? parseInt(priority) : undefined }; if (timeRange) { params.startTime = timeRange[0].format('YYYY-MM-DD HH:mm:ss'); params.endTime = timeRange[1].format('YYYY-MM-DD HH:mm:ss'); } const response = await InspectionsAPI.getTasks(params); setData(response.data); setPagination({ ...pagination, total: response.total, }); } catch (error) { console.error('获取巡检任务失败:', error); message.error('获取巡检任务失败'); } finally { setLoading(false); } }; const handleSearch = (values: any) => { setPagination({ ...pagination, current: 1, }); fetchData(); }; const handleTableChange = (newPagination: any) => { setPagination({ ...pagination, current: newPagination.current, pageSize: newPagination.pageSize, }); }; const handleEditAutoTask = (record: InspectionTask) => { setEditingId(record.id); formRef.setFieldsValue({ ...record, cronExpression: record.cronExpression || `0 0 */${record.intervalDays} * *` }); setModalVisible(true); }; const handleDeleteAutoTask = async (id: number) => { Modal.confirm({ title: '确认删除自动巡检任务?', content: '此操作不可撤销', onOk: async () => { try { await InspectionsAPI.deleteTemplate(id); message.success('删除成功'); fetchData(); } catch (error) { console.error('删除失败:', error); message.error('删除失败'); } }, }); }; const handleStatusChange = async (id: number, status: InspectionTask['status']) => { try { await InspectionsAPI.updateTemplate(id, { status } as Partial); message.success('状态更新成功'); fetchData(); } catch (error) { console.error('状态更新失败:', error); message.error('状态更新失败'); } }; const handleAutoInspection = async () => { try { const values = await formRef.validateFields(); const { intervalDays, deviceTypes } = values; // 自动生成任务编号 const taskNo = `INSP-${Date.now()}-${Math.floor(Math.random() * 1000)}`; const data = { taskNo, intervalDays: intervalDays || 7, // 默认7天 deviceTypes, reportReceivers: ['admin'] // 默认通知admin }; if (editingId) { // 更新模板使用模板相关参数 await InspectionsAPI.updateTemplate(editingId, { name: values.name, description: values.description }); message.success('巡检模板更新成功'); } else { // 创建任务使用任务相关参数 await InspectionsAPI.createAutoInspectionTask(data); message.success('自动巡检任务创建成功'); } setModalVisible(false); fetchData(); } catch (error) { console.error('操作失败:', error); message.error('操作失败: ' + (error as Error).message); } }; const columns = [ { title: '任务标题', dataIndex: 'title', key: 'title', }, { title: '优先级', dataIndex: 'priority', key: 'priority', render: (priority: string) => getPriorityTag(priority), }, { title: '状态', dataIndex: 'status', key: 'status', render: (status: InspectionTask['status']) => getStatusBadge(status), }, { title: '计划开始时间', dataIndex: 'startTime', key: 'startTime', render: (text?: string) => text ? dayjs(text).format('YYYY-MM-DD HH:mm') : '-', }, { title: '计划结束时间', dataIndex: 'endTime', key: 'endTime', render: (text?: string) => text ? dayjs(text).format('YYYY-MM-DD HH:mm') : '-', }, { title: '操作', key: 'action', render: (_: any, record: InspectionTask) => ( {record.schedule_type === 'scheduled' && ( <> )} setModalVisible(false)} width={800} style={{ textAlign: 'center' }} >
{/* 手动巡检弹窗 */} 手动巡检} visible={manualInspectionVisible} onOk={handleManualInspection} onCancel={() => setManualInspectionVisible(false)} width={600} centered >
{dayjs().format('YYYY-MM-DD HH:mm:ss')}