import { Button, Card, Col, Form, Row, Select, Space, Table, Tag, Toast } from '@douyinfe/semi-ui'; import { useEffect, useState } from 'react'; import { api } from '../api/client'; import type { OpsHealth, QualityIssueRow } from '../api/types'; import { PageHeader } from '../components/PageHeader'; const statusColor: Record = { ok: 'green', warning: 'orange', error: 'red' }; function formatLag(value?: number | null) { return value == null ? '未接入' : value.toLocaleString(); } export function Quality() { const [issues, setIssues] = useState([]); const [health, setHealth] = useState(null); const [loadingIssues, setLoadingIssues] = useState(true); const [filters, setFilters] = useState>({}); const [pagination, setPagination] = useState({ currentPage: 1, pageSize: 20, total: 0 }); const loadIssues = (values: Record = filters, page = pagination.currentPage, pageSize = pagination.pageSize) => { setLoadingIssues(true); const params = new URLSearchParams({ limit: String(pageSize), offset: String((page - 1) * pageSize) }); if (values?.keyword) params.set('keyword', values.keyword); if (values?.protocol) params.set('protocol', values.protocol); api.qualityIssues(params) .then((nextPage) => { setIssues(nextPage.items); setPagination({ currentPage: page, pageSize, total: nextPage.total }); }) .catch((error: Error) => Toast.error(error.message)) .finally(() => setLoadingIssues(false)); }; useEffect(() => { loadIssues({}, 1, pagination.pageSize); api.opsHealth() .then(setHealth) .catch((error: Error) => Toast.error(error.message)); }, []); return (
{formatLag(health?.kafkaLag)} {formatLag(health?.redisOnlineKeys)} {health?.tdengineWritable && health.mysqlWritable ? '正常' : '异常'}
{ const nextFilters = values as Record; setFilters(nextFilters); loadIssues(nextFilters, 1, pagination.pageSize); }} style={{ marginBottom: 12 }}> JT808 `${row?.protocol ?? ''}-${row?.issueType ?? ''}-${row?.lastSeen ?? ''}-${row?.detail ?? ''}`} dataSource={issues} pagination={{ currentPage: pagination.currentPage, pageSize: pagination.pageSize, total: pagination.total, showSizeChanger: true, onPageChange: (page) => loadIssues(filters, page, pagination.pageSize), onPageSizeChange: (pageSize) => loadIssues(filters, 1, pageSize) }} columns={[ { title: 'VIN', dataIndex: 'vin' }, { title: '车牌', dataIndex: 'plate' }, { title: '协议', dataIndex: 'protocol' }, { title: '问题', dataIndex: 'issueType' }, { title: '级别', render: (_: unknown, row: QualityIssueRow) => {row.severity} }, { title: '最后时间', dataIndex: 'lastSeen' }, { title: '说明', dataIndex: 'detail' } ]} />
( {row.status} ) }, { title: '说明', dataIndex: 'detail' } ]} /> ); }