From ca43270a64f7c62112f3e9f36d5c97a6f149a9ce Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期三, 09 九月 2026 17:05:31 +0800
Subject: [PATCH] fix: 审核结果页选月一直转圈——isReminderRow误放computed改为methods(带参函数需在methods),含测试报告与工作日结

---
 traffic-audit-web/src/views/ReportExport.vue |  101 +++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 94 insertions(+), 7 deletions(-)

diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index 3bac892..54f5513 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -27,7 +27,7 @@
 
           <!-- 绗簩琛岋細鎶ヨ〃绫诲瀷鍒囨崲锛堣揣杩� / 鏃呭 / 鎶曡祫 / 鑳借�� / 鍩庡競瀹㈣繍锛夛紱el-radio-group 鏇夸唬 el-tabs锛岃閬� el-tabs 甯冨眬鏃犻檺寰幆锛堜笌 /import 淇涓�鑷达級 -->
           <el-radio-group v-model="activeKey" class="module-tabs">
-            <el-radio-button v-for="m in modules" :key="m.key" :label="m.key">
+            <el-radio-button v-for="m in visibleModules" :key="m.key" :label="m.key">
               {{ m.title }}<el-tag v-if="m.tag" size="mini" :type="m.tagType || 'info'" style="margin-left:6px">{{ m.tag }}</el-tag>
             </el-radio-button>
           </el-radio-group>
@@ -112,7 +112,25 @@
                 <span v-if="!it.ready" class="cov-bad" style="margin-left:10px">{{ it.note }}</span>
                 <span v-if="it.ready && it.audited === false" class="cov-bad" style="margin-left:10px">鏈鏍�</span>
               </div>
-              <table class="preview-summary" v-if="it.summary && it.summary.length">
+              <table class="preview-summary wb-table" v-if="it.key === 'summaryWorkbook' && it.summary && it.summary.length">
+                <thead>
+                  <tr><th style="width:44%">鎸囨爣</th><th style="width:30%">鏁版嵁</th><th>鍚屾瘮</th></tr>
+                </thead>
+                <tbody>
+                  <template v-for="(sec, si) in wbRows(it.summary)">
+                    <tr v-for="(row, ri) in sec.rows" :key="si + '-' + ri">
+                      <td v-if="ri === 0" :rowspan="sec.rows.length" class="wb-sec">{{ sec.name }}</td>
+                      <td class="wb-label">{{ row.label }}</td>
+                      <td class="wb-value">{{ row.value === null ? '鈥�' : fmtVal(row.value) }}</td>
+                      <td class="wb-yoy" :class="{ 'yoy-empty': row.yoy === null }">{{ row.yoy === null ? '鈥�' : row.yoy }}</td>
+                    </tr>
+                  </template>
+                </tbody>
+              </table>
+              <div v-if="it.key === 'summaryWorkbook' && wbMissing(it.summary)" class="wb-note">
+                閮ㄥ垎鎸囨爣缂哄皯涓婂勾鍚屾湡锛坽{ wbPrevYear() }}锛夊熀鏈熸暟鎹紝鍚屾瘮鏆傛湭璁$畻
+              </div>
+              <table class="preview-summary" v-else-if="it.summary && it.summary.length">
                 <tbody>
                   <tr v-for="(s, i) in it.summary" :key="i">
                     <td>{{ s.label }}</td>
@@ -176,21 +194,21 @@
           ], checked: []
         },
         {
-          key: 'freight', title: '璐ц繍鎶ヨ〃', items: [
+          key: 'freight', title: '璐ц繍鎶ヨ〃', hidden: true, items: [
             { key: 'cityDetail', label: '璐ц繍閲忓垎甯傚窞鏄庣粏', fileName: '鐢熸垚_璐ц繍閲忓垎甯傚窞鏄庣粏.xlsx', status: null, statusNote: '' },
             { key: 'freightRank', label: '璐ц繍閲忔帓鍚�', fileName: '鐢熸垚_璐ц繍閲忔帓鍚�.xlsx', status: null, statusNote: '' },
             { key: 'turnoverRank', label: '鍛ㄨ浆閲忔帓鍚�', fileName: '鐢熸垚_鍛ㄨ浆閲忔帓鍚�.xlsx', status: null, statusNote: '' }
           ], checked: []
         },
         {
-          key: 'passenger', title: '鏃呭鎶ヨ〃', items: [
+          key: 'passenger', title: '鏃呭鎶ヨ〃', hidden: true, items: [
             { key: 'passengerCityDetail', label: '鍏矾鏃呭鍒嗗競宸�', fileName: '鐢熸垚_鍏矾鏃呭鍒嗗競宸�.xlsx', status: null, statusNote: '' },
             { key: 'passengerMidDetail', label: '涓彛寰勬槑缁�', fileName: '鐢熸垚_鍏矾鏃呭涓彛寰勬槑缁�.xlsx', status: null, statusNote: '' },
             { key: 'passengerMidRank', label: '涓彛寰勬帓鍚�', fileName: '鐢熸垚_鍏矾鏃呭涓彛寰勬帓鍚�.xlsx', status: null, statusNote: '' },
             { key: 'passengerMidAnalysis', label: '涓彛寰勫垎鏋�', fileName: '鐢熸垚_鍏矾鏃呭涓彛寰勫垎鏋�.xlsx', status: null, statusNote: '' }
           ], checked: []
         },        {
-          key: 'cityPassenger', title: '鍩庡競瀹㈣繍鎶ヨ〃', items: [
+          key: 'cityPassenger', title: '鍩庡競瀹㈣繍鎶ヨ〃', hidden: true, items: [
             { key: 'cityBusDetail', label: '鍩庡競鍏氦瀹㈣繍閲忓垎甯傚窞鏄庣粏', fileName: '鐢熸垚_鍩庡競鍏氦瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx', status: null, statusNote: '' },
             { key: 'cityTaxiDetail', label: '宸℃父鍑虹瀹㈣繍閲忓垎甯傚窞鏄庣粏', fileName: '鐢熸垚_宸℃父鍑虹瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx', status: null, statusNote: '' },
             { key: 'cityRailFerryDetail', label: '杞ㄩ亾杞浮瀹㈣繍閲忓垎甯傚窞鏄庣粏', fileName: '鐢熸垚_杞ㄩ亾杞浮瀹㈣繍閲忓垎甯傚窞鏄庣粏.xlsx', status: null, statusNote: '' },
@@ -223,6 +241,9 @@
       const s = sessionStorage.getItem('modules')
       if (!s) return []
       return s.split(',').filter(Boolean)
+    },
+    visibleModules() {
+      return this.modules.filter(m => !m.hidden)
     },
     curModule() {
       return this.modules.find(m => m.key === this.activeKey) || this.modules[0]
@@ -260,8 +281,8 @@
     }
   },
   created() {
-    const mine = this.myModules.filter(k => this.modules.some(m => m.key === k))
-    this.activeKey = (mine.length ? mine : this.modules.map(m => m.key))[0]
+    const mine = this.myModules.filter(k => this.visibleModules.some(m => m.key === k))
+    this.activeKey = (mine.length ? mine : this.visibleModules.map(m => m.key))[0]
     this.ensureCycle()
     this.refreshAll()
   },  methods: {
@@ -377,6 +398,65 @@
       }
       return String(v)
     },
+    wbRows(summary) {
+      const get = (key) => {
+        const hit = (summary || []).find(x => x.label === key)
+        return hit && hit.value !== null && hit.value !== undefined && hit.value !== '' ? hit.value : null
+      }
+      const pct = (key) => {
+        const v = get(key)
+        return v === null ? null : this.fmtVal(v) + '%'
+      }
+      const mk = (defs) => defs.map(d => ({
+        label: d[0],
+        value: get(d[1]),
+        yoy: d[2] ? pct(d[2]) : null
+      }))
+      return [
+        {
+          name: '閬撹矾璐ц繍',
+          rows: mk([
+            ['褰撴湀璐ц繍閲�(涓囧惃)', '鍏ㄧ渷璐ц繍閲徛峰綋鏈�'],
+            ['褰撴湀璐х墿鍛ㄨ浆閲�(涓囧惃)', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛峰綋鏈�', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛峰綋鏈堝悓姣�'],
+            ['绱璐ц繍閲�(涓囧惃)', '鍏ㄧ渷璐ц繍閲徛风疮璁�'],
+            ['绱璐х墿鍛ㄨ浆閲�(涓囧惃鍏噷)', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛风疮璁�', '鍏ㄧ渷璐х墿鍛ㄨ浆閲徛风疮璁″悓姣�']
+          ])
+        },
+        {
+          name: '鍩庡競瀹㈣繍',
+          rows: mk([
+            ['褰撴湀鍩庡競瀹㈣繍閲�:', '鍩庡競瀹㈣繍閲徛峰綋鏈�'],
+            ['褰撴湀鍩庡競瀹㈣繍鍛ㄨ浆閲�', '鍩庡競瀹㈣繍鍛ㄨ浆閲徛峰綋鏈�'],
+            ['绱鍩庡競瀹㈣繍閲�:', '鍩庡競瀹㈣繍閲徛风疮璁�'],
+            ['绱鍩庡競瀹㈣繍鍛ㄨ浆閲�', '鍩庡競瀹㈣繍鍛ㄨ浆閲徛风疮璁�']
+          ])
+        },
+        {
+          name: '涓彛寰�',
+          rows: mk([
+            ['褰撴湀涓彛寰勫杩愰噺', '涓彛寰勫杩愰噺路褰撴湀'],
+            ['褰撴湀涓彛寰勫懆杞噺', '涓彛寰勫懆杞噺路褰撴湀'],
+            ['绱涓彛寰勫杩愰噺', '涓彛寰勫杩愰噺路绱'],
+            ['绱涓彛寰勫懆杞噺', '涓彛寰勫懆杞噺路绱']
+          ])
+        }
+      ]
+    },
+    wbMissing(summary) {
+      let total = 0
+      let have = 0
+      ;(summary || []).forEach(x => {
+        if (String(x.label).indexOf('鍚屾瘮') >= 0) return
+        total++
+        if (x.value !== null && x.value !== undefined && x.value !== '') have++
+      })
+      return total > 0 && have < total
+    },
+    wbPrevYear() {
+      const m = /^(\d{4})-(\d{2})$/.exec(this.previewPeriod || '')
+      if (!m) return '涓婂勾鍚屾湡'
+      return (Number(m[1]) - 1) + '-' + m[2]
+    },
     coverageText(it) {
       const cov = it.monthCoverage || []
       if (!cov.length) return '鏃犳暟鎹�'
@@ -491,4 +571,11 @@
 @media (max-width: 900px) {
   .panel-head { flex-direction: column; align-items: flex-start; }
 }
+.wb-table th { background:#f5f7fa; }
+.wb-sec { background:#F7F9FC; font-weight:600; text-align:center; color:#303133; }
+.wb-label { color:#303133; }
+.wb-value { text-align:right; font-variant-numeric: tabular-nums; }
+.wb-yoy { text-align:right; color:#606266; }
+.wb-yoy.yoy-empty { color:#C0C4CC; }
+.wb-note { color:#E6A23C; font-size:12px; margin:2px 0 8px; }
 </style>

--
Gitblit v1.9.1