210 lines
5.2 KiB
Vue
210 lines
5.2 KiB
Vue
<template>
|
|
<j-modal
|
|
visible
|
|
title="下发设备"
|
|
:width="1000"
|
|
@ok="onSave"
|
|
@cancel="onCancel"
|
|
>
|
|
<div class="resource-issue-alert">
|
|
<AIcon
|
|
type="InfoCircleOutlined"
|
|
style="margin-right: 10px"
|
|
/>离线设备无法进行设备模板下发
|
|
</div>
|
|
<pro-search
|
|
:columns="columns"
|
|
target="edge-resource-issue"
|
|
@search="handleSearch"
|
|
type="simple"
|
|
class="resource-issue-search"
|
|
/>
|
|
<JProTable
|
|
ref="edgeResourceIssueRef"
|
|
:columns="columns"
|
|
:request="queryDeviceList"
|
|
:defaultParams="defaultParams"
|
|
:params="params"
|
|
model="TABLE"
|
|
:bodyStyle="{ padding: 0 }"
|
|
:rowSelection="{
|
|
selectedRowKeys: _selectedRowKeys,
|
|
onChange: onSelectChange,
|
|
}"
|
|
:pagination="{
|
|
showSizeChanger: true,
|
|
pageSizeOptions: ['10', '20', '50', '100'],
|
|
}"
|
|
>
|
|
<template #state="slotProps">
|
|
<j-badge
|
|
:text="slotProps.state?.text"
|
|
:status="statusMap.get(slotProps.state?.value)"
|
|
/>
|
|
</template>
|
|
<template #sourceId="slotProps">
|
|
{{ slotProps.sourceName }}
|
|
</template>
|
|
<template #registerTime="slotProps">
|
|
<span>{{
|
|
slotProps?.registerTime ? dayjs(slotProps.registerTime).format('YYYY-MM-DD HH:mm:ss') : ''
|
|
}}</span>
|
|
</template>
|
|
</JProTable>
|
|
<Result
|
|
v-if="visible"
|
|
:data="props.data"
|
|
:list="_data"
|
|
@close="onCancel"
|
|
/>
|
|
</j-modal>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { onlyMessage } from '@/utils/comm';
|
|
import { queryDeviceList } from '@/api/edge/resource';
|
|
import dayjs from 'dayjs';
|
|
import Result from './Result.vue';
|
|
import { queryNoPagingPost } from '@/api/device/product';
|
|
|
|
const defaultParams = {
|
|
pageSize: 10,
|
|
sorts: [{ name: 'registerTime', order: 'desc' }],
|
|
terms: [
|
|
{
|
|
terms: [
|
|
{
|
|
termType: 'eq',
|
|
column: 'productId$product-info',
|
|
value: 'accessProvider is official-edge-gateway',
|
|
},
|
|
],
|
|
type: 'and',
|
|
},
|
|
],
|
|
};
|
|
|
|
const props = defineProps({
|
|
data: {
|
|
type: Object,
|
|
default: () => {},
|
|
},
|
|
});
|
|
const emit = defineEmits(['close']);
|
|
|
|
const params = ref({});
|
|
const edgeResourceIssueRef = ref();
|
|
const _selectedRowKeys = ref<string[]>([]);
|
|
const _data = ref<any[]>([]);
|
|
const visible = ref<boolean>(false);
|
|
|
|
const statusMap = new Map();
|
|
statusMap.set('online', 'success');
|
|
statusMap.set('offline', 'error');
|
|
statusMap.set('notActive', 'warning');
|
|
|
|
const columns = [
|
|
{
|
|
title: 'ID',
|
|
dataIndex: 'id',
|
|
key: 'id',
|
|
ellipsis: true,
|
|
width: 200,
|
|
fixed: 'left',
|
|
search: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
{
|
|
title: '产品名称',
|
|
dataIndex: 'productName',
|
|
key: 'productName',
|
|
ellipsis: true,
|
|
search: {
|
|
type: 'select',
|
|
rename: 'productId',
|
|
first: true,
|
|
options: () =>
|
|
new Promise((resolve) => {
|
|
queryNoPagingPost({ paging: false }).then((resp: any) => {
|
|
resolve(
|
|
resp.result.map((item: any) => ({
|
|
label: item.name,
|
|
value: item.id,
|
|
})),
|
|
);
|
|
});
|
|
}),
|
|
},
|
|
},
|
|
{
|
|
title: '设备名称',
|
|
ellipsis: true,
|
|
dataIndex: 'name',
|
|
key: 'name',
|
|
search: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
{
|
|
title: '注册时间',
|
|
dataIndex: 'registerTime',
|
|
key: 'registerTime',
|
|
width: 200,
|
|
scopedSlots: true,
|
|
search: {
|
|
type: 'date',
|
|
rename: 'registryTime'
|
|
},
|
|
},
|
|
{
|
|
title: '状态',
|
|
dataIndex: 'state',
|
|
key: 'state',
|
|
scopedSlots: true,
|
|
search: {
|
|
type: 'select',
|
|
options: [
|
|
{ label: '禁用', value: 'notActive' },
|
|
{ label: '离线', value: 'offline' },
|
|
{ label: '在线', value: 'online' },
|
|
],
|
|
},
|
|
},
|
|
];
|
|
|
|
const onSelectChange = (keys: string[], _options: any[]) => {
|
|
_selectedRowKeys.value = [...keys];
|
|
_data.value = _options;
|
|
};
|
|
|
|
const handleSearch = (v: any) => {
|
|
params.value = v;
|
|
};
|
|
|
|
const onSave = () => {
|
|
if (_data.value.length) {
|
|
visible.value = true;
|
|
} else {
|
|
onlyMessage('请选择设备', 'error');
|
|
}
|
|
};
|
|
|
|
const onCancel = () => {
|
|
emit('close');
|
|
};
|
|
</script>
|
|
|
|
<style lang="less">
|
|
.resource-issue-search {
|
|
padding: 18px 0 0 0;
|
|
margin: 0px;
|
|
}
|
|
.resource-issue-alert {
|
|
height: 40px;
|
|
padding-left: 10px;
|
|
color: rgba(0, 0, 0, 0.55);
|
|
line-height: 40px;
|
|
background-color: #f6f6f6;
|
|
}
|
|
</style> |