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' && (
<>
>
)}
),
},
];
const handleManualInspection = async () => {
try {
const values = await manualForm.validateFields();
setProgress(0);
// 模拟巡检进度
const interval = setInterval(() => {
setProgress(prev => {
const newProgress = prev + 10;
if (newProgress >= 100) {
clearInterval(interval);
message.success('手动巡检完成');
setManualInspectionVisible(false);
// 实际调用API执行巡检
InspectionsAPI.runManualTask({
deviceTypes: values.deviceTypes
});
}
return newProgress;
});
}, 500);
} catch (error) {
console.error('手动巡检失败:', error);
message.error('手动巡检失败');
}
};
return (
}
visible={manualInspectionVisible}
onOk={handleManualInspection}
onCancel={() => setManualInspectionVisible(false)}
width={600}
centered
>
{dayjs().format('YYYY-MM-DD HH:mm:ss')}
);
};