From a4190a73d594ab281f2530b5ff08077529bdadfc Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Sun, 20 Sep 2026 10:31:39 +0800 Subject: [PATCH] =?UTF-8?q?=E6=89=8B=E5=8A=A8=E8=B0=83=E6=95=B4=E5=88=97?= =?UTF-8?q?=E5=AE=BD=E5=8F=AF=E4=BB=A5=E4=BF=9D=E5=AD=98=E5=88=B0=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E7=9A=84=E5=8A=A8=E6=80=81=E5=88=97=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E9=87=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sampleTracking/projectProofTracking.vue | 55 ++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/views/modules/sampleTracking/projectProofTracking.vue b/src/views/modules/sampleTracking/projectProofTracking.vue index d0d7511..cfc9a77 100644 --- a/src/views/modules/sampleTracking/projectProofTracking.vue +++ b/src/views/modules/sampleTracking/projectProofTracking.vue @@ -216,6 +216,7 @@ :height="trackingTableHeight" v-loading="dataListLoading" @sort-change="handleTrackingTableSortChange" + @header-dragend="handleTrackingColumnResize" @selection-change="selectionChange" @row-click="rowClick" style="width: 100%; margin-top: 8px" @@ -1275,7 +1276,7 @@ import { searchBusinessInfo8 } from '@/api/factory/site.js' import { queryCustomerList } from '@/api/customer/customer' -import { getTableUserListLanguage } from '@/api/table.js' +import { getTableUserListLanguage, updateColumnSize, saveTableUser } from '@/api/table.js' import Chooselist from '@/views/modules/common/Chooselist_eam' import Sortable from 'sortablejs' @@ -1710,6 +1711,8 @@ export default { searchProjectManagerOptions: [], searchPicOptions: [], trackingColumnList: cloneDefaultTrackingColumns(), + trackingColumnsLoaded: false, + trackingColumnsPersisted: false, processColumns: cloneDefaultProcessColumns(), processCodeLabelMap: buildProcessCodeLabelMapByRows(cloneDefaultProcessColumns()), trackingTableSortProp: '', @@ -2086,6 +2089,7 @@ export default { return mergedRows }, loadTrackingColumns () { + this.trackingColumnsLoaded = false const queryTableUser = { userId: this.$store.state.user.name, functionId: this.getTrackingColumnFunctionId(), @@ -2093,7 +2097,12 @@ export default { languageCode: this.$i18n && this.$i18n.locale ? this.$i18n.locale : '' } return getTableUserListLanguage(queryTableUser).then(({ data }) => { - const rows = data && Array.isArray(data.rows) ? data.rows : [] + if (!data || data.code !== 0 || !Array.isArray(data.rows)) { + throw new Error('加载用户动态列失败') + } + const rows = data.rows + this.trackingColumnsLoaded = true + this.trackingColumnsPersisted = rows.length > 0 // 不按 status 过滤:隐藏列也要读回来,才能按用户设置真正不展示。 // 用户完全没有动态列配置时,才回退到本页代码里的默认列。 this.trackingColumnList = rows.length > 0 @@ -2107,6 +2116,48 @@ export default { return this.trackingColumnList }) }, + handleTrackingColumnResize (newWidth, oldWidth, column) { + // 工序、Comments、操作等非用户动态列不调用此配置接口。 + const item = column && this.trackingColumnList.find(row => row.columnProp === column.property) + const width = Math.round(Number(newWidth)) + if (!item || !Number.isFinite(width) || width <= 0 || newWidth === oldWidth) { + return Promise.resolve() + } + const userId = this.$store.state.user.name + const functionId = this.getTrackingColumnFunctionId() + const tableId = this.getTrackingColumnTableId() + if (!this.trackingColumnsLoaded || this.isBlankValue(userId) || this.isBlankValue(functionId) || this.isBlankValue(tableId)) { + this.$message.warning('动态列配置尚未加载成功,列宽未保存,请刷新后重试') + return Promise.resolve() + } + this.$set(item, 'columnWidth', width) + // 仅提交身份字段和宽度,避免覆盖显隐、顺序、固定位置等其他用户配置。 + const payload = { userId, functionId, tableId, columnProp: item.columnProp, columnWidth: width } + // 串行保存,连续拖动时最后一次宽度不会被先发后到的请求覆盖。 + const queue = this._trackingColumnWidthSaveQueue || Promise.resolve() + this._trackingColumnWidthSaveQueue = queue.then(async () => { + let response + if (!this.trackingColumnsPersisted) { + // 后端没有默认列配置时,本页使用代码默认列;首次拖动初始化整组,不能只写一列。 + const columns = this.trackingColumnList.map((row, index) => Object.assign({}, row, { + userId, + functionId, + tableId, + sortLv: row.sortLv == null ? index + 1 : row.sortLv + })) + response = await saveTableUser(columns) + } else { + response = await updateColumnSize(payload) + } + if (!response || !response.data || response.data.code !== 0) { + throw new Error('列宽保存失败') + } + this.trackingColumnsPersisted = true + }).catch(() => { + this.$message.warning('列宽保存失败,当前宽度仅临时生效,请重新拖动以重试') + }) + return this._trackingColumnWidthSaveQueue + }, isTrackingColumnVisible (column) { if (!column) { return false