import { PageContainer } from '@ant-design/pro-layout'; import type { ProColumns, ActionType } 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 { Link } from 'umi'; import { CheckCircleOutlined, DeleteOutlined, ExportOutlined, ImportOutlined, PlusOutlined, SearchOutlined, 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 ProTable from '@jetlinks/pro-table'; import encodeQuery from '@/utils/encodeQuery'; import SearchComponent from '@/components/SearchComponent'; import SystemConst from '@/utils/const'; import Token from '@/utils/token'; 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: DeviceInstance | undefined; detail: Partial; config: any; metadataItem: MetadataItem; params: Set; // 处理无限循环Card active?: string; // 当前编辑的Card }>({ current: undefined, 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 intl = useIntl(); const columns: ProColumns[] = [ { dataIndex: 'index', valueType: 'indexBorder', width: 48, }, { title: 'ID', dataIndex: 'id', }, { title: intl.formatMessage({ id: 'pages.table.deviceName', defaultMessage: '设备名称', }), dataIndex: 'name', ellipsis: true, }, { title: intl.formatMessage({ id: 'pages.table.productName', defaultMessage: '产品名称', }), dataIndex: 'productName', ellipsis: true, }, { title: intl.formatMessage({ id: 'pages.device.instance.registrationTime', defaultMessage: '注册时间', }), dataIndex: 'registryTime', width: '200px', 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', renderText: (record) => record ? : '', filters: [ { text: intl.formatMessage({ id: 'pages.device.instance.status.notActive', defaultMessage: '未启用', }), value: 'notActive', }, { text: intl.formatMessage({ id: 'pages.device.instance.status.offLine', defaultMessage: '离线', }), value: 'offline', }, { text: intl.formatMessage({ id: 'pages.device.instance.status.onLine', defaultMessage: '在线', }), value: 'online', }, ], filterMultiple: false, }, { title: intl.formatMessage({ id: 'pages.table.description', defaultMessage: '说明', }), dataIndex: 'describe', width: '15%', ellipsis: true, }, { title: intl.formatMessage({ id: 'pages.data.option', defaultMessage: '操作', }), valueType: 'option', align: 'center', width: 200, render: (text, record) => [ { InstanceModel.current = record; }} to={`/device/instance/detail/${record.id}`} key="link" > , // { // setVisible(true) // setCurrent(record) // }}> // // // // , { if (record.state.value !== 'notActive') { await service.undeployDevice(record.id); } else { await service.deployDevice(record.id); } message.success( intl.formatMessage({ id: 'pages.data.option.success', defaultMessage: '操作成功!', }), ); actionRef.current?.reload(); }} > {record.state.value !== 'notActive' ? : } , { await service.remove(record.id); message.success( intl.formatMessage({ id: 'pages.data.option.success', defaultMessage: '操作成功!', }), ); actionRef.current?.reload(); }} > , ], }, ]; const menu = ( { setType('active'); const activeAPI = `/${ SystemConst.API_BASE }/device-instance/deploy?:X_Access_Token=${Token.get()}`; setApi(activeAPI); setOperationVisible(true); }} > {bindKeys.length > 0 && ( { service.batchDeleteDevice(bindKeys).then((resp) => { if (resp.status === 200) { message.success('操作成功'); actionRef.current?.reset?.(); } }); }} okText="确认" cancelText="取消" > )} {bindKeys.length > 0 && ( { service.batchUndeployDevice(bindKeys).then((resp) => { if (resp.status === 200) { message.success('操作成功'); actionRef.current?.reset?.(); } }); }} okText="确认" cancelText="取消" > )} ); 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(encodeQuery({ ...params, sorts: { id: 'ascend' } }))} rowKey="id" search={false} pagination={{ pageSize: 10 }} rowSelection={{ selectedRowKeys: bindKeys, onChange: (selectedRowKeys, selectedRows) => { setBindKeys(selectedRows.map((item) => item.id)); }, }} toolBarRender={() => [ , , ]} /> { 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;