From a742ce462230cdd1b419397a1ae6412ac61d57a1 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Mon, 17 Aug 2026 15:06:12 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E6=80=81=E5=88=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sampleTracking/projectProofTracking.vue | 427 ++++++++++++++++-- 1 file changed, 391 insertions(+), 36 deletions(-) diff --git a/src/views/modules/sampleTracking/projectProofTracking.vue b/src/views/modules/sampleTracking/projectProofTracking.vue index ebff8c6..45007de 100644 --- a/src/views/modules/sampleTracking/projectProofTracking.vue +++ b/src/views/modules/sampleTracking/projectProofTracking.vue @@ -76,44 +76,43 @@ style="width: 100%; margin-top: 8px" > - - - - - - - - - - - - - - - - - - - - + @@ -962,6 +961,7 @@ import { searchBusinessInfo8 } from '@/api/factory/site.js' import { queryCustomerList } from '@/api/customer/customer' +import { getTableDefaultListLanguage, getTableUserListLanguage } from '@/api/table.js' import Chooselist from '@/views/modules/common/Chooselist_eam' import Sortable from 'sortablejs' @@ -1009,6 +1009,167 @@ function cloneDefaultProcessColumns () { return DEFAULT_PROCESS_COLUMNS.map(item => Object.assign({}, item)) } +const DEFAULT_TRACKING_COLUMNS = [ + { + serialNumber: 'proofTrackingTable1ProjectNo', + columnProp: 'projectNo', + headerAlign: 'center', + align: 'left', + columnLabel: '项目编码', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 90, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1ProjectDesc', + columnProp: 'projectDesc', + headerAlign: 'center', + align: 'left', + columnLabel: '项目描述', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 120, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1TestPartNo', + columnProp: 'testPartNo', + headerAlign: 'center', + align: 'left', + columnLabel: '项目物料', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 90, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1PartDesc', + columnProp: 'partDesc', + headerAlign: 'center', + align: 'left', + columnLabel: '物料描述', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: 'left', + columnWidth: 150, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1ProjectRegion', + columnProp: 'cProjectRegion', + headerAlign: 'center', + align: 'left', + columnLabel: '区域', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 90, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1CustomerDesc', + columnProp: 'customerDesc', + headerAlign: 'center', + align: 'left', + columnLabel: '客户名称', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 130, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1Engineer', + columnProp: 'engineer', + headerAlign: 'center', + align: 'left', + columnLabel: 'Engineer', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 120, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1ProjectManager', + columnProp: 'projectManager', + headerAlign: 'center', + align: 'left', + columnLabel: 'PM/Sales', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 120, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1ProofingNo', + columnProp: 'proofingNo', + headerAlign: 'center', + align: 'left', + columnLabel: '打样单号', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 90, + showOverflowTooltip: true + }, + { + serialNumber: 'proofTrackingTable1ProofingStatus', + columnProp: 'proofingStatus', + headerAlign: 'center', + align: 'center', + columnLabel: '打样状态', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 80, + showOverflowTooltip: false + }, + { + serialNumber: 'proofTrackingTable1TrackingStatus', + columnProp: 'trackingStatus', + headerAlign: 'center', + align: 'center', + columnLabel: 'Tracking Status', + columnHidden: false, + columnImage: false, + columnSortable: false, + status: true, + fixed: '', + columnWidth: 150, + showOverflowTooltip: true + } +] + +function cloneDefaultTrackingColumns () { + return DEFAULT_TRACKING_COLUMNS.map(item => Object.assign({}, item)) +} + export default { name: 'ProjectProofTracking', directives: { @@ -1044,6 +1205,7 @@ export default { proofSyncFlag: '', proofingStatus: '' }, + trackingColumnList: cloneDefaultTrackingColumns(), processColumns: cloneDefaultProcessColumns(), buProcessConfigDialogVisible: false, buProcessConfigRows: [], @@ -1208,7 +1370,7 @@ export default { } }, activated () { - Promise.all([this.loadUserBuList(), this.queryProcessColumns()]).then(() => { + Promise.all([this.loadUserBuList(), this.queryProcessColumns(), this.loadTrackingColumns()]).then(() => { this.queryBuProcessConfig() }) this.getDataList() @@ -1217,6 +1379,12 @@ export default { this.destroyDefaultProcessConfigSortable() }, computed: { + visibleTrackingColumns () { + const sourceColumns = Array.isArray(this.trackingColumnList) && this.trackingColumnList.length > 0 + ? this.trackingColumnList + : this.buildDefaultTrackingColumns() + return sourceColumns.filter(item => this.isTrackingColumnVisible(item)) + }, visibleProcessColumns () { const searchBuNo = this.getSelectedSearchBuNo() // 指定了查询BU时,整表进度列按该BU配置展示。 @@ -1250,6 +1418,193 @@ export default { } }, methods: { + getTrackingColumnFunctionId () { + return this.$route && this.$route.meta && this.$route.meta.menuId + ? this.$route.meta.menuId + : '' + }, + getTrackingColumnTableId () { + const functionId = this.getTrackingColumnFunctionId() + return functionId ? `${functionId}table1` : 'projectProofTrackingTable1' + }, + buildDefaultTrackingColumns () { + const functionId = this.getTrackingColumnFunctionId() + const tableId = this.getTrackingColumnTableId() + const userId = this.$store.state.user.name + return cloneDefaultTrackingColumns().map(item => Object.assign({}, item, { + userId: userId, + functionId: functionId, + tableId: tableId, + tableName: '项目打样跟踪' + })) + }, + normalizeTrackingColumnWidth (value, fallbackValue) { + const parsedValue = parseInt(value, 10) + if (!Number.isNaN(parsedValue) && parsedValue > 0) { + return parsedValue + } + const parsedFallback = parseInt(fallbackValue, 10) + return !Number.isNaN(parsedFallback) && parsedFallback > 0 ? parsedFallback : 120 + }, + normalizeTrackingColumnBoolean (value, fallbackValue) { + if (value === undefined || value === null || value === '') { + return fallbackValue + } + if (typeof value === 'boolean') { + return value + } + if (typeof value === 'number') { + return value !== 0 + } + const normalizedValue = String(value).trim().toLowerCase() + if (normalizedValue === 'true' || normalizedValue === '1' || normalizedValue === 'y' || normalizedValue === 'yes') { + return true + } + if (normalizedValue === 'false' || normalizedValue === '0' || normalizedValue === 'n' || normalizedValue === 'no') { + return false + } + return fallbackValue + }, + normalizeTrackingColumnItem (item, fallbackItem) { + const defaultItem = fallbackItem || {} + const mergedItem = Object.assign({}, defaultItem, item || {}) + const columnProp = mergedItem.columnProp == null ? '' : String(mergedItem.columnProp).trim() + const normalizedLabel = mergedItem.columnLabel == null ? '' : String(mergedItem.columnLabel).trim() + return Object.assign({}, mergedItem, { + columnProp: columnProp, + columnLabel: normalizedLabel || defaultItem.columnLabel || columnProp, + headerAlign: mergedItem.headerAlign || defaultItem.headerAlign || 'center', + align: mergedItem.align || defaultItem.align || 'left', + fixed: mergedItem.fixed == null ? (defaultItem.fixed || '') : mergedItem.fixed, + columnWidth: this.normalizeTrackingColumnWidth(mergedItem.columnWidth, defaultItem.columnWidth), + showOverflowTooltip: this.normalizeTrackingColumnBoolean(mergedItem.showOverflowTooltip, defaultItem.showOverflowTooltip !== false), + status: this.normalizeTrackingColumnBoolean(mergedItem.status, true), + columnHidden: this.normalizeTrackingColumnBoolean(mergedItem.columnHidden, false) + }) + }, + normalizeTrackingColumns (rows) { + const defaultColumns = this.buildDefaultTrackingColumns() + const defaultColumnMap = {} + defaultColumns.forEach(item => { + defaultColumnMap[item.columnProp] = item + }) + const mergedRows = [] + const usedColumnPropMap = {} + if (Array.isArray(rows)) { + rows.forEach(item => { + const columnProp = item && item.columnProp != null ? String(item.columnProp).trim() : '' + if (!columnProp || usedColumnPropMap[columnProp]) { + return + } + usedColumnPropMap[columnProp] = true + mergedRows.push(this.normalizeTrackingColumnItem(item, defaultColumnMap[columnProp])) + }) + } + // 用户旧配置可能缺少新加列,这里按系统默认顺序补齐,避免新增列永远看不到。 + defaultColumns.forEach((defaultItem, defaultIndex) => { + if (usedColumnPropMap[defaultItem.columnProp]) { + return + } + let insertIndex = mergedRows.length + for (let i = defaultIndex + 1; i < defaultColumns.length; i++) { + const nextProp = defaultColumns[i].columnProp + const matchedIndex = mergedRows.findIndex(item => item.columnProp === nextProp) + if (matchedIndex > -1) { + insertIndex = matchedIndex + break + } + } + if (insertIndex === mergedRows.length) { + for (let i = defaultIndex - 1; i >= 0; i--) { + const prevProp = defaultColumns[i].columnProp + const matchedIndex = mergedRows.findIndex(item => item.columnProp === prevProp) + if (matchedIndex > -1) { + insertIndex = matchedIndex + 1 + break + } + } + } + mergedRows.splice(insertIndex, 0, Object.assign({}, defaultItem)) + usedColumnPropMap[defaultItem.columnProp] = true + }) + return mergedRows + }, + loadTrackingDefaultColumns (tableId) { + const queryTable = { + functionId: this.getTrackingColumnFunctionId(), + tableId: tableId, + languageCode: this.$i18n && this.$i18n.locale ? this.$i18n.locale : '' + } + return getTableDefaultListLanguage(queryTable).then(({ data }) => { + const rows = data && Array.isArray(data.rows) ? data.rows : [] + this.trackingColumnList = rows.length > 0 + ? this.normalizeTrackingColumns(rows) + : this.buildDefaultTrackingColumns() + this.refreshTrackingTableLayout() + return this.trackingColumnList + }).catch(() => { + this.trackingColumnList = this.buildDefaultTrackingColumns() + this.refreshTrackingTableLayout() + return this.trackingColumnList + }) + }, + loadTrackingColumns () { + const tableId = this.getTrackingColumnTableId() + const queryTableUser = { + userId: this.$store.state.user.name, + functionId: this.getTrackingColumnFunctionId(), + tableId: tableId, + status: true, + languageCode: this.$i18n && this.$i18n.locale ? this.$i18n.locale : '' + } + return getTableUserListLanguage(queryTableUser).then(({ data }) => { + const rows = data && Array.isArray(data.rows) ? data.rows : [] + if (rows.length > 0) { + this.trackingColumnList = this.normalizeTrackingColumns(rows) + this.refreshTrackingTableLayout() + return this.trackingColumnList + } + return this.loadTrackingDefaultColumns(tableId) + }).catch(() => { + this.trackingColumnList = this.buildDefaultTrackingColumns() + this.refreshTrackingTableLayout() + return this.trackingColumnList + }) + }, + isTrackingColumnVisible (column) { + if (!column) { + return false + } + if (this.normalizeTrackingColumnBoolean(column.status, true) === false) { + return false + } + return this.normalizeTrackingColumnBoolean(column.columnHidden, false) === false + }, + isProjectPartSyncColumn (columnProp) { + return ['projectNo', 'projectDesc', 'testPartNo', 'partDesc'].indexOf(columnProp) > -1 + }, + getTrackingColumnDisplayValue (row, columnProp) { + if (!row || !columnProp) { + return '-' + } + const value = row[columnProp] + return this.isBlankValue(value) ? '-' : String(value) + }, + getTrackingRoleDisplayValue (row, nameField, valueField) { + if (!row) { + return '-' + } + const roleNameValue = row[nameField] + if (!this.isBlankValue(roleNameValue)) { + return String(roleNameValue) + } + const roleValue = row[valueField] + if (this.isBlankValue(roleValue)) { + return '-' + } + const displayName = this.getRoleDisplayName(roleValue) + return this.isBlankValue(displayName) ? '-' : displayName + }, loadUserBuList () { if (this.userBuList.length > 0) { this.ensureBuProcessConfigRows()