From 63079829ac881aee5d746db218ea99e14a65ec11 Mon Sep 17 00:00:00 2001 From: fengyuan_yang <1976974459@qq.com> Date: Wed, 19 Nov 2025 15:45:30 +0800 Subject: [PATCH] =?UTF-8?q?2025-11-19=20ECN=E4=B8=ADDelegate=20Access=20?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=97=B6=E9=A1=B5=E9=9D=A2=E5=8D=A1=E4=BD=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/utils/httpRequest.js | 15 +++++- .../modules/changeManagement/changeRecord.vue | 38 +++++++++++---- .../changeManagement/changeRequest.vue | 48 +++++++++++++++---- src/views/modules/oss/ossComponents.vue | 6 ++- 4 files changed, 88 insertions(+), 19 deletions(-) diff --git a/src/utils/httpRequest.js b/src/utils/httpRequest.js index 13973f2..8490880 100644 --- a/src/utils/httpRequest.js +++ b/src/utils/httpRequest.js @@ -92,7 +92,13 @@ const instance = axios.create({ * 请求拦截 */ instance.interceptors.request.use(config => { - config.headers['token'] =Vue.cookie.get('token') // 请求头带上token + config.headers['token'] = Vue.cookie.get('token') // 请求头带上token + + // 如果是 FormData,删除 Content-Type 让浏览器自动设置(包含 boundary) + if (config.data instanceof FormData) { + delete config.headers['Content-Type'] + } + return config }, error => { return Promise.reject(error) @@ -127,6 +133,12 @@ const instance2 = axios.create({ */ instance2.interceptors.request.use(config => { config.headers['token'] = Vue.cookie.get('token') // 请求头带上token + + // 如果是 FormData,删除 Content-Type 让浏览器自动设置(包含 boundary) + if (config.data instanceof FormData) { + delete config.headers['Content-Type'] + } + return config }, error => { return Promise.reject(error) @@ -155,6 +167,7 @@ export const createAPI = (url, method, data) => { } else { config.data = data } + if (data === 'download'){ // 下载功能的请求 return instance2({ url, diff --git a/src/views/modules/changeManagement/changeRecord.vue b/src/views/modules/changeManagement/changeRecord.vue index 6db47c5..e315703 100644 --- a/src/views/modules/changeManagement/changeRecord.vue +++ b/src/views/modules/changeManagement/changeRecord.vue @@ -5041,6 +5041,7 @@ searchDelegateAccessByUser(params).then(({data}) => { if (data && data.code === 0) { this.baseDelegateAccessList = data.rows; + // 不清空选中状态,依赖 :reserve-selection 保留之前的选择 } else { this.$message.warning(data.msg) } @@ -5050,8 +5051,25 @@ }, handleSelectionChange(val) { - // 获得选中的 用户 - this.selectionDelegateAccess2 = val; + // val 只包含当前数据源中被选中的行 + // 需要合并历史选择(selectionDelegateAccess)中不在当前数据源的人员 + + // 当前数据源中的所有人员编码 + let currentDataKeys = this.baseDelegateAccessList.map(item => item.delegateAccess); + + // 保留历史选择中不在当前数据源的人员(这些人员用户无法在当前对话框中取消选择) + let historyNotInCurrent = this.selectionDelegateAccess.filter(item => + !currentDataKeys.includes(item.delegateAccess) + ); + + // 合并:历史人员(不在当前数据源)+ 当前选中的人员 + let merged = [...historyNotInCurrent, ...val]; + + // 去重(虽然理论上不会重复) + let map = new Map(); + merged.forEach(item => map.set(item.delegateAccess, item)); + + this.selectionDelegateAccess2 = Array.from(map.values()); }, handleTableClick(row, column, event, val) { @@ -5060,17 +5078,19 @@ }, openDelegateAccess() { - let rows = JSON.parse(JSON.stringify(this.selectionDelegateAccess)) - if (rows && rows.length > 0) { - this.$nextTick(() => { + // 恢复已确认选中的人员状态(仅限当前列表中存在的) + // 不清空选中状态,让 :reserve-selection 自动保留之前的选择 + this.$nextTick(() => { + let rows = JSON.parse(JSON.stringify(this.selectionDelegateAccess)) + if (rows && rows.length > 0 && this.$refs.delegateAccesstTable) { rows.forEach(item => { let row = this.baseDelegateAccessList.find(row => row.delegateAccess === item.delegateAccess); - if (row) { - this.$refs.delegateAccesstTable.toggleRowSelection(row); + if (row) { // 只对当前列表中存在的行进行选中操作 + this.$refs.delegateAccesstTable.toggleRowSelection(row, true); // 明确设置为选中状态 } }) - }) - } + } + }) }, closeDelegateAccess() { diff --git a/src/views/modules/changeManagement/changeRequest.vue b/src/views/modules/changeManagement/changeRequest.vue index e8704b3..17650fd 100644 --- a/src/views/modules/changeManagement/changeRequest.vue +++ b/src/views/modules/changeManagement/changeRequest.vue @@ -2556,6 +2556,14 @@ this.chooseItemList = [] this.chooseItemList2 = [] this.chooseCSItemList = [] + // 清空 DelegateAccess 的选择(delegateAccessName 是计算属性会自动清空) + this.selectionDelegateAccess = [] + this.selectionDelegateAccess2 = [] + this.baseDelegateAccessList = [] + this.changeDelegateAccess = { + delegateAccess: '', + delegateAccessName: '', + } this.getDepartmentByUserName() this.getEcnTypeData() // 获取ECN种类 this.chooseDataList = data.rows.chooseDataList @@ -3357,6 +3365,7 @@ searchDelegateAccessByUser(params).then(({data}) => { if (data && data.code === 0) { this.baseDelegateAccessList = data.rows; + // 不清空选中状态,依赖 :reserve-selection 保留之前的选择 } else { this.$message.warning(data.msg) } @@ -3366,8 +3375,25 @@ }, handleSelectionChange(val) { - // 获得选中的 用户 - this.selectionDelegateAccess2 = val; + // val 只包含当前数据源中被选中的行 + // 需要合并历史选择(selectionDelegateAccess)中不在当前数据源的人员 + + // 当前数据源中的所有人员编码 + let currentDataKeys = this.baseDelegateAccessList.map(item => item.delegateAccess); + + // 保留历史选择中不在当前数据源的人员(这些人员用户无法在当前对话框中取消选择) + let historyNotInCurrent = this.selectionDelegateAccess.filter(item => + !currentDataKeys.includes(item.delegateAccess) + ); + + // 合并:历史人员(不在当前数据源)+ 当前选中的人员 + let merged = [...historyNotInCurrent, ...val]; + + // 去重(虽然理论上不会重复) + let map = new Map(); + merged.forEach(item => map.set(item.delegateAccess, item)); + + this.selectionDelegateAccess2 = Array.from(map.values()); }, handleTableClick(row, column, event, val) { @@ -3376,15 +3402,19 @@ }, openDelegateAccess() { - let rows = JSON.parse(JSON.stringify(this.selectionDelegateAccess)) - if (rows && rows.length > 0) { - this.$nextTick(() => { + // 恢复已确认选中的人员状态(仅限当前列表中存在的) + // 不清空选中状态,让 :reserve-selection 自动保留之前的选择 + this.$nextTick(() => { + let rows = JSON.parse(JSON.stringify(this.selectionDelegateAccess)) + if (rows && rows.length > 0 && this.$refs.delegateAccesstTable) { rows.forEach(item => { let row = this.baseDelegateAccessList.find(row => row.delegateAccess === item.delegateAccess); - this.$refs.delegateAccesstTable.toggleRowSelection(row); + if (row) { // 只对当前列表中存在的行进行选中操作 + this.$refs.delegateAccesstTable.toggleRowSelection(row, true); // 明确设置为选中状态 + } }) - }) - } + } + }) }, closeDelegateAccess() { @@ -3392,6 +3422,8 @@ }, confirmDelegateAccess() { + // selectionDelegateAccess2 已经在 handleSelectionChange 中合并了历史选择 + // 直接保存即可 this.selectionDelegateAccess = JSON.parse(JSON.stringify(this.selectionDelegateAccess2)) this.delegateAccessVisible = false; }, diff --git a/src/views/modules/oss/ossComponents.vue b/src/views/modules/oss/ossComponents.vue index 77a5a5c..ae71aa9 100644 --- a/src/views/modules/oss/ossComponents.vue +++ b/src/views/modules/oss/ossComponents.vue @@ -141,7 +141,11 @@ export default { } this.uploadLoading = false; }).catch((error)=>{ - this.$message.error(error); + console.error('文件上传失败:', error); + const errorMsg = error.response && error.response.data && error.response.data.msg + ? error.response.data.msg + : (error.message || '文件上传失败'); + this.$message.error(errorMsg); this.uploadLoading = false; }) },