277 lines
7.0 KiB
Vue
277 lines
7.0 KiB
Vue
|
<script setup lang="ts">
|
||
|
import { Page, useVbenModal, type VbenFormProps } from '@vben/common-ui';
|
||
|
import { getVxePopupContainer } from '@vben/utils';
|
||
|
|
||
|
import { Modal, Popconfirm, Space, Tag } from 'ant-design-vue';
|
||
|
import { ref, watch } from 'vue';
|
||
|
|
||
|
import {
|
||
|
useVbenVxeGrid,
|
||
|
vxeCheckboxChecked,
|
||
|
type VxeGridProps,
|
||
|
} from '#/adapter/vxe-table';
|
||
|
|
||
|
import { commonDownloadExcel } from '#/utils/file/download';
|
||
|
import { renderDict } from '#/utils/render';
|
||
|
|
||
|
import { columns, querySchema } from './data';
|
||
|
import warningModal from './warning-modal.vue';
|
||
|
import warningDetail from './warning-detail.vue';
|
||
|
import LevelSettingModal from './level-setting-modal.vue';
|
||
|
import imgPng from '../../../../assets/algorithmManagement/image.png';
|
||
|
|
||
|
// 假数据
|
||
|
const mockData = ref([
|
||
|
{
|
||
|
id: 1,
|
||
|
alarmId: 'JWD-3434234',
|
||
|
alarmTime: '2025.07.21 12:20',
|
||
|
level: '特大',
|
||
|
alarmType: '越界侦测',
|
||
|
description: '温度高于80度发生火宅',
|
||
|
location: '1栋3号电梯旁',
|
||
|
processingStatus: '待分配',
|
||
|
processingDetails: '',
|
||
|
processingTime: '',
|
||
|
},
|
||
|
{
|
||
|
id: 2,
|
||
|
alarmId: 'JWD-3434235',
|
||
|
alarmTime: '2025.07.21 11:15',
|
||
|
level: '重要',
|
||
|
alarmType: '异常行为',
|
||
|
description: '人员异常聚集',
|
||
|
location: '2栋大厅',
|
||
|
processingStatus: '待分配',
|
||
|
processingDetails: '已派人员前往处理',
|
||
|
processingTime: '2025.07.21 11:30',
|
||
|
},
|
||
|
{
|
||
|
id: 3,
|
||
|
alarmId: 'JWD-3434236',
|
||
|
alarmTime: '2025.07.21 10:45',
|
||
|
level: '一般',
|
||
|
alarmType: '设备故障',
|
||
|
description: '摄像头离线',
|
||
|
location: '3栋走廊',
|
||
|
processingStatus: '待分配',
|
||
|
processingDetails: '已修复设备',
|
||
|
processingTime: '2025.07.21 11:00',
|
||
|
},
|
||
|
{
|
||
|
id: 4,
|
||
|
alarmId: 'JWD-3434236',
|
||
|
alarmTime: '2025.07.21 10:45',
|
||
|
level: '一般',
|
||
|
alarmType: '设备故障',
|
||
|
description: '摄像头离线',
|
||
|
location: '3栋走廊',
|
||
|
processingStatus: '待分配',
|
||
|
processingDetails: '等待接受',
|
||
|
processingTime: '2025.07.21 11:00',
|
||
|
},
|
||
|
]);
|
||
|
|
||
|
const formOptions: VbenFormProps = {
|
||
|
commonConfig: {
|
||
|
labelWidth: 100,
|
||
|
componentProps: {
|
||
|
allowClear: true,
|
||
|
},
|
||
|
},
|
||
|
schema: querySchema(),
|
||
|
wrapperClass: 'grid-cols-1 md:grid-cols-2 lg:grid-cols-3',
|
||
|
};
|
||
|
|
||
|
const gridOptions: VxeGridProps = {
|
||
|
columns,
|
||
|
height: 'auto',
|
||
|
data: mockData.value,
|
||
|
pagerConfig: {
|
||
|
currentPage: 1,
|
||
|
pageSize: 10,
|
||
|
total: mockData.value.length,
|
||
|
},
|
||
|
rowConfig: {
|
||
|
keyField: 'id',
|
||
|
},
|
||
|
id: 'video-warning-processing-index',
|
||
|
};
|
||
|
|
||
|
const [BasicTable, tableApi] = useVbenVxeGrid({
|
||
|
formOptions,
|
||
|
gridOptions,
|
||
|
});
|
||
|
|
||
|
// 监听数据变化,强制重新渲染表格
|
||
|
const tableKey = ref(0);
|
||
|
watch(
|
||
|
mockData,
|
||
|
() => {
|
||
|
tableKey.value++;
|
||
|
},
|
||
|
{ deep: true },
|
||
|
);
|
||
|
|
||
|
const [WarningModal, modalApi] = useVbenModal({
|
||
|
connectedComponent: warningModal,
|
||
|
});
|
||
|
|
||
|
const [WarningDetail, detailApi] = useVbenModal({
|
||
|
connectedComponent: warningDetail,
|
||
|
});
|
||
|
|
||
|
const [LevelSettingModalComp, levelModalApi] = useVbenModal({
|
||
|
connectedComponent: LevelSettingModal,
|
||
|
});
|
||
|
|
||
|
// 级别设置
|
||
|
function handleLevelSetting(row: any) {
|
||
|
levelModalApi.setData({ id: row.id, level: row.level, data: mockData.value });
|
||
|
levelModalApi.open();
|
||
|
}
|
||
|
|
||
|
// 查看详情
|
||
|
async function handleView(row: any) {
|
||
|
detailApi.setData({ id: row.id, data: mockData.value });
|
||
|
detailApi.open();
|
||
|
}
|
||
|
|
||
|
// 编辑
|
||
|
async function handleEdit(row: any) {
|
||
|
modalApi.setData({ id: row.id, data: mockData.value });
|
||
|
modalApi.open();
|
||
|
}
|
||
|
|
||
|
// 分配处理
|
||
|
function handleAssign(row: any) {
|
||
|
Modal.confirm({
|
||
|
title: '分配处理',
|
||
|
content: `确定要分配预警 ${row.alarmId} 给处理人员吗?`,
|
||
|
onOk() {
|
||
|
// 模拟分配处理
|
||
|
const index = mockData.value.findIndex((item: any) => item.id === row.id);
|
||
|
if (index !== -1) {
|
||
|
// mockData.value[index].processingStatus = '处理中';
|
||
|
// mockData.value[index].processingDetails = '已分配给处理人员';
|
||
|
// mockData.value[index].processingTime = new Date().toLocaleString();
|
||
|
tableApi.query();
|
||
|
}
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
|
||
|
// 删除
|
||
|
async function handleDelete(row: any) {
|
||
|
const index = mockData.value.findIndex((item: any) => item.id === row.id);
|
||
|
if (index !== -1) {
|
||
|
mockData.value.splice(index, 1);
|
||
|
await tableApi.query();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// 批量删除
|
||
|
function handleMultiDelete() {
|
||
|
const rows = tableApi.grid.getCheckboxRecords();
|
||
|
const ids = rows.map((row: any) => row.id);
|
||
|
Modal.confirm({
|
||
|
title: '提示',
|
||
|
okType: 'danger',
|
||
|
content: `确认删除选中的${ids.length}条记录吗?`,
|
||
|
onOk: async () => {
|
||
|
ids.forEach((id) => {
|
||
|
const index = mockData.value.findIndex((item: any) => item.id === id);
|
||
|
if (index !== -1) {
|
||
|
mockData.value.splice(index, 1);
|
||
|
}
|
||
|
});
|
||
|
await tableApi.query();
|
||
|
},
|
||
|
});
|
||
|
}
|
||
|
</script>
|
||
|
<template>
|
||
|
<Page :auto-content-height="true">
|
||
|
<BasicTable
|
||
|
:key="tableKey"
|
||
|
class="flex-1 overflow-hidden"
|
||
|
table-title="视频预警处理"
|
||
|
>
|
||
|
<template #toolbar-tools>
|
||
|
<Space>
|
||
|
<a-button
|
||
|
:disabled="!vxeCheckboxChecked(tableApi)"
|
||
|
danger
|
||
|
type="primary"
|
||
|
v-access:code="['video:warning:remove']"
|
||
|
@click="handleMultiDelete"
|
||
|
>
|
||
|
{{ $t('pages.common.delete') }}
|
||
|
</a-button>
|
||
|
</Space>
|
||
|
</template>
|
||
|
<template #action="{ row }">
|
||
|
<Space>
|
||
|
<!-- <ghost-button
|
||
|
v-access:code="['video:warning:level']"
|
||
|
@click.stop="handleLevelSetting(row)"
|
||
|
>
|
||
|
级别设置
|
||
|
</ghost-button> -->
|
||
|
<ghost-button
|
||
|
v-access:code="['video:warning:view']"
|
||
|
@click.stop="handleView(row)"
|
||
|
>
|
||
|
{{ $t('pages.common.info') }}
|
||
|
</ghost-button>
|
||
|
<ghost-button
|
||
|
v-access:code="['video:warning:edit']"
|
||
|
@click.stop="handleEdit(row)"
|
||
|
>
|
||
|
{{ $t('pages.common.edit') }}
|
||
|
</ghost-button>
|
||
|
<ghost-button
|
||
|
v-access:code="['video:warning:assign']"
|
||
|
@click.stop="handleAssign(row)"
|
||
|
:disabled="row.processingStatus === '已完成'"
|
||
|
>
|
||
|
分配处理
|
||
|
</ghost-button>
|
||
|
<Popconfirm
|
||
|
:get-popup-container="getVxePopupContainer"
|
||
|
placement="left"
|
||
|
title="确认删除?"
|
||
|
@confirm="handleDelete(row)"
|
||
|
>
|
||
|
<ghost-button
|
||
|
danger
|
||
|
v-access:code="['video:warning:remove']"
|
||
|
@click.stop=""
|
||
|
>
|
||
|
{{ $t('pages.common.delete') }}
|
||
|
</ghost-button>
|
||
|
</Popconfirm>
|
||
|
</Space>
|
||
|
</template>
|
||
|
</BasicTable>
|
||
|
<WarningModal @reload="tableApi.query()" />
|
||
|
<WarningDetail />
|
||
|
<LevelSettingModalComp @reload="tableKey++" />
|
||
|
</Page>
|
||
|
</template>
|
||
|
<style scoped lang="scss">
|
||
|
.ant-table-wrapper {
|
||
|
.ant-table-thead > tr > th {
|
||
|
background-color: #fafafa;
|
||
|
font-weight: 600;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
.ant-pagination {
|
||
|
.ant-pagination-item-active {
|
||
|
background-color: #1890ff;
|
||
|
border-color: #1890ff;
|
||
|
}
|
||
|
}
|
||
|
</style>
|