From 9555b01c999d2846c9efcd591c545b4a6eae9cb1 Mon Sep 17 00:00:00 2001
From: zhizhijie <zhizhijie@users.noreply.gitee.com>
Date: 星期日, 13 九月 2026 13:28:19 +0800
Subject: [PATCH] docs: 工作日结补充网约车8月订单数来源查证(import_batch #317 临时副本)及临时副本删除记录
---
traffic-audit-web/src/views/ReportExport.vue | 127 ++++++++++++++++++++++++++++++++++++-----
1 files changed, 110 insertions(+), 17 deletions(-)
diff --git a/traffic-audit-web/src/views/ReportExport.vue b/traffic-audit-web/src/views/ReportExport.vue
index 2530d22..54f5513 100644
--- a/traffic-audit-web/src/views/ReportExport.vue
+++ b/traffic-audit-web/src/views/ReportExport.vue
@@ -3,7 +3,7 @@
<app-header title="浜ら�氱粺璁℃姤琛ㄥ鏍哥郴缁� - 鎶ヨ〃鐢熸垚"></app-header>
<el-container>
<el-aside width="200px">
- <el-menu router :default-active="activeMenu">
+ <el-menu ref="sideMenu" router :default-active="$route.path" @select="onMenuSelect">
<el-menu-item index="/dashboard">宸ヤ綔鍙�</el-menu-item>
<el-menu-item index="/import">鏁版嵁瀵煎叆</el-menu-item>
<el-menu-item index="/data">鏁版嵁鏌ョ湅</el-menu-item>
@@ -25,12 +25,12 @@
</div>
</div>
- <!-- 绗簩琛岋細鎶ヨ〃绫诲瀷 Tab锛堣揣杩� / 鏃呭 / 鎶曡祫 / 鑳借�� / 鍩庡競瀹㈣繍锛� -->
- <el-tabs v-model="activeKey" class="module-tabs">
- <el-tab-pane v-for="m in modules" :key="m.key" :name="m.key">
- <span slot="label">{{ m.title }}<el-tag v-if="m.tag" size="mini" :type="m.tagType || 'info'" style="margin-left:6px">{{ m.tag }}</el-tag></span>
- </el-tab-pane>
- </el-tabs>
+ <!-- 绗簩琛岋細鎶ヨ〃绫诲瀷鍒囨崲锛堣揣杩� / 鏃呭 / 鎶曡祫 / 鑳借�� / 鍩庡競瀹㈣繍锛夛紱el-radio-group 鏇夸唬 el-tabs锛岃閬� el-tabs 甯冨眬鏃犻檺寰幆锛堜笌 /import 淇涓�鑷达級 -->
+ <el-radio-group v-model="activeKey" class="module-tabs">
+ <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>
<!-- 绗笁琛岋細鏌ヨ鏉′欢鍖猴紙鍛ㄦ湡 + 鏈堜唤 + 鏌ヨ锛� -->
<section class="query-panel">
@@ -112,11 +112,30 @@
<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.name }}</td>
+ <td>{{ s.label }}</td>
<td><span v-if="s.value === null || s.value === ''" class="cell-empty">锛堢┖锛�</span>{{ fmtVal(s.value) }}</td>
+ <td style="white-space:nowrap;color:#909399">{{ s.unit || '' }}</td>
</tr>
</tbody>
</table>
@@ -154,7 +173,6 @@
data() {
return {
loading: '',
- activeMenu: '/report',
activeKey: '',
updatedAt: '',
// 鏌ヨ鏉′欢锛歝ycle 鍛ㄦ湡锛坢onth 鏈堟姤 / quarter 瀛f姤 / year 骞存姤锛夛紝period 鎶ヨ〃鏈燂紙鏈堜唤 yyyy-MM 鎴栧勾浠� yyyy锛�
@@ -171,27 +189,33 @@
noteDraft: '',
modules: [
{
- key: 'freight', title: '璐ц繍鎶ヨ〃', items: [
+ key: 'summary', title: '姹囨�诲ぇ琛�', items: [
+ { key: 'summaryWorkbook', label: '閬撹矾杩愯緭閲忔眹鎬昏〃锛堟暣鏈級', fileName: '鐢熸垚_閬撹矾杩愯緭閲忔眹鎬昏〃.xlsx', status: null, statusNote: '' }
+ ], checked: []
+ },
+ {
+ 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: '鍩庡競瀹㈣繍鎶ヨ〃', tag: '鍏氦/鍑虹/杞ㄩ亾杞浮/姹囨��', tagType: 'success', 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: '' },
{ key: 'cityPassengerCitySum', label: '鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱', fileName: '鐢熸垚_鍩庡競瀹㈣繍瀹㈣繍閲忓垎甯傚窞绱.xlsx', status: null, statusNote: '' },
{ key: 'cityPassengerDetailSum', label: '鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃', fileName: '鐢熸垚_鍩庡競瀹㈣繍鍚勫競宸炴槑缁嗚〃.xlsx', status: null, statusNote: '' },
- { key: 'cityPassengerSummary', label: '鍩庡競瀹㈣繍姹囨��', fileName: '鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx', status: null, statusNote: '' }
+ { key: 'cityPassengerSummary', label: '鍩庡競瀹㈣繍姹囨��', fileName: '鐢熸垚_鍩庡競瀹㈣繍姹囨��.xlsx', status: null, statusNote: '' },
+ { key: 'wycSplit', label: '缃戠害杞﹀杩愰噺鎷嗗垎琛�', fileName: '鐢熸垚_缃戠害杞﹀杩愰噺鎷嗗垎琛�.xlsx', status: null, statusNote: '' }
], checked: []
},
{
@@ -218,6 +242,9 @@
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]
},
@@ -236,7 +263,7 @@
// 鎶ヨ〃鏈熶笅鎷夊垎缁勶細骞存姤鎸夊勾浠斤紱鏈堟姤/瀛f姤鎸夊勾鍒嗙粍鍒� 1-12 鏈堬紙鑳借�楀彧鍒楀搴︽湯鏈堬級
periodGroups() {
const year = new Date().getFullYear()
- const years = [year - 1, year, year + 1]
+ const years = [year, year - 1, year + 1]
if (this.cycle === 'year') {
return [{ label: '閫夋嫨骞翠唤', options: years.map(y => ({ label: y + '骞�', value: String(y) })) }]
}
@@ -254,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: {
@@ -371,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 '鏃犳暟鎹�'
@@ -485,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