From 4e8766d35771bc71c858583b768600a2169a46c0 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期二, 22 九月 2026 10:49:11 +0800
Subject: [PATCH] feat(数据查看): 隐藏报表期/所属地区+冻结收窄为市州与企业名称、网约车按市州竖排、市州月报显示项目名称、列名补单位、数值千分位与同比按百分比显示

---
 traffic-audit-web/src/views/DataView.vue |   74 ++++++++++++++++++++++++------------
 1 files changed, 49 insertions(+), 25 deletions(-)

diff --git a/traffic-audit-web/src/views/DataView.vue b/traffic-audit-web/src/views/DataView.vue
index 91ac846..33df725 100644
--- a/traffic-audit-web/src/views/DataView.vue
+++ b/traffic-audit-web/src/views/DataView.vue
@@ -22,7 +22,7 @@
           <span class="toolbar-sep"></span>
           <span class="toolbar-label">鏁版嵁绫诲瀷</span>
           <el-select v-model="type" size="small" style="width:300px" placeholder="閫夋嫨鏁版嵁绫诲瀷" filterable
-                     :title="currentTypeLabel" @change="onTypeSelect">
+                     popper-class="data-type-select" :title="currentTypeLabel" @change="onTypeSelect">
             <el-option-group v-for="g in modules" :key="g.key" :label="g.name">
               <el-option v-for="t in g.types" :key="t.value" :label="t.label" :value="t.value"></el-option>
             </el-option-group>
@@ -37,7 +37,7 @@
             <el-table :data="records" border v-loading="loading" size="small" style="width:100%" height="100%">
               <el-table-column v-for="c in renderColumns" :key="c.prop" :prop="c.prop" :label="c.label" :min-width="c.width" :fixed="c.fixed ? 'left' : false" show-overflow-tooltip>
                 <template slot-scope="scope">
-                  <span>{{ formatCell(scope.row[c.prop]) }}</span>
+                  <span>{{ formatCell(scope.row[c.prop], c.prop) }}</span>
                 </template>
               </el-table-column>
             </el-table>
@@ -122,33 +122,29 @@
       return g
     },
     visibleColumns() {
-      const hiddenProps = ['enterpriseCode', 'unifiedCreditCode', 'reportUnit']
-      const hiddenLabels = ['浼佷笟浠g爜', '缁熶竴绀句細淇$敤浠g爜', '濉姤鍗曚綅']
-      return (this.columns || []).filter(c =>
-        hiddenProps.indexOf(c.prop) < 0 && hiddenLabels.indexOf(c.label) < 0)
+      return (this.columns || []).filter(c => this.keepColumn(c))
     },
-    // 宸︿晶鍐荤粨"杩欐槸璋佺殑鏁版嵁"鎵�闇�鍒楋細妯悜婊氬姩鏃朵紒涓氬悕绉�/甯傚窞涓嶄細璺戝嚭瑙嗛噹銆�
-    // 鍙喕缁撲粠绗� 1 鍒楀紑濮嬬殑涓�娈佃繛缁垪锛岄伩鍏嶅喕缁撳垪涔嬮棿琚櫘閫氬垪鎵撴柇銆�
+    // 宸︿晶鍐荤粨"杩欐槸璋佺殑鏁版嵁"鐨勫垪锛氬競宸�/鍦板尯 + 浼佷笟(椤圭洰)鍚嶇О/杞︾墝鍙凤紝鏈�澶� 3 鍒椼��
+    // 鎶ヨ〃鏈熶笌鎵�灞炲湴鍖轰笉鍙備笌鍐荤粨锛堟姤琛ㄦ湡鏄瓫閫夋潯浠讹紝鎵�灞炲湴鍖烘槸鍖哄垝浠g爜锛屽凡鐢卞競宸炲垪鏇夸唬锛夈��
     renderColumns() {
-      const stickyProps = ['reportPeriod', 'regionCode', 'city', 'regionName', 'periodType',
-        'enterpriseName', 'projectName', 'plateNo']
-      const nameProps = ['enterpriseName', 'projectName', 'plateNo']
+      const stickyProps = ['city', 'regionName', 'region', 'periodType', 'enterpriseName', 'projectName', 'plateNo']
       const cols = this.visibleColumns
-      let limit = -1
-      for (let i = 0; i < cols.length && i < 6; i++) {
-        if (nameProps.indexOf(cols[i].prop) >= 0) { limit = Math.min(i, 3); break }
+      let count = 0
+      while (count < cols.length && count < 3 && stickyProps.indexOf(cols[count].prop) >= 0) {
+        count++
       }
-      if (limit < 0) {
-        // 琛ㄩ噷娌℃湁鍚嶇О鍒楋紙濡傝揣杩愰噺鍛ㄨ浆閲忥級鏃讹紝鍐荤粨寮�澶寸殑杩炵画鏍囪瘑鍒�
-        limit = 0
-        while (limit + 1 < cols.length && limit < 2 && stickyProps.indexOf(cols[limit + 1].prop) >= 0) {
-          limit++
-        }
-      }
-      return cols.map((c, i) => Object.assign({}, c, { fixed: i <= limit && stickyProps.indexOf(c.prop) >= 0 }))
+      return cols.map((c, i) => Object.assign({}, c, { fixed: i < count }))
     }
   },
   methods: {
+    // 鏁版嵁鏌ョ湅缁熶竴鍒楄繃婊わ細鍐呴儴鏍囪瘑鍒椾笉灞曠ず锛涙姤琛ㄦ湡锛堢敱绛涢�夋潯浠朵綋鐜帮級涓庢墍灞炲湴鍖猴紙鍖哄垝浠g爜锛屽凡琚競宸炲垪鏇夸唬锛変笉灞曠ず
+    keepColumn(c) {
+      if (!c) return false
+      const hiddenProps = ['enterpriseCode', 'unifiedCreditCode', 'reportUnit', 'projectId', 'regionCode', 'reportPeriod']
+      const hiddenLabels = ['浼佷笟浠g爜', '缁熶竴绀句細淇$敤浠g爜', '濉姤鍗曚綅', '椤圭洰ID', '鎵�灞炲湴鍖�', '鎶ヨ〃鏈�']
+      if (hiddenProps.indexOf(c.prop) >= 0 || hiddenLabels.indexOf(c.label) >= 0) return false
+      return true
+    },
     onModuleChange(key) {
       const g = this.modules.find(x => x.key === key)
       if (!g || !g.types.length) return
@@ -267,9 +263,21 @@
         document.exitFullscreen()
       }
     },
-    formatCell(v) {
+    // 鏄剧ず鏍煎紡鍖栵紙涓嶆敼鍔ㄥ簳灞傛暟鎹紝瀵煎嚭浠嶄负鍏ㄧ簿搴︼級锛�
+    //  - 姣旂巼绫诲垪锛堢幆姣�/鍚屾瘮/澧為��/鍗犳瘮锛夊簱鍐呮槸灏忔暟锛�0.045 = 4.5%锛夛紝鏄剧ず涓虹櫨鍒嗘瘮锛�
+    //  - 鎺掑悕绫诲垪鏄剧ず鏁存暟锛�
+    //  - 鍏朵綑鏁板�煎崈鍒嗕綅銆佷繚鐣欎袱浣嶅皬鏁帮紱鏁存暟鍘熸牱銆�
+    formatCell(v, prop) {
       if (v === null || v === undefined || v === '') return '-'
-      return v
+      const s = typeof v === 'string' ? v.trim() : v
+      if (typeof v !== 'number' && !/^-?\d+(\.\d+)?$/.test(String(s))) return v
+      const n = Number(s)
+      if (!isFinite(n)) return v
+      const key = String(prop || '').toLowerCase()
+      if (/rank/.test(key)) return Math.round(n).toLocaleString('zh-CN')
+      if (/(rate|yoy|mom|growth|ratio|percent|share)/.test(key)) return (n * 100).toFixed(2) + '%'
+      if (Number.isInteger(n)) return n.toLocaleString('zh-CN')
+      return n.toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 })
     }
   },
   mounted() {
@@ -310,4 +318,20 @@
 #app .table-area:fullscreen { padding:20px; background:#fff; overflow:auto; }
 #app .table-wrap:fullscreen { padding:20px; background:#fff; overflow:auto; display:flex; flex-direction:column; height:100vh; }
 #app .table-wrap:fullscreen .table-area { flex:1 1 auto; min-height:0; }
-</style>
\ No newline at end of file
+</style>
+<style>
+/* 鏁版嵁绫诲瀷涓嬫媺锛欵lement UI 榛樿鎶婂垎缁勬爣棰樺仛鎴� 12px 鐏拌壊灏忓瓧锛岀湅璧锋潵"姣旈�夐」鏇村皬鏇存贰"銆�
+   杩欓噷鎶婂畠鏀规垚鏄庣‘鐨勭粍鏍囬鏍峰紡锛堝姞娣便�佸姞绮椼�佺暐澶с�佸甫搴曡壊锛夛紝涓庨�夐」褰㈡垚鏈夋剰鐨勫眰绾с�� */
+.data-type-select .el-select-group__title {
+  font-size: 13px;
+  font-weight: 700;
+  color: #303133;
+  line-height: 28px;
+  background: #F5F7FA;
+  padding-left: 12px;
+  letter-spacing: .5px;
+}
+.data-type-select .el-select-group__title::after { display: none; }
+.data-type-select .el-select-group { padding-bottom: 6px; }
+.data-type-select .el-select-group .el-select-dropdown__item { padding-left: 20px; }
+</style>

--
Gitblit v1.9.1