From 5fafb6c4451c0716921bcb1d248baa1613befb36 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 13 十月 2026 20:10:49 +0800
Subject: [PATCH] feat(汇总大表): 生成件页签打开定位到本期数据列并重建累计/累计同比公式(待验收)

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

diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index 20c86d5..d689d3c 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -10,8 +10,13 @@
           <el-menu-item index="/explain">浼佷笟瑙i噴</el-menu-item>
           <el-menu-item index="/audit">瀹℃牳缁撴灉</el-menu-item>
           <el-menu-item index="/report">鎶ヨ〃鐢熸垚</el-menu-item>
+          <el-submenu index="/special-stats">
+            <template slot="title">涓撻」缁熻</template>
+            <el-menu-item index="/holiday-stat">鑺傚亣鏃�</el-menu-item>
+          </el-submenu>
           <el-menu-item index="/rules">瑙勫垯绠$悊</el-menu-item>
           <el-menu-item index="/users">鐢ㄦ埛绠$悊</el-menu-item>
+          <el-menu-item v-if="operatorIsAdmin" index="/system-config">绯荤粺閰嶇疆</el-menu-item>
         </el-menu>
       </el-aside>
       <el-main>
@@ -170,6 +175,7 @@
             <p class="task-step">{{ taskInfo.step || '鎺掗槦涓�' }}</p>
             <p class="task-meta" v-if="taskInfo.period && !taskInfo.fromCache">鎶ヨ〃鏈� {{ taskInfo.period }}銆�宸茬敤 {{ ((taskInfo.elapsedMs || 0) / 1000).toFixed(1) }} 绉�</p>
             <p class="task-meta" v-else-if="taskInfo.period">鎶ヨ〃鏈� {{ taskInfo.period }}銆�涓婃鐢熸垚浜� {{ taskCacheTime }}</p>
+            <p class="task-meta" v-if="taskInfo.staleCache">涓婃鐢熸垚鐨勭粨鏋滃凡鍥犳暟鎹垨姣嶇増鍙樺寲澶辨晥锛屾湰娆℃寜鏈�鏂版暟鎹噸绠椼��</p>
             <p class="task-meta" v-if="taskInfo.fromCache">鏈鐩存帴娌跨敤 {{ taskCacheTime }} 鐢熸垚鐨勭粨鏋滐紙鏈熼棿娌℃湁鏂扮殑鏁版嵁瀵煎叆锛夈�傚闇�鎸夋渶鏂版暟鎹噸绠楋紝璇风偣銆岄噸鏂扮敓鎴愩�嶃��</p>
             <p class="task-done" v-if="taskDownloaded">
               宸茶嚜鍔ㄤ笅杞斤細<b>{{ taskFileName }}</b><span v-if="taskFileSize">锛坽{ taskFileSizeText }}锛�</span>锛屾枃浠跺湪娴忚鍣ㄩ粯璁や笅杞界洰褰曘��
@@ -182,6 +188,25 @@
             <el-button size="small" :disabled="taskRunning" @click="restartTask">閲嶆柊鐢熸垚</el-button>
             <el-button size="small" v-if="taskRunning" @click="minimizeTask">鍚庡彴杩愯</el-button>
             <el-button size="small" v-else type="primary" @click="closeTask">鍏抽棴</el-button>
+          </span>
+        </el-dialog>
+        <!-- 姹囨�诲ぇ琛ㄥ鍑哄墠缂烘暟娓呭崟寮圭獥锛�2026-10-12 鐢ㄦ埛瑕佹眰锛氱己鏁版憜鍒板彴闈笂锛� -->
+        <el-dialog title="鐢熸垚鍓嶆彁绀� - 鏁版嵁缂哄け娓呭崟" :visible.sync="missDialogVisible" width="720px" top="6vh">
+          <div class="miss-body">
+            <p class="miss-lead">鎶ヨ〃鏈� <b>{{ missDialogPeriod }}</b>锛氫互涓嬫暟鎹湰娆$敓鎴愪細缂哄け/寮傚父锛岀敓鎴愪欢鏈熬涔熶細闄勩�婃暟鎹己澶辨竻鍗曘�嬮〉銆�</p>
+            <template v-if="missDialogMissing.length">
+              <div class="miss-sec">涓�銆佺己鏁版竻鍗曪紙璇ユ湁鐨勬暟娌℃湁锛夈��鍏� {{ missDialogMissing.length }} 鏉�</div>
+              <ul class="miss-list"><li v-for="(t, i) in missDialogMissing" :key="'m' + i">{{ t }}</li></ul>
+            </template>
+            <template v-if="missDialogCheck.length">
+              <div class="miss-sec">浜屻�佹暟鎹綋妫�锛堟暟鍊间笉鍚堢悊锛夈��鍏� {{ missDialogCheck.length }} 鏉�</div>
+              <ul class="miss-list"><li v-for="(t, i) in missDialogCheck" :key="'c' + i">{{ t }}</li></ul>
+            </template>
+            <p class="miss-tip">缂烘暟澶氫负婧愭暟鎹皻鏈鍏ワ紝瀵煎叆鍚庨噸鏂扮敓鎴愬嵆鍙紱浣撴椤硅鏍稿婧愭枃浠躲��</p>
+          </div>
+          <span slot="footer">
+            <el-button size="small" @click="missDialogVisible = false">鍙栨秷</el-button>
+            <el-button size="small" type="primary" @click="confirmMissDialog">浠嶈鐢熸垚</el-button>
           </span>
         </el-dialog>
       </el-main>
@@ -222,6 +247,12 @@
       taskFileName: '',
       taskFileSize: 0,
       taskKey: 'summaryWorkbook',
+      // 瀵煎嚭鍓嶇己鏁版竻鍗曞脊绐楋紙2026-10-12锛夛細缂烘暟/浣撴鎽嗗埌鍙伴潰涓婏紝纭鍚庡啀鐢熸垚
+      missDialogVisible: false,
+      missDialogPeriod: '',
+      missDialogMissing: [],
+      missDialogCheck: [],
+      missDialogRefresh: false,
       modules: [
         {
           key: 'summary', title: '姹囨�诲ぇ琛�', items: [
@@ -620,6 +651,28 @@
         })
         .catch(err => this.failWith(err))
     },
+    // 瀵煎嚭鍓嶇己鏁版鏌ワ細璋冨彧璇绘帴鍙f妸缂烘暟/浣撴缁撴灉鎽嗗埌鐢ㄦ埛闈㈠墠锛岀‘璁ゅ悗鍐嶈蛋寮傛鐢熸垚浠诲姟
+    generateSummaryWorkbook(refresh) {
+      if (!this.period) { this.$message.warning('璇峰厛閫夋嫨鍛ㄦ湡鍜屾湀浠�'); return }
+      const params = { period: this.period }
+      Promise.all([
+        api.get('/report/summaryWorkbook/missing', { params, timeout: 60000 }).catch(() => null),
+        api.get('/report/summaryWorkbook/freightCheck', { params, timeout: 60000 }).catch(() => null)
+      ]).then(res => {
+        const miss = (res[0] && res[0].code === 200 && res[0].data) || []
+        const chk = (res[1] && res[1].code === 200 && res[1].data) || []
+        if (!miss.length && !chk.length) { this.startSummaryTask(refresh); return }
+        this.missDialogPeriod = this.period
+        this.missDialogMissing = miss
+        this.missDialogCheck = chk
+        this.missDialogRefresh = refresh
+        this.missDialogVisible = true
+      })
+    },
+    confirmMissDialog() {
+      this.missDialogVisible = false
+      this.startSummaryTask(this.missDialogRefresh)
+    },
     restartTask() { this.startSummaryTask(true) },
     closeTask() { this.taskVisible = false; this.stopTaskPolling(); this.loading = '' },
     // 鐢熸垚涓敹璧峰脊绐楋細浠诲姟缁х画鍦ㄥ悗鍙版墽琛岋紝瀹屾垚鍚庝粛浼氳嚜鍔ㄤ笅杞斤紙涓庡師鏉ュ悓姝ュ鍑虹殑銆岀偣瀹屽嵆涓嬭浇銆嶄竴鑷达級
@@ -637,7 +690,7 @@
       const doExport = () => {
         if (items.length === 1) {
           // 姹囨�诲ぇ琛ㄧ敓鎴愪竴娆$害 10~20 绉掞紝璧板紓姝ヤ换鍔★紙杩涘害寮圭獥锛夛紝閬垮厤鐐瑰嚮鍚庨暱鏃堕棿鏃犲搷搴�
-          if (items[0].key === 'summaryWorkbook') { this.startSummaryTask(false); return }
+          if (items[0].key === 'summaryWorkbook') { this.generateSummaryWorkbook(false); return }
           api.get('/report/export/' + items[0].key, { params, responseType: 'blob', timeout: 120000 })
             .then(res => { this.downloadBlob(res, this.fileNameOf(items[0])); this.$message.success('鎶ヨ〃瀵煎嚭鎴愬姛'); this.loading = '' })
             .catch(err => this.failWith(err))
@@ -788,6 +841,13 @@
 .task-meta { margin: 2px 0; font-size: 12px; color:#909399; line-height: 1.6; }
 .task-error { margin: 8px 0 0; font-size: 13px; color:#F56C6C; word-break: break-all; }
 .task-done { margin: 8px 0 0; font-size: 13px; color:#67C23A; line-height: 1.6; }
+/* 瀵煎嚭鍓嶇己鏁版竻鍗曞脊绐� */
+.miss-body { max-height: 62vh; overflow-y: auto; }
+.miss-lead { font-size: 13px; color: #303133; margin: 0 0 10px; line-height: 1.7; }
+.miss-sec { font-size: 13px; font-weight: 600; color: #F56C6C; margin: 10px 0 4px; }
+.miss-list { margin: 0; padding-left: 20px; font-size: 13px; color: #303133; line-height: 1.7; }
+.miss-list li { margin: 2px 0; }
+.miss-tip { font-size: 12px; color: #909399; margin: 10px 0 0; }
 </style>
 
 <style>

--
Gitblit v1.9.1