212 lines
5.5 KiB
Vue
212 lines
5.5 KiB
Vue
<!-- 国标级联-绑定通道 -->
|
|
<template>
|
|
<j-modal
|
|
v-model:visible="_vis"
|
|
title="绑定通道"
|
|
cancelText="取消"
|
|
okText="确定"
|
|
width="80%"
|
|
@ok="handleSave"
|
|
@cancel="_vis = false"
|
|
:confirmLoading="loading"
|
|
>
|
|
<pro-search
|
|
type="simple"
|
|
:columns="columns"
|
|
target="media"
|
|
@search="handleSearch"
|
|
/>
|
|
|
|
<JProTable
|
|
ref="listRef"
|
|
model="table"
|
|
:columns="columns"
|
|
:request="CascadeApi.queryChannelList"
|
|
:defaultParams="{
|
|
sorts: [{ name: 'name', order: 'desc' }],
|
|
terms: [
|
|
{
|
|
column: 'id',
|
|
termType: 'cascade_channel$not',
|
|
type: 'and',
|
|
value: route.query.id,
|
|
},
|
|
{
|
|
column: 'catalogType',
|
|
termType: 'eq',
|
|
type: 'and',
|
|
value: 'device',
|
|
},
|
|
],
|
|
}"
|
|
:params="params"
|
|
:rowSelection="{
|
|
selectedRowKeys: _selectedRowKeys,
|
|
onSelect: onSelectChange,
|
|
onSelectAll: onSelectAllChange,
|
|
}"
|
|
@cancelSelect="_selectedRowKeys = []"
|
|
>
|
|
<template #headerTitle>
|
|
<h3>通道列表</h3>
|
|
</template>
|
|
<template #status="slotProps">
|
|
<j-space>
|
|
<j-badge
|
|
:status="
|
|
slotProps.status.value === 'online'
|
|
? 'success'
|
|
: 'error'
|
|
"
|
|
:text="slotProps.status.text"
|
|
></j-badge>
|
|
</j-space>
|
|
</template>
|
|
</JProTable>
|
|
</j-modal>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import CascadeApi from '@/api/media/cascade';
|
|
import { message } from 'ant-design-vue';
|
|
import { PropType } from 'vue';
|
|
|
|
const route = useRoute();
|
|
|
|
type Emits = {
|
|
(e: 'update:visible', data: boolean): void;
|
|
(e: 'submit'): void;
|
|
};
|
|
const emit = defineEmits<Emits>();
|
|
|
|
const props = defineProps({
|
|
visible: { type: Boolean, default: false },
|
|
data: {
|
|
type: Object as PropType<Partial<Record<string, any>>>,
|
|
default: () => ({}),
|
|
},
|
|
});
|
|
|
|
const _vis = computed({
|
|
get: () => props.visible,
|
|
set: (val) => emit('update:visible', val),
|
|
});
|
|
|
|
watch(
|
|
() => _vis.value,
|
|
(val) => {
|
|
if (val) handleSearch({ terms: [] });
|
|
},
|
|
);
|
|
|
|
const columns = [
|
|
{
|
|
title: '设备名称',
|
|
dataIndex: 'deviceName',
|
|
key: 'deviceName',
|
|
search: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
{
|
|
title: '通道名称',
|
|
dataIndex: 'name',
|
|
key: 'name',
|
|
search: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
{
|
|
title: '安装地址',
|
|
dataIndex: 'address',
|
|
key: 'address',
|
|
search: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
{
|
|
title: '厂商',
|
|
dataIndex: 'manufacturer',
|
|
key: 'manufacturer',
|
|
search: {
|
|
type: 'string',
|
|
},
|
|
},
|
|
{
|
|
title: '状态',
|
|
dataIndex: 'status',
|
|
key: 'status',
|
|
scopedSlots: true,
|
|
search: {
|
|
type: 'select',
|
|
options: [
|
|
{ label: '已连接', value: 'online' },
|
|
{ label: '未连接', value: 'offline' },
|
|
],
|
|
handleValue: (v: any) => {
|
|
return v;
|
|
},
|
|
},
|
|
},
|
|
];
|
|
|
|
const params = ref<Record<string, any>>({});
|
|
|
|
/**
|
|
* 搜索
|
|
* @param params
|
|
*/
|
|
const handleSearch = (e: any) => {
|
|
params.value = e;
|
|
console.log('params.value: ', params.value);
|
|
};
|
|
|
|
const listRef = ref();
|
|
const _selectedRowKeys = ref<string[]>([]);
|
|
|
|
const onSelectChange = (
|
|
record: any[],
|
|
selected: boolean,
|
|
selectedRows: any[],
|
|
) => {
|
|
_selectedRowKeys.value = selected
|
|
? [...getSetRowKey(selectedRows)]
|
|
: _selectedRowKeys.value.filter((item: any) => item !== record?.id);
|
|
};
|
|
const onSelectAllChange = (
|
|
selected: boolean,
|
|
selectedRows: any[],
|
|
changeRows: any[],
|
|
) => {
|
|
const unRowsKeys = getSelectedRowsKey(changeRows);
|
|
_selectedRowKeys.value = selected
|
|
? [...getSetRowKey(selectedRows)]
|
|
: _selectedRowKeys.value
|
|
.concat(unRowsKeys)
|
|
.filter((item) => !unRowsKeys.includes(item));
|
|
};
|
|
const getSelectedRowsKey = (selectedRows: any[]) =>
|
|
selectedRows.map((item) => item?.id).filter((i) => !!i);
|
|
|
|
const getSetRowKey = (selectedRows: any[]) =>
|
|
new Set([..._selectedRowKeys.value, ...getSelectedRowsKey(selectedRows)]);
|
|
|
|
const loading = ref(false);
|
|
const handleSave = async () => {
|
|
if (!_selectedRowKeys.value.length) message.error('请勾选数据');
|
|
loading.value = true;
|
|
const resp = await CascadeApi.bindChannel(
|
|
route.query.id as string,
|
|
_selectedRowKeys.value,
|
|
);
|
|
loading.value = false;
|
|
if (resp.success) {
|
|
message.success('操作成功!');
|
|
_vis.value = false;
|
|
emit('submit');
|
|
} else {
|
|
message.error('操作失败!');
|
|
}
|
|
};
|
|
</script>
|