You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
228 lines
6.5 KiB
228 lines
6.5 KiB
<script lang="ts" setup>
|
|
import { computed, reactive, ref, watch } from 'vue'
|
|
import { message } from 'ant-design-vue'
|
|
import { columns, searchFormSchema } from '../exa.data'
|
|
import type { TableActionType } from '@/components/Table'
|
|
import { BasicTable, TableAction, useTable } from '@/components/Table'
|
|
import { getEXAPage } from '@/api/alert/exa'
|
|
import { useI18n } from '@/hooks/web/useI18n'
|
|
import { IconEnum } from '@/enums/appEnum'
|
|
import { BasicModal, useModalInner } from '@/components/Modal'
|
|
|
|
const props = defineProps({
|
|
source: { type: String, default: '' },
|
|
rowSelectType: { type: String, default: 'checkbox' },
|
|
selectedData: { type: Array<Recordable>, default: [] },
|
|
selectedRowKeys: { type: Array<number>, default: [] },
|
|
})
|
|
const emit = defineEmits(['success', 'register'])
|
|
const [registerPointModal, { setModalProps, closeModal }] = useModalInner(async (data) => {
|
|
setModalProps({ confirmLoading: false })
|
|
})
|
|
const { t } = useI18n()
|
|
|
|
const selectedData = ref<Recordable[]>(props.selectedData)
|
|
|
|
interface RowKeys {
|
|
selectedRowKeys: number[]
|
|
}
|
|
const state = reactive<RowKeys>({
|
|
selectedRowKeys: props.selectedRowKeys,
|
|
|
|
})
|
|
|
|
const tableRef = ref<Nullable<TableActionType>>(null)
|
|
const tableRef1 = ref<Nullable<TableActionType>>(null)
|
|
|
|
const [registerTable] = useTable({
|
|
title: '测点列表',
|
|
api: getEXAPage,
|
|
immediate: false,
|
|
showTableSetting: false,
|
|
tableSetting: {
|
|
// 是否显示刷新按钮
|
|
redo: false,
|
|
// 是否显示尺寸调整按钮
|
|
size: false,
|
|
// 是否显示字段调整按钮
|
|
setting: false,
|
|
// 是否显示全屏按
|
|
fullScreen: false,
|
|
},
|
|
columns,
|
|
formConfig: {
|
|
labelWidth: 150,
|
|
schemas: searchFormSchema,
|
|
showResetButton: false,
|
|
actionColOptions: {
|
|
span: 3,
|
|
},
|
|
},
|
|
rowKey: 'serialNumber',
|
|
useSearchForm: true,
|
|
showIndexColumn: false,
|
|
|
|
})
|
|
|
|
// 这个必须写在computed计算属性里,心酸啊,弄一下午!
|
|
const rowSelection = computed(() => {
|
|
return {
|
|
preserveSelectedRowKeys: true, // 2.加这一行
|
|
type: props.rowSelectType,
|
|
selectedRowKeys: state.selectedRowKeys,
|
|
onChange: onSelectChange,
|
|
|
|
}
|
|
})
|
|
|
|
// defaultChecked: record.serialNumber === 93,
|
|
watch(
|
|
() => props.selectedRowKeys,
|
|
() => {
|
|
state.selectedRowKeys = props.selectedRowKeys
|
|
selectedData.value = props.selectedData
|
|
},
|
|
)
|
|
const [registerSelectedTable] = useTable({
|
|
title: '已选中测点列表',
|
|
showTableSetting: false,
|
|
tableSetting: {
|
|
// 是否显示刷新按钮
|
|
redo: false,
|
|
// 是否显示尺寸调整按钮
|
|
size: false,
|
|
// 是否显示字段调整按钮
|
|
setting: false,
|
|
// 是否显示全屏按
|
|
fullScreen: false,
|
|
},
|
|
columns,
|
|
formConfig: {
|
|
labelWidth: 150,
|
|
schemas: searchFormSchema,
|
|
showResetButton: false,
|
|
actionColOptions: {
|
|
span: 2,
|
|
},
|
|
},
|
|
rowKey: 'serialNumber',
|
|
useSearchForm: false,
|
|
showIndexColumn: false,
|
|
actionColumn: {
|
|
width: 80,
|
|
title: t('common.action'),
|
|
dataIndex: 'action',
|
|
fixed: 'right',
|
|
},
|
|
})
|
|
|
|
function onSelectChange(selectedRowKeys, selectedRows) {
|
|
console.log(selectedRowKeys, selectedRows)
|
|
state.selectedRowKeys = selectedRowKeys
|
|
let selectionRows: any[] = []
|
|
console.log('3', selectedData.value)
|
|
|
|
selectionRows = selectedData.value.concat(selectedRows)
|
|
console.log('2', selectionRows)
|
|
|
|
selectionRows = selectionRows.filter(item => selectedRowKeys.includes(item.serialNumber))
|
|
console.log('1', selectionRows)
|
|
// 数组对象去重
|
|
const map = new Map()
|
|
for (const item of selectionRows) {
|
|
if (!map.has(item.serialNumber))
|
|
map.set(item.serialNumber, item)
|
|
};
|
|
selectedData.value = [...map.values()]
|
|
}
|
|
|
|
function handleOk() {
|
|
console.log(props.source)
|
|
if (props.source === 'run') {
|
|
console.log('来自运行中心-模型实例-更换测点')
|
|
|
|
if (selectedData.value.length !== 0) {
|
|
emit('success', selectedData.value)
|
|
closeModal()
|
|
}
|
|
else { message.error('请选择替换的测点,若不进行替换,请点击取消返回') }
|
|
}
|
|
else {
|
|
console.log('onOk:')
|
|
localStorage.setItem('pointInfo', JSON.stringify(state.selectedRowKeys))
|
|
localStorage.setItem('pointInfoList', JSON.stringify(selectedData.value))
|
|
closeModal()
|
|
emit('success')
|
|
}
|
|
}
|
|
async function handleDelete(record: Recordable) {
|
|
const newArr = state.selectedRowKeys.filter((value) => {
|
|
return value !== record.serialNumber
|
|
})
|
|
state.selectedRowKeys = newArr
|
|
localStorage.setItem('pointInfo', JSON.stringify(state.selectedRowKeys))
|
|
|
|
const newArrObj = selectedData.value.filter((value) => {
|
|
return value.serialNumber !== record.serialNumber
|
|
})
|
|
selectedData.value = newArrObj
|
|
}
|
|
function handleClearAndClose() {
|
|
state.selectedRowKeys = []
|
|
selectedData.value = []
|
|
localStorage.setItem('pointInfo', JSON.stringify(state.selectedRowKeys))
|
|
localStorage.setItem('pointInfoList', JSON.stringify(selectedData.value))
|
|
closeModal()
|
|
emit('success')
|
|
}
|
|
|
|
function onCanel() {
|
|
state.selectedRowKeys = []
|
|
selectedData.value = []
|
|
}
|
|
</script>
|
|
|
|
<template>
|
|
<BasicModal v-bind="$attrs" :min-height="500" title="测点配置" width="850px" @cancel="onCanel" @register="registerPointModal" @ok="handleOk">
|
|
<BasicTable
|
|
ref="tableRef" title="所有测点" :can-resize="false"
|
|
:row-selection="rowSelection" size="small" @register="registerTable"
|
|
/>
|
|
<BasicTable
|
|
ref="tableRef1"
|
|
:pagination="false" size="small" :data-source="selectedData" :can-resize="false"
|
|
title="已选中测点" @register="registerSelectedTable"
|
|
>
|
|
<template #bodyCell="{ column, record }">
|
|
<template v-if="column.key === 'action'">
|
|
<TableAction
|
|
:actions="[{
|
|
icon: IconEnum.DELETE,
|
|
danger: true,
|
|
label: t('action.delete'),
|
|
auth: 'system:role:delete',
|
|
popConfirm: {
|
|
title: t('common.delMessage'),
|
|
placement: 'left',
|
|
confirm: handleDelete.bind(null, record),
|
|
},
|
|
},
|
|
]"
|
|
/>
|
|
</template>
|
|
</template>
|
|
<template v-if="props.source !== 'run'" #toolbar>
|
|
<a-button v-auth="['system:role:create']" type="primary" :pre-icon="IconEnum.DELETE" @click="handleClearAndClose">
|
|
{{ t('action.clearAllandClose') }}
|
|
</a-button>
|
|
<!-- <a-button v-auth="['system:role:create']" :pre-icon="IconEnum.EXPORT" @click="handleExport">
|
|
{{ t('action.export') }}
|
|
</a-button> -->
|
|
</template>
|
|
</BasicTable>
|
|
</BasicModal>
|
|
</template>
|
|
|
|
<style>
|
|
|
|
</style>
|
|
|