From fd78c02b2db1ddcb8170fcbb38301cbb17ab44e4 Mon Sep 17 00:00:00 2001 From: egg Date: Mon, 23 Feb 2026 18:16:28 +0800 Subject: [PATCH] fix(job-query,query-tool): align txn history column order with field_contracts Replace dynamic Object.keys(row) column derivation with explicit display column lists matching field_contracts.json txn_table definition, ensuring consistent column order across job-query and query-tool transaction tables. Co-Authored-By: Claude Opus 4.6 --- .../job-query/composables/useJobQueryData.js | 18 ++++++++++--- .../query-tool/components/LotJobsTable.vue | 26 ++----------------- 2 files changed, 16 insertions(+), 28 deletions(-) diff --git a/frontend/src/job-query/composables/useJobQueryData.js b/frontend/src/job-query/composables/useJobQueryData.js index 861ead0..8aa45b5 100644 --- a/frontend/src/job-query/composables/useJobQueryData.js +++ b/frontend/src/job-query/composables/useJobQueryData.js @@ -52,6 +52,16 @@ function buildStatusTone(status) { return 'neutral'; } +const JOBS_DISPLAY_COLUMNS = Object.freeze([ + 'RESOURCENAME', 'JOBID', 'JOBSTATUS', 'JOBMODELNAME', + 'CREATEDATE', 'COMPLETEDATE', 'CAUSECODENAME', 'REPAIRCODENAME', +]); + +const TXN_DISPLAY_COLUMNS = Object.freeze([ + 'TXNDATE', 'FROMJOBSTATUS', 'JOBSTATUS', 'STAGENAME', + 'CAUSECODENAME', 'REPAIRCODENAME', 'USER_NAME', 'COMMENTS', +]); + export function useJobQueryData() { const resources = ref([]); const loadingResources = ref(false); @@ -89,13 +99,13 @@ export function useJobQueryData() { const selectedResourceCount = computed(() => filters.resourceIds.length); const jobsColumns = computed(() => { - const row = jobs.value[0] || {}; - return Object.keys(row); + const available = new Set(Object.keys(jobs.value[0] || {})); + return JOBS_DISPLAY_COLUMNS.filter((col) => available.has(col)); }); const txnColumns = computed(() => { - const row = txnRows.value[0] || {}; - return Object.keys(row); + const available = new Set(Object.keys(txnRows.value[0] || {})); + return TXN_DISPLAY_COLUMNS.filter((col) => available.has(col)); }); function resetDateRangeToLast90Days() { diff --git a/frontend/src/query-tool/components/LotJobsTable.vue b/frontend/src/query-tool/components/LotJobsTable.vue index 6829275..9f15fe7 100644 --- a/frontend/src/query-tool/components/LotJobsTable.vue +++ b/frontend/src/query-tool/components/LotJobsTable.vue @@ -47,24 +47,14 @@ const JOB_COLUMN_PRIORITY = Object.freeze([ ]); const TXN_COLUMN_PRIORITY = Object.freeze([ - 'JOBTXNHISTORYID', - 'JOBID', 'TXNDATE', 'FROMJOBSTATUS', 'JOBSTATUS', 'STAGENAME', - 'TOSTAGENAME', 'CAUSECODENAME', 'REPAIRCODENAME', - 'SYMPTOMCODENAME', - 'USER_EMPNO', 'USER_NAME', - 'EMP_EMPNO', - 'EMP_NAME', 'COMMENTS', - 'CDONAME', - 'JOBMODELNAME', - 'JOBORDERNAME', ]); const selectedJobId = ref(''); @@ -73,20 +63,8 @@ const loadingTxn = ref(false); const txnError = ref(''); function buildOrderedColumns(rows, preferred) { - const keys = Object.keys(rows?.[0] || {}); - if (keys.length === 0) { - return [...preferred]; - } - - const keySet = new Set(keys); - const ordered = preferred.filter((column) => keySet.has(column)); - const orderedSet = new Set(ordered); - keys.forEach((column) => { - if (!orderedSet.has(column)) { - ordered.push(column); - } - }); - return ordered; + const keys = new Set(Object.keys(rows?.[0] || {})); + return preferred.filter((column) => keys.has(column)); } const sortedRows = computed(() => {