From fc9d65c66eb35c36b98c02b69f1ea69ae27ad231 Mon Sep 17 00:00:00 2001 From: "han\\hanst" Date: Thu, 30 Jul 2026 15:24:01 +0800 Subject: [PATCH] Tracking Status --- .../sampleTracking/projectProofTracking.vue | 150 ++++++++++++++++-- 1 file changed, 140 insertions(+), 10 deletions(-) diff --git a/src/views/modules/sampleTracking/projectProofTracking.vue b/src/views/modules/sampleTracking/projectProofTracking.vue index fcfb91d..892da68 100644 --- a/src/views/modules/sampleTracking/projectProofTracking.vue +++ b/src/views/modules/sampleTracking/projectProofTracking.vue @@ -108,6 +108,13 @@ {{ scope.row.proofingStatus || '进行中' }} + + + -1 && status.indexOf('未') === -1 }, + getTrackingProcessColumnsByRow (row) { + if (!row) { + return [] + } + const processColumnMap = {} + const appendProcessColumn = (processCol) => { + if (!processCol || !processCol.code || processColumnMap[processCol.code]) { + return + } + processColumnMap[processCol.code] = processCol + } + this.processColumns.forEach(item => { + appendProcessColumn(item) + }) + // 兜底补齐默认工序元信息,避免配置变化导致状态字段找不到。 + DEFAULT_PROCESS_COLUMNS.forEach(item => { + appendProcessColumn(item) + }) + + let orderedCodes = [] + if (this.getSelectedSearchBuNo()) { + orderedCodes = this.visibleProcessColumns.map(item => item.code) + } else { + const configEntry = this.getBuProcessConfigEntry(row.buNo, row.site) + const config = configEntry ? configEntry.config : null + orderedCodes = config && Array.isArray(config.processOrderCodes) && config.processOrderCodes.length > 0 + ? this.getValidProcessOrderCodes(config.processOrderCodes) + : this.getAllProcessCodes() + const visibleCodes = this.getProcessVisibleCodesByBuNo(row.buNo, row.site) + if (visibleCodes) { + const visibleCodeMap = {} + visibleCodes.forEach(code => { + visibleCodeMap[code] = true + }) + orderedCodes = orderedCodes.filter(code => visibleCodeMap[code]) + } + } + + const result = [] + const usedCodeMap = {} + orderedCodes.forEach(code => { + const codeVal = code == null ? '' : String(code).trim() + if (!codeVal || usedCodeMap[codeVal]) { + return + } + const processCol = processColumnMap[codeVal] + if (!processCol) { + return + } + usedCodeMap[codeVal] = true + result.push(processCol) + }) + return result + }, + getFirstPendingProcessLabel (row) { + const processColumns = this.getTrackingProcessColumnsByRow(row) + for (let i = 0; i < processColumns.length; i += 1) { + const processCol = processColumns[i] + if (!this.isProcessComplete(row, processCol)) { + return processCol.label || processCol.code + } + } + return '已全部完成' + }, + getTrackingStatusType (row) { + if (!row) { + return '' + } + const requiredDeliveryDate = this.formatDate(row.requiredDeliveryDate) + if (!requiredDeliveryDate) { + return '' + } + const today = this.formatDate(new Date()) + // 按业务口径:今日 <= 预计完成日期 判定为 On schedule,其余判定为 Delay。 + if (today <= requiredDeliveryDate) { + return 'onSchedule' + } + return 'delay' + }, + getTrackingStatusText (row) { + const statusType = this.getTrackingStatusType(row) + if (!statusType) { + return '-' + } + const statusPrefix = statusType === 'onSchedule' ? 'On schedule' : 'Delay' + return `${statusPrefix}-${this.getFirstPendingProcessLabel(row)}` + }, + getTrackingStatusClass (row) { + const statusType = this.getTrackingStatusType(row) + if (statusType === 'onSchedule') { + return 'tracking-status tracking-status--on-schedule' + } + if (statusType === 'delay') { + return 'tracking-status tracking-status--delay' + } + return 'tracking-status tracking-status--unknown' + }, formatDate (val) { if (!val) { return '' @@ -3248,6 +3349,35 @@ export default { color: #e6a23c; } +.tracking-status { + width: 100%; + min-height: 26px; + padding: 4px 6px; + box-sizing: border-box; + border: 1px solid #dcdfe6; + border-radius: 4px; + background: #fff; + color: #303133; + font-weight: 500; + line-height: 18px; + text-align: left; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.tracking-status--on-schedule { + background: #e8f5e9; +} + +.tracking-status--delay { + background: #fde2e2; +} + +.tracking-status--unknown { + background: #f4f4f5; +} + .process-cell { background: #fff; min-height: 44px;