处理媒体表格复选框选中状态问题

This commit is contained in:
wangchengming 2025-10-15 22:26:56 +08:00
parent c99bbe1982
commit 1c2a3e84c7
2 changed files with 209 additions and 20 deletions

View File

@ -116,16 +116,20 @@
<el-row :gutter="10" class="my_row"><el-col :span="8"> <el-row :gutter="10" class="my_row"><el-col :span="8">
<el-form :model="queryParams" :inline="true" class="searchInputForm"> <el-form :model="queryParams" :inline="true" class="searchInputForm">
<el-form-item label=""> <el-form-item label="">
<el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery" placeholder="请输入媒体名称/媒体编号" :prefix-icon="Search" <el-input v-model="queryParams.keyword" @keydown.enter.prevent="handleQuery"
style="width: 400px;" /> placeholder="请输入媒体名称/媒体编号" :prefix-icon="Search" style="width: 400px;" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-col> </el-col>
<el-col :span="16" style="text-align: right;"> <el-col :span="16" style="text-align: right;">
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:query']" @click="handleQuery">查询</el-button> <el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:query']"
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:reset']" @click="resetQuery">重置</el-button> @click="handleQuery">查询</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:add']" @click="handleOpenAddForm">新增</el-button> <el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:reset']"
<el-dropdown placement="bottom-start" style="margin-left: 12px;" v-hasPermi="['mediaLibrary:importQuotation']"> @click="resetQuery">重置</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:add']"
@click="handleOpenAddForm">新增</el-button>
<el-dropdown placement="bottom-start" style="margin-left: 12px;"
v-hasPermi="['mediaLibrary:importQuotation']">
<el-button type="primary" class="primaryBtn">导入报价</el-button> <el-button type="primary" class="primaryBtn">导入报价</el-button>
<template #dropdown> <template #dropdown>
<el-dropdown-menu> <el-dropdown-menu>
@ -148,7 +152,8 @@
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
<el-dropdown placement="bottom-start" style="margin: 0 12px;" v-hasPermi="['mediaLibrary:exportPPT']"> <el-dropdown placement="bottom-start" style="margin: 0 12px;"
v-hasPermi="['mediaLibrary:exportPPT']">
<el-button type="primary" class="primaryBtn"> <el-button type="primary" class="primaryBtn">
导出PPT 导出PPT
</el-button> </el-button>
@ -163,12 +168,14 @@
</el-dropdown-menu> </el-dropdown-menu>
</template> </template>
</el-dropdown> </el-dropdown>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:exportExcel']" @click="handleExportExcel">导出excel</el-button> <el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:exportExcel']"
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:mediaMap']" @click="handleGoMediaMap">媒体可视化地图</el-button> @click="handleExportExcel">导出excel</el-button>
<el-button type="primary" class="primaryBtn" v-hasPermi="['mediaLibrary:mediaMap']"
@click="handleGoMediaMap">媒体可视化地图</el-button>
</el-col> </el-col>
</el-row> </el-row>
<el-table v-loading="loading" :data="mediaList" @selection-change="handleSelectionChange" <el-table ref="tableRef" v-loading="loading" :data="mediaList" @selection-change="handleSelectionChange"
:height="unfoldFlag ? 'calc(100vh - 372px)' : 'calc(100vh - 338px)'"> :height="unfoldFlag ? 'calc(100vh - 372px)' : 'calc(100vh - 338px)'">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="媒体名称" align="left" prop="mediaName" width="320"> <el-table-column label="媒体名称" align="left" prop="mediaName" width="320">
@ -179,7 +186,7 @@
<template #reference> <template #reference>
<span class="mediaNameLabel" @click="handleOpenDetail(scope.row)">{{ <span class="mediaNameLabel" @click="handleOpenDetail(scope.row)">{{
scope.row.mediaName scope.row.mediaName
}}</span> }}</span>
</template> </template>
</el-popover> </el-popover>
@ -239,8 +246,8 @@
v-hasPermi="['mediaLibrary:historicalData']">历史数据</div> v-hasPermi="['mediaLibrary:historicalData']">历史数据</div>
<div class="popBtns" @click="handleAbolish(scope.row)" <div class="popBtns" @click="handleAbolish(scope.row)"
v-hasPermi="['mediaLibrary:abolish']">废除</div> v-hasPermi="['mediaLibrary:abolish']">废除</div>
<div class="popBtns" @click="handleLogs(scope.row)" <div class="popBtns" @click="handleLogs(scope.row)" v-hasPermi="['mediaLibrary:log']">日志
v-hasPermi="['mediaLibrary:log']">日志</div> </div>
<div class="popBtns" @click="handleDownFiles(scope.row)" <div class="popBtns" @click="handleDownFiles(scope.row)"
v-hasPermi="['mediaLibrary:download']">下载</div> v-hasPermi="['mediaLibrary:download']">下载</div>
<template #reference> <template #reference>
@ -271,7 +278,7 @@
</div> </div>
</template> </template>
<script setup name="Post"> <script setup name="Post">
import { onMounted, ref } from 'vue'; import { onMounted, nextTick, ref } from 'vue';
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
@ -377,6 +384,10 @@ const viewFileRef = ref(null)
const exportDialogRef = ref(null) const exportDialogRef = ref(null)
const exportPPTDialogRef = ref(null) const exportPPTDialogRef = ref(null)
const downRecordsRef = ref(null) const downRecordsRef = ref(null)
//
const tableRef = ref(null)
//
const isSettingSelection = ref(false)
// PPT // PPT
const getpptTemplatePageList = () => { const getpptTemplatePageList = () => {
@ -491,6 +502,11 @@ const getMediaPageList = () => {
mediaList.value = res.data.rows mediaList.value = res.data.rows
total.value = res.data.total total.value = res.data.total
loading.value = false loading.value = false
//
nextTick(() => {
setTableSelection()
})
}) })
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -520,12 +536,89 @@ const resetQuery = () => {
} }
// //
const handleSelectionChange = (selection) => { const handleSelectionChange = (selection) => {
multipleChoseArr.value = selection // multipleChoseArr
if (isSettingSelection.value) {
return
}
// ID
const currentPageIds = mediaList.value.map(item => item.id)
//
if (selection.length === 0 && currentPageIds.length > 0) {
//
const shouldHaveSelections = currentPageIds.some(id =>
multipleChoseArr.value.some(item => item.id === id)
)
// selection
if (shouldHaveSelections) {
return
}
}
//
const currentSelectedIds = selection.map(item => item.id)
multipleChoseArr.value = multipleChoseArr.value.filter(item =>
!currentPageIds.includes(item.id) || currentSelectedIds.includes(item.id)
)
//
selection.forEach(newItem => {
if (!multipleChoseArr.value.some(item => item.id === newItem.id)) {
multipleChoseArr.value.push(newItem)
}
})
}
// -
const setTableSelection = () => {
if (tableRef.value && mediaList.value.length > 0) {
// handleSelectionChange
isSettingSelection.value = true
// 使 nextTick DOM
nextTick(() => {
//
tableRef.value.clearSelection()
//
setTimeout(() => {
mediaList.value.forEach(row => {
const isSelected = multipleChoseArr.value.some(item => item.id === row.id)
if (isSelected) {
tableRef.value.toggleRowSelection(row, true)
}
})
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}, 50)
})
}
} }
// //
const handleCloseTag = (tag) => { const handleCloseTag = (tag) => {
const rowIndex = multipleChoseArr.value.findIndex(item => item.id == tag.id) const rowIndex = multipleChoseArr.value.findIndex(item => item.id == tag.id)
multipleChoseArr.value.splice(rowIndex, 1) multipleChoseArr.value.splice(rowIndex, 1)
//
if (tableRef.value) {
// handleSelectionChange
isSettingSelection.value = true
//
const row = mediaList.value.find(item => item.id === tag.id)
if (row) {
tableRef.value.toggleRowSelection(row, false)
}
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}
} }
// //
const handleOpenAddForm = () => { const handleOpenAddForm = () => {

View File

@ -107,7 +107,8 @@
</el-row> </el-row>
<el-row :gutter="10" class="my_row" style="margin-bottom: 0;"> <el-row :gutter="10" class="my_row" style="margin-bottom: 0;">
<el-col :span="12"> <el-col :span="12">
<el-table v-loading="loading" :data="outdoorMediaList" @selection-change="handleSelectionChange" <el-table ref="tableRef" v-loading="loading" :data="outdoorMediaList"
@selection-change="handleSelectionChange"
:height="unfoldFlag ? 'calc(100vh - 372px)' : 'calc(100vh - 338px)'"> :height="unfoldFlag ? 'calc(100vh - 372px)' : 'calc(100vh - 338px)'">
<el-table-column type="selection" width="55" align="center" /> <el-table-column type="selection" width="55" align="center" />
<el-table-column label="实景图片" align="left" prop="mediaFileList" width="170"> <el-table-column label="实景图片" align="left" prop="mediaFileList" width="170">
@ -152,7 +153,7 @@
</div> </div>
</template> </template>
<script setup name="Post"> <script setup name="Post">
import { onMounted, onUnmounted, ref } from 'vue'; import { onMounted, onUnmounted, nextTick, ref } from 'vue';
import { Search } from '@element-plus/icons-vue' import { Search } from '@element-plus/icons-vue'
import { sysRegionListByPid } from "@/api/system/administrativeRegion" import { sysRegionListByPid } from "@/api/system/administrativeRegion"
import { sysMediaTypeListByPid } from "@/api/system/mediaType" import { sysMediaTypeListByPid } from "@/api/system/mediaType"
@ -233,6 +234,10 @@ let minLng = Infinity; // 经度的最小值(最西边)
let minLat = Infinity; // let minLat = Infinity; //
let maxLng = -Infinity; // let maxLng = -Infinity; //
let maxLat = -Infinity; // let maxLat = -Infinity; //
//
const tableRef = ref(null)
//
const isSettingSelection = ref(false)
// //
const exportForm = ref({ const exportForm = ref({
@ -477,8 +482,13 @@ const getOutMediaPageList = () => {
outdoorMediaList.value = res.data.rows outdoorMediaList.value = res.data.rows
total.value = res.data.total total.value = res.data.total
loading.value = false loading.value = false
//
renderMassMarks(); //
nextTick(() => {
setTableSelection()
//
renderMassMarks();
})
}) })
} }
/** 搜索按钮操作 */ /** 搜索按钮操作 */
@ -509,16 +519,102 @@ const resetQuery = () => {
} }
// //
const handleSelectionChange = (selection) => { const handleSelectionChange = (selection) => {
multipleChoseArr.value = selection // multipleChoseArr
if (isSettingSelection.value) {
return
}
// ID
const currentPageIds = outdoorMediaList.value.map(item => item.id)
//
if (selection.length === 0 && currentPageIds.length > 0) {
//
const shouldHaveSelections = currentPageIds.some(id =>
multipleChoseArr.value.some(item => item.id === id)
)
// selection
if (shouldHaveSelections) {
return
}
}
//
const currentSelectedIds = selection.map(item => item.id)
multipleChoseArr.value = multipleChoseArr.value.filter(item =>
!currentPageIds.includes(item.id) || currentSelectedIds.includes(item.id)
)
//
selection.forEach(newItem => {
if (!multipleChoseArr.value.some(item => item.id === newItem.id)) {
multipleChoseArr.value.push(newItem)
}
})
}
// -
const setTableSelection = () => {
if (tableRef.value && outdoorMediaList.value.length > 0) {
// handleSelectionChange
isSettingSelection.value = true
// 使 nextTick DOM
nextTick(() => {
//
tableRef.value.clearSelection()
//
setTimeout(() => {
outdoorMediaList.value.forEach(row => {
const isSelected = multipleChoseArr.value.some(item => item.id === row.id)
if (isSelected) {
tableRef.value.toggleRowSelection(row, true)
}
})
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}, 50)
})
}
} }
// //
const handleCloseTag = (tag) => { const handleCloseTag = (tag) => {
const rowIndex = multipleChoseArr.value.findIndex(item => item.id == tag.id) const rowIndex = multipleChoseArr.value.findIndex(item => item.id == tag.id)
multipleChoseArr.value.splice(rowIndex, 1) multipleChoseArr.value.splice(rowIndex, 1)
//
if (tableRef.value) {
// handleSelectionChange
isSettingSelection.value = true
//
const row = outdoorMediaList.value.find(item => item.id === tag.id)
if (row) {
tableRef.value.toggleRowSelection(row, false)
}
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}
} }
// //
const handleClearChoseMedia = () => { const handleClearChoseMedia = () => {
multipleChoseArr.value = [] multipleChoseArr.value = []
if (tableRef.value) {
// handleSelectionChange
isSettingSelection.value = true
tableRef.value.clearSelection()
//
setTimeout(() => {
isSettingSelection.value = false
}, 100)
}
} }
// //
const handleViewMedia = (_mediaId) => { const handleViewMedia = (_mediaId) => {