import { PageContainer } from '@ant-design/pro-layout'; import type { ActionType, ProColumns } from '@jetlinks/pro-table'; import type { DeviceInstance } from '@/pages/device/Instance/typings'; import moment from 'moment'; import { Badge, Button, Dropdown, Menu, message, Popconfirm, Tooltip } from 'antd'; import { useRef, useState } from 'react'; import { useHistory } from 'umi'; import { CheckCircleOutlined, DeleteOutlined, EditOutlined, ExportOutlined, EyeOutlined, ImportOutlined, PlusOutlined, StopOutlined, SyncOutlined, } from '@ant-design/icons'; import { model } from '@formily/reactive'; import Service from '@/pages/device/Instance/service'; import type { MetadataItem } from '@/pages/device/Product/typings'; import { useIntl } from '@@/plugin-locale/localeExports'; import Save from './Save'; import Export from './Export'; import Import from './Import'; import Process from './Process'; import SearchComponent from '@/components/SearchComponent'; import { ProTableCard } from '@/components'; import SystemConst from '@/utils/const'; import Token from '@/utils/token'; import DeviceCard from '@/components/ProTableCard/CardItems/device'; import { getButtonPermission, getMenuPathByParams, MENUS_CODE } from '@/utils/menu'; export const statusMap = new Map(); statusMap.set('在线', 'success'); statusMap.set('离线', 'error'); statusMap.set('未激活', 'processing'); statusMap.set('online', 'success'); statusMap.set('offline', 'error'); statusMap.set('notActive', 'processing'); export const InstanceModel = model<{ current: Partial; detail: Partial; config: any; metadataItem: MetadataItem; params: Set; // 处理无限循环Card active?: string; // 当前编辑的Card }>({ current: {}, detail: {}, config: {}, metadataItem: {}, params: new Set(['test']), }); export const service = new Service('device-instance'); const Instance = () => { const actionRef = useRef(); const [visible, setVisible] = useState(false); const [exportVisible, setExportVisible] = useState(false); const [importVisible, setImportVisible] = useState(false); const [operationVisible, setOperationVisible] = useState(false); const [type, setType] = useState<'active' | 'sync'>('active'); const [api, setApi] = useState(''); const [current, setCurrent] = useState>({}); const [searchParams, setSearchParams] = useState({}); const [bindKeys, setBindKeys] = useState([]); const history = useHistory>(); const intl = useIntl(); const tools = (record: DeviceInstance) => [ , , , ]; const columns: ProColumns[] = [ { title: 'ID', dataIndex: 'id', width: 300, ellipsis: true, }, { title: intl.formatMessage({ id: 'pages.table.deviceName', defaultMessage: '设备名称', }), dataIndex: 'name', ellipsis: true, width: 200, }, { title: intl.formatMessage({ id: 'pages.table.productName', defaultMessage: '产品名称', }), dataIndex: 'productName', width: 200, ellipsis: true, valueType: 'select', request: async () => { const res = await service.getProductList(); if (res.status === 200) { return res.result.map((pItem: any) => ({ label: pItem.name, value: pItem.id })); } return []; }, filterMultiple: true, }, { title: intl.formatMessage({ id: 'pages.device.instance.registrationTime', defaultMessage: '注册时间', }), dataIndex: 'registryTime', width: '200px', valueType: 'dateTime', render: (text: any) => (text ? moment(text).format('YYYY-MM-DD HH:mm:ss') : '/'), sorter: true, }, { title: intl.formatMessage({ id: 'pages.searchTable.titleStatus', defaultMessage: '状态', }), dataIndex: 'state', width: '90px', valueType: 'select', renderText: (record) => record ? : '', valueEnum: { notActive: { text: intl.formatMessage({ id: 'pages.device.instance.status.notActive', defaultMessage: '未启用', }), status: 'notActive', }, offline: { text: intl.formatMessage({ id: 'pages.device.instance.status.offLine', defaultMessage: '离线', }), status: 'offline', }, online: { text: intl.formatMessage({ id: 'pages.device.instance.status.onLine', defaultMessage: '在线', }), status: 'online', }, }, filterMultiple: false, }, { title: intl.formatMessage({ id: 'pages.table.description', defaultMessage: '说明', }), dataIndex: 'describe', width: '15%', ellipsis: true, hideInSearch: true, }, { title: intl.formatMessage({ id: 'pages.data.option', defaultMessage: '操作', }), valueType: 'option', width: 200, render: (text, record) => tools(record), }, ]; const menu = ( {bindKeys.length > 0 && ( )} {bindKeys.length > 0 && ( )} ); return ( field={columns} target="device-instance" onSearch={(data) => { actionRef.current?.reset?.(); setSearchParams(data); }} // onReset={() => { // // 重置分页及搜索参数 // actionRef.current?.reset?.(); // setSearchParams({}); // }} /> columns={columns} actionRef={actionRef} params={searchParams} options={{ fullScreen: true }} request={(params) => service.query({ ...params, sorts: [ { name: 'createTime', order: 'desc', }, ], }) } rowKey="id" search={false} pagination={{ pageSize: 10 }} rowSelection={{ selectedRowKeys: bindKeys, onChange: (selectedRowKeys, selectedRows) => { setBindKeys(selectedRows.map((item) => item.id)); }, }} headerTitle={[ , , ]} cardRender={(record) => ( { InstanceModel.current = record; const url = getMenuPathByParams(MENUS_CODE['device/Instance/Detail'], record.id); history.push(url); }} > } actions={[ , , , ]} /> )} /> { setVisible(false); }} reload={() => { actionRef.current?.reload(); }} visible={visible} /> { setExportVisible(false); actionRef.current?.reload(); }} visible={exportVisible} /> { setImportVisible(false); actionRef.current?.reload(); }} visible={importVisible} /> {operationVisible && ( { setOperationVisible(false); actionRef.current?.reload(); }} /> )} ); }; export default Instance;