import React, { useState, useEffect, useCallback } from 'react';
import {
Table,
Card,
Space,
Select,
DatePicker,
Input,
Tag,
Button,
message,
Modal,
Row,
Col,
Descriptions,
Typography,
Drawer,
Statistic,
} from 'antd';
import {
HistoryOutlined,
SearchOutlined,
EyeOutlined,
FilterOutlined,
ClearOutlined,
} from '@ant-design/icons';
import api from '../api';
import CloseButton from '../components/CloseButton';
import dayjs from 'dayjs';
import {
selectStyles,
filterInputStyles,
inputPlaceholders,
} from '../styles/deviceManagementStyles';
const { RangePicker } = DatePicker;
const { Option } = Select;
const { Text } = Typography;
const MODULE_OPTIONS = [
{ value: 'device', label: '设备管理' },
{ value: 'user', label: '用户管理' },
{ value: 'role', label: '角色管理' },
];
const OPERATION_TYPE_OPTIONS = [
{ value: 'create', label: '创建' },
{ value: 'update', label: '更新' },
{ value: 'delete', label: '删除' },
{ value: 'batch_delete', label: '批量删除' },
{ value: 'status_change', label: '状态变更' },
{ value: 'move', label: '移动' },
{ value: 'permission_change', label: '权限变更' },
];
const RESULT_OPTIONS = [
{ value: 'success', label: '成功' },
{ value: 'failed', label: '失败' },
];
function OperationLogs() {
const [logs, setLogs] = useState([]);
const [loading, setLoading] = useState(true);
const [pagination, setPagination] = useState({ current: 1, pageSize: 20, total: 0 });
const [filters, setFilters] = useState({
module: null,
operationType: null,
keyword: '',
dateRange: null,
result: null,
});
const [detailVisible, setDetailVisible] = useState(false);
const [currentLog, setCurrentLog] = useState(null);
const [detailLoading, setDetailLoading] = useState(false);
const fetchLogs = useCallback(async (page = 1, pageSize = 20, currentFilters = filters) => {
try {
setLoading(true);
const params = { page, pageSize };
if (currentFilters.module) {
params.module = currentFilters.module;
}
if (currentFilters.operationType) {
params.operationType = currentFilters.operationType;
}
if (currentFilters.keyword) {
params.keyword = currentFilters.keyword;
}
if (currentFilters.result) {
params.result = currentFilters.result;
}
if (currentFilters.dateRange && currentFilters.dateRange.length === 2) {
params.startDate = currentFilters.dateRange[0].format('YYYY-MM-DD');
params.endDate = currentFilters.dateRange[1].format('YYYY-MM-DD');
}
const response = await api.get('/operation-logs', { params });
if (response.success) {
setLogs(response.data.logs);
setPagination(prev => ({
...prev,
current: page,
pageSize,
total: response.data.total,
}));
}
} catch (error) {
message.error('获取操作日志失败');
console.error('获取操作日志失败:', error);
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
fetchLogs(1, pagination.pageSize, filters);
}, []);
const handleTableChange = (newPagination, tableFilters) => {
fetchLogs(newPagination.current, newPagination.pageSize, filters);
};
const handleFilterChange = (key, value) => {
const newFilters = { ...filters, [key]: value };
setFilters(newFilters);
fetchLogs(1, pagination.pageSize, newFilters);
};
const handleClearFilters = () => {
const clearedFilters = {
module: null,
operationType: null,
keyword: '',
dateRange: null,
result: null,
};
setFilters(clearedFilters);
fetchLogs(1, pagination.pageSize, clearedFilters);
};
const handleViewDetail = async record => {
setDetailLoading(true);
setDetailVisible(true);
try {
const response = await api.get(`/operation-logs/${record.recordId}`);
if (response.success) {
setCurrentLog(response.data);
}
} catch (error) {
message.error('获取日志详情失败');
console.error('获取日志详情失败:', error);
} finally {
setDetailLoading(false);
}
};
const getModuleTag = module => {
const colors = {
device: 'blue',
user: 'green',
role: 'purple',
consumable: 'orange',
rack: 'cyan',
room: 'magenta',
ticket: 'red',
backup: 'gold',
};
const names = {
device: '设备',
user: '用户',
role: '角色',
consumable: '耗材',
rack: '机柜',
room: '机房',
ticket: '工单',
backup: '备份',
};
return