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/AuditResult.vue | 116 ++++++++++++++++++++++++++++++++++++++-------------------
1 files changed, 77 insertions(+), 39 deletions(-)
diff --git a/traffic-audit-web/src/views/AuditResult.vue b/traffic-audit-web/src/views/AuditResult.vue
index 7c510d5..7db2d4f 100644
--- a/traffic-audit-web/src/views/AuditResult.vue
+++ b/traffic-audit-web/src/views/AuditResult.vue
@@ -50,13 +50,29 @@
<div class="sev-card sev-pending"><b>{{ severityStats.pending }}</b> 寰呭鐞�</div>
<div class="sev-card sev-done"><b>{{ severityStats.done }}</b> 宸插鐞�</div>
</div>
- <el-form v-if="!focusMode" :inline="true" style="margin-top:8px;flex:none">
+ <div v-if="!focusMode" class="audit-filter-bar">
+ <el-form :inline="true">
+ <el-form-item label="绛涢��"></el-form-item>
<el-form-item label="浼佷笟鍚嶇О">
<el-input v-model="enterpriseFilter" placeholder="杈撳叆浼佷笟鍚嶇О鍏抽敭瀛�" clearable style="width:200px" @keyup.enter.native="queryResults"></el-input>
</el-form-item>
<el-form-item label="瀹℃牳瑙勫垯">
<el-select v-model="ruleFilter" placeholder="鍏ㄩ儴瑙勫垯" clearable style="width:180px">
<el-option v-for="rn in ruleOptions" :key="rn" :label="rn" :value="rn"></el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="闂鑼冨洿">
+ <el-radio-group v-model="issueScope" size="small" @change="updateBatchSelection">
+ <el-radio-button label="verify">浠呴渶鏍稿疄</el-radio-button>
+ <el-radio-button label="all">鍚彁閱掑瀷</el-radio-button>
+ </el-radio-group>
+ <span class="hint">鎻愰啋鍨嬩粎鎻愮ず鍙樺寲銆佷笉闇�澶勭悊锛屽鍑洪粯璁や笉鍚�</span>
+ </el-form-item>
+ <el-form-item label="鐘舵��">
+ <el-select v-model="statusScope" style="width:110px" @change="updateBatchSelection">
+ <el-option label="鍏ㄩ儴" value="all"></el-option>
+ <el-option label="寰呭鐞�" value="pending"></el-option>
+ <el-option label="宸插鐞�" value="handled"></el-option>
</el-select>
</el-form-item>
<el-form-item label="瑙嗗浘">
@@ -74,9 +90,11 @@
<el-button size="small" plain @click="statsCollapsed = !statsCollapsed">{{ statsCollapsed ? '灞曞紑' : '鏀惰捣' }}瑙勫垯缁熻</el-button>
</el-form-item>
<el-form-item>
- <span style="color:#909399;font-size:12px">鍏� {{ results.length }} 鏉¢棶棰橈紝{{ mergedResults.length }} 瀹朵紒涓�</span>
+ <span style="color:#303133;font-size:13px;font-weight:600">褰撳墠绛涢�� {{ filteredResults.length }} 鏉� / {{ mergedResults.length }} 瀹朵紒涓�</span>
+ <span style="color:#909399;font-size:12px;margin-left:8px">锛堝叡 {{ results.length }} 鏉¢棶棰橈級</span>
</el-form-item>
</el-form>
+ </div>
<div v-if="ruleStats.length && !statsCollapsed && !focusMode" class="rule-stats" style="flex:none">
<div class="stats-cards">
<div v-for="rs in sortedRuleStats" :key="rs.ruleId" class="stat-card"
@@ -98,45 +116,52 @@
鍏� {{ results.length }} 鏉¢棶棰橈紝{{ mergedResults.length }} 瀹朵紒涓�
</div>
<div class="table-area" style="flex:1;min-height:0">
- <!-- 鏄庣粏瑙嗗浘锛氫竴鏉¢棶棰樹竴寮犲崱鐗� -->
+ <!-- 鏄庣粏瑙嗗浘锛氫竴鏉¢棶棰樹竴琛岋紙涓庡鍑烘ā鏉� Sheet鈥滃鏍哥粨鏋溾�濆悓娆撅級 -->
<div v-if="viewMode === 'detail'" class="detail-cards-wrap" v-loading="loading">
<div class="detail-toolbar">
<el-checkbox :value="allSelected" :indeterminate="someSelected" @change="toggleSelectAll">鍏ㄩ�夊綋鍓� {{ filteredResults.length }} 鏉�</el-checkbox>
<span class="toolbar-tip">鍕鹃�夊悗鍙壒閲忕‘璁� / 蹇界暐</span>
</div>
- <div v-for="row in filteredResults" :key="row.id" class="detail-card"
- :class="{ 'card-red': row.alertLevel === 'RED', 'card-yellow': row.alertLevel === 'YELLOW', 'card-done': row.status !== 'PENDING' }">
- <div class="card-head">
- <el-checkbox v-model="row._selected" @change="updateBatchSelection"></el-checkbox>
- <div class="card-ent">
- <div class="ent-name">{{ row.enterpriseName || row.city || '鏈煡浼佷笟' }}</div>
- <div class="ent-sub">{{ row.reportPeriod }}</div>
- </div>
- <el-tag :type="row.alertLevel === 'RED' ? 'danger' : 'warning'" size="small" effect="dark">{{ row.alertLevel }}</el-tag>
- <el-tag :type="statusType(row.status)" size="small" effect="plain" class="status-tag">
- <i :class="statusIcon(row.status)"></i> {{ statusText(row.status) }}
- </el-tag>
- <span class="spacer"></span>
- <el-link v-if="dataType(reportType)" type="primary" :underline="false" size="mini" @click="openMonthReport(row)">鏁版嵁</el-link>
- <el-button v-if="row.status === 'PENDING'" size="mini" type="success" icon="el-icon-check" round @click="review(row, 'CONFIRMED')">纭</el-button>
- <el-button v-if="row.status === 'PENDING'" size="mini" type="info" icon="el-icon-close" round plain @click="review(row, 'IGNORED')">蹇界暐</el-button>
- <span v-else class="done-text">宸插鐞�</span>
+ <el-table :data="filteredResults" border stripe height="100%"
+ :header-cell-style="{ background: '#F5F7FA', color: '#303133', fontWeight: 600 }">
+ <el-table-column width="40">
+ <template slot-scope="{ row }">
+ <el-checkbox v-model="row._selected" @change="updateBatchSelection"></el-checkbox>
+ </template>
+ </el-table-column>
+ <el-table-column prop="reportPeriod" label="鎶ヨ〃鏈�" width="90"></el-table-column>
+ <el-table-column label="浼佷笟/甯傚窞" min-width="200" show-overflow-tooltip>
+ <template slot-scope="{ row }">{{ row.enterpriseName || row.city || '鏈煡浼佷笟' }}</template>
+ </el-table-column>
+ <el-table-column prop="ruleCode" label="瑙勫垯缂栫爜" width="100"></el-table-column>
+ <el-table-column prop="ruleName" label="瀹℃牳瑙勫垯" min-width="150" show-overflow-tooltip></el-table-column>
+ <el-table-column label="绛夌骇" width="76">
+ <template slot-scope="{ row }">
+ <el-tag :type="row.alertLevel === 'RED' ? 'danger' : 'warning'" size="mini">{{ row.alertLevel }}</el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column prop="actualValue" label="瀹為檯鍊�" min-width="230" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="thresholdValue" label="闃堝��/鍩哄噯" min-width="140" show-overflow-tooltip></el-table-column>
+ <el-table-column prop="deviation" label="鍋忓樊璇存槑" min-width="170" show-overflow-tooltip></el-table-column>
+ <el-table-column label="鐘舵��" width="92">
+ <template slot-scope="{ row }">
+ <el-tag :type="statusType(row.status)" size="mini">
+ <i :class="statusIcon(row.status)"></i> {{ statusText(row.status) }}
+ </el-tag>
+ </template>
+ </el-table-column>
+ <el-table-column label="鎿嶄綔" width="185" align="right">
+ <template slot-scope="{ row }">
+ <el-link v-if="dataType(reportType)" type="primary" :underline="false" size="mini" @click="openMonthReport(row)">鏁版嵁</el-link>
+ <el-button v-if="row.status === 'PENDING'" size="mini" type="success" icon="el-icon-check" round @click="review(row, 'CONFIRMED')">纭</el-button>
+ <el-button v-if="row.status === 'PENDING'" size="mini" type="info" icon="el-icon-close" round plain @click="review(row, 'IGNORED')">蹇界暐</el-button>
+ <span v-else class="done-text">宸插鐞�</span>
+ </template>
+ </el-table-column>
+ <div slot="empty">
+ <el-empty description="褰撳墠绛涢�夋潯浠朵笅娌℃湁闂鏁版嵁"></el-empty>
</div>
- <div class="card-body">
- <div class="rule-title">
- <b>{{ row.ruleName }}</b>
- <span class="rule-code">{{ row.ruleCode }}</span>
- </div>
- <div class="card-details">
- <div class="detail-line"><span class="dt-label">瀹為檯</span><span class="dt-val">{{ row.actualValue }}</span></div>
- <div class="detail-line"><span class="dt-label">鍩哄噯</span><span class="dt-val">{{ row.thresholdValue }}</span></div>
- <div class="detail-line"><span class="dt-label">宸紓</span><span class="dt-val dt-warn">{{ row.deviation }}</span></div>
- </div>
- </div>
- </div>
- <div v-if="!filteredResults.length" class="empty-tip">
- <el-empty description="褰撳墠绛涢�夋潯浠朵笅娌℃湁闂鏁版嵁"></el-empty>
- </div>
+ </el-table>
</div>
<!-- 鍚堝苟瑙嗗浘 -->
<el-table v-else :data="mergedResults" border stripe v-loading="loading" height="100%"
@@ -334,7 +359,7 @@
data() {
return {
period: '', reportType: 'H2032', loading: false, marking: false, results: [], ruleStats: [], statsCollapsed: false,
- enterpriseFilter: '', ruleFilter: '', viewMode: 'merged', batchSelection: [], focusMode: false,
+ enterpriseFilter: '', ruleFilter: '', viewMode: 'merged', issueScope: 'verify', statusScope: 'all', batchSelection: [], focusMode: false,
explainDrafts: {}, savingExplainId: null, expandedExplain: null,
monthVisible: false, monthLoading: false, monthType: '', monthPeriod: '', monthKeyword: '', monthRecords: [], monthColumns: []
}
@@ -347,7 +372,7 @@
},
severityStats() {
const s = { red: 0, yellow: 0, pending: 0, done: 0 }
- this.results.forEach(r => {
+ this.filteredResults.forEach(r => {
if (r.alertLevel === 'RED') s.red++
else if (r.alertLevel === 'YELLOW') s.yellow++
if (r.status === 'PENDING') s.pending++
@@ -367,10 +392,14 @@
filteredResults() {
const kw = (this.enterpriseFilter || '').trim()
const rule = this.ruleFilter
- if (!kw && !rule) return this.results
+ const scope = this.issueScope || 'verify'
+ const st = this.statusScope || 'all'
return this.results.filter(r => {
if (kw && !(r.enterpriseName || '').includes(kw)) return false
if (rule && r.ruleName !== rule) return false
+ if (scope === 'verify' && this.isReminderRow(r)) return false
+ if (st === 'pending' && r.status !== 'PENDING') return false
+ if (st === 'handled' && (!r.status || r.status === 'PENDING')) return false
return true
})
},
@@ -397,6 +426,9 @@
}
},
methods: {
+ isReminderRow(r) {
+ return !!(r && r.ruleCode === 'RULE_004')
+ },
dataType(t) { return DATA_TYPE_MAP[t] || '' },
explainType(t) { return EXPLAIN_TYPES.indexOf(t) >= 0 },
openMonthReport(row) {
@@ -577,7 +609,8 @@
},
exportExcel() {
if (!this.period) { this.$message.warning('璇烽�夋嫨鎶ヨ〃鏈�'); return }
- window.open('/api/audit/export?period=' + this.period + '&reportType=' + this.reportType)
+ const q = 'period=' + this.period + '&reportType=' + this.reportType + '&onlyVerify=' + (this.issueScope !== 'all') + '&status=' + (this.statusScope || 'all')
+ window.open('/api/audit/export?' + q)
},
review(row, status) {
if (status === 'IGNORED') {
@@ -741,4 +774,9 @@
.mr-sec-tab th { background: #F5F7FA; font-weight: 600; }
.mr-note { margin: 6px 12px 12px; background: #FDF6EC; border: 1px solid #FAECD8; border-radius: 4px; padding: 8px 10px; font-size: 12px; color: #8a6d3b; white-space: pre-wrap; word-break: break-all; }
.mr-note-line { margin: 2px 0; }
+
+.audit-filter-bar { background:#FAFAFA; border:1px solid #EBEEF5; border-radius:8px; padding:2px 12px 0; margin-top:8px; flex:none; }
+.audit-filter-bar .el-form-item { margin-bottom:6px; }
+.audit-filter-bar .el-form-item__label { color:#606266; font-weight:600; }
+.hint { color:#909399; font-size:12px; margin-left:6px; white-space:nowrap; }
</style>
--
Gitblit v1.9.1