修复导航:校准驾驶舱业务提醒钻取路由

This commit is contained in:
wangzhibiao committed 2026-09-21 00:14:44 +08:00
1 parent 4e793b3bb3
commit 3966ffed50
1 file changed
+87 -26
@@ -109,35 +109,21 @@
<el-card shadow="never" class="status-card">
<div slot="header" class="card-header">
<span><i class="el-icon-warning-outline" style="color: #E6A23C; margin-right: 6px;"></i>业务运行待办与治理提醒</span>
<span class="tip-text">点击可直接跳转业务处理</span>
<span class="tip-text">{{ hasAnyClickableReminder ? '点击具备权限的卡片可直接跳转业务处理' : '业务客观运行指标提示' }}</span>
</div>
<div class="alert-grid" v-loading="loadingOverview">
<div class="alert-item clickable" @click="goTo('/analysis/attendance')">
<div class="alert-icon bg-danger"><i class="el-icon-time" /></div>
<div
v-for="item in reminders"
:key="item.key"
:class="['alert-item', { 'clickable': item.clickable, 'non-clickable': !item.clickable }]"
:title="item.clickable ? `点击前往【${item.label}】处理页面` : '当前角色仅支持查看指标数据'"
@click="handleReminderClick(item)"
>
<div :class="['alert-icon', item.iconBg]"><i :class="item.icon" /></div>
<div class="alert-content">
<div class="alert-num text-danger">{{ overview.abnormalAttendanceCount || 0 }}</div>
<div class="alert-title">异常考勤人次</div>
</div>
</div>
<div class="alert-item clickable" @click="goTo('/train/report')">
<div class="alert-icon bg-warning"><i class="el-icon-document-checked" /></div>
<div class="alert-content">
<div class="alert-num text-warning">{{ overview.pendingReportCount || 0 }}</div>
<div class="alert-title">待报到参训学员</div>
</div>
</div>
<div class="alert-item clickable" @click="goTo('/train/accommodation')">
<div class="alert-icon bg-primary"><i class="el-icon-office-building" /></div>
<div class="alert-content">
<div class="alert-num text-primary">{{ overview.preallocatedAccommodationCount || 0 }}</div>
<div class="alert-title">住宿预分配待入住</div>
</div>
</div>
<div class="alert-item clickable" @click="goTo('/train/extra')">
<div class="alert-icon bg-danger"><i class="el-icon-key" /></div>
<div class="alert-content">
<div class="alert-num text-danger">{{ overview.abnormalAuthCount || 0 }}</div>
<div class="alert-title">门禁授权异常数</div>
<div :class="['alert-num', item.numClass]">{{ item.count }}</div>
<div class="alert-title">{{ item.label }}</div>
<div v-if="item.clickable" class="action-hint">去处理 <i class="el-icon-arrow-right" /></div>
</div>
</div>
</div>
@@ -237,6 +223,67 @@ export default {
computed: {
planStatus() {
return this.overview.planStatusCounts || {}
},
reminders() {
const o = this.overview || {}
const items = [
{
key: 'attendance',
label: '异常考勤人次',
count: o.abnormalAttendanceCount || 0,
route: '/analysis/attendance',
permission: 'train:analysis:attendance',
icon: 'el-icon-time',
iconBg: 'bg-danger',
numClass: 'text-danger'
},
{
key: 'report',
label: '待报到参训学员',
count: o.pendingReportCount || 0,
route: '/analysis/report',
permission: 'train:report:list',
icon: 'el-icon-document-checked',
iconBg: 'bg-warning',
numClass: 'text-warning'
},
{
key: 'accommodation',
label: '住宿预分配待入住',
count: o.preallocatedAccommodationCount || 0,
route: '/equip/accommodation',
permission: 'train:accommodation:list',
icon: 'el-icon-office-building',
iconBg: 'bg-primary',
numClass: 'text-primary'
},
{
key: 'auth',
label: '门禁授权异常数',
count: o.abnormalAuthCount || 0,
route: '/equip/extra',
permission: null,
icon: 'el-icon-key',
iconBg: 'bg-danger',
numClass: 'text-danger'
}
]
return items.map(item => {
let clickable = false
if (item.key === 'auth') {
// 门禁授权异常跳 /equip/extra(设备物联页面),系统管理员与培训管理员均在角色菜单中配置了该路由
clickable = this.$auth.hasRoleOr(['admin', 'train_admin'])
} else if (item.permission) {
clickable = this.$auth.hasPermi(item.permission)
}
return {
...item,
clickable
}
})
},
hasAnyClickableReminder() {
return this.reminders.some(r => r.clickable)
}
},
created() {
@@ -466,6 +513,11 @@ export default {
if (this.statusChartInstance) { this.statusChartInstance.dispose(); this.statusChartInstance = null }
if (this.venueChartInstance) { this.venueChartInstance.dispose(); this.venueChartInstance = null }
},
handleReminderClick(item) {
if (item && item.clickable && item.route) {
this.$router.push(item.route)
}
},
goTo(path) {
if (path) this.$router.push(path)
}
@@ -597,6 +649,10 @@ export default {
background: #f0f7ff;
border-color: #b3d8ff;
}
&.non-clickable {
cursor: default;
opacity: 0.9;
}
.alert-icon {
width: 36px;
height: 36px;
@@ -620,6 +676,11 @@ export default {
font-size: 12px;
color: #909399;
}
.action-hint {
font-size: 11px;
color: #409EFF;
margin-top: 2px;
}
}
}
}