From 07363a43743da809249dc20025a0462d949cf7e6 Mon Sep 17 00:00:00 2001
From: 张含笑 <zhx18749296735@163.com>
Date: Fri, 21 Nov 2025 15:06:00 +0800
Subject: [PATCH] feat:动态tab
---
src/views/tickets/ticket.vue | 105 ++++++++++++++++++++++++++++++++--------------------
1 files changed, 65 insertions(+), 40 deletions(-)
diff --git a/src/views/tickets/ticket.vue b/src/views/tickets/ticket.vue
index 7432210..747e7d3 100644
--- a/src/views/tickets/ticket.vue
+++ b/src/views/tickets/ticket.vue
@@ -4,7 +4,7 @@
<el-tab-pane
v-for="tab in filteredTabs"
:key="tab.name"
- :label="`${tab.label} (${tab.count})`"
+ :label="tab.name === 'myTickets' ? tab.label : `${tab.label} (${tab.count})`"
:name="tab.name"
>
<basic-main-content>
@@ -146,8 +146,7 @@
class="ztzf-public-general-el-table custom-header"
ref="elTable"
:data="tableData"
- v-loading="loading"
-
+ v-loading="loading"
@selection-change="handleSelectionChange"
border
style="width: 100%"
@@ -160,10 +159,8 @@
<el-tooltip-copy :content="row.orderNumber" :showCopyText="true" textAlign="left">
{{ row.orderNumber }}
</el-tooltip-copy>
-
</template>
</el-table-column>
-
<el-table-column prop="orderName" label="工单名称" width="150" show-overflow-tooltip>
<template #default="{ row }">
<el-tooltip-copy :content="row.orderName" :showCopyText="true" textAlign="left">
@@ -393,7 +390,6 @@
:recheck-data="reCheckData"
@recheck-success="handleRecheckSuccess"
/>
-
</basic-container>
</template>
@@ -562,33 +558,39 @@
const checkedKeys = ref([])
const inputMapShowDefaultCenter = ref(null)
const userInfo = computed(() => store.state.user.userInfo)
-console.log('userInfo',userInfo);
-const permission = computed(() => store.state.user.permission);
+const permission = computed(() => store.state.user.permission);
+// console.log('userInfo',permission.value);
// 计算属性
const firstRowData = computed(() => {
return tableData.value.length > 0 ? tableData.value[0] : null
})
// 动态过滤tabs,保证isShow为true/false
const filteredTabs = computed(() => {
- const tabStatus = permission.value?.tickets_tab_status === true
- const tabPending = permission.value?.tickets_tab_pending === true
- const tabMyTickets = permission.value?.tickets_tab_mytickets === true
-
+ const tabStatus = permission.value?.tickets_tab_status === true
+ const tabPending = permission.value?.tickets_tab_pending === true//待审核
+ const tabMyTickets = permission.value?.tickets_tab_mytickets === true //我的工单
+ const tabALL = permission.value?.tickets_allWorkOrders === true //全部工单
+ const tabInProgress= permission.value?.tickets_inProgress === true //处理中
+ const tabProcessing= permission.value?.tickets_pending === true //待处理
+ const tabCompleted= permission.value?.tickets_wasDone === true //已完成
return tabs.value
- .map(tab => {
- if (tab.name === 'all') {
- return { ...tab, isShow: true }
+ .map(tab => {
+ switch (tab.name) {
+ case 'all':
+ return { ...tab, isShow: tabALL } // 全部工单
+ case 'pending':
+ return { ...tab, isShow: tabPending } // 待审核
+ case 'myTickets':
+ return { ...tab, isShow: tabMyTickets } // 我的工单
+ case 'processing':
+ return { ...tab, isShow: tabProcessing } // 待处理
+ case 'inProgress':
+ return { ...tab, isShow: tabInProgress } // 处理中
+ case 'completed':
+ return { ...tab, isShow: tabCompleted } // 已完成
+ default:
+ return { ...tab, isShow: false } // 其他标签默认隐藏
}
- if (tab.name === 'pending') {
- return { ...tab, isShow: tabPending }
- }
- if (['processing', 'inProgress', 'completed', 'closed'].includes(tab.name)) {
- return { ...tab, isShow: tabStatus }
- }
- if (tab.name === 'myTickets') {
- return { ...tab, isShow: tabMyTickets }
- }
- return { ...tab, isShow: false }
})
.filter(tab => tab.isShow)
})
@@ -601,6 +603,31 @@
reviewBtn: validData(permission.value.tickets_review, false),
}
})
+// 计算默认激活的标签(无全部工单时优先激活待审核)
+const defaultActiveTab = computed(() => {
+ const hasAllTab = filteredTabs.value.some(tab => tab.name === 'all')
+ const hasPendingTab = filteredTabs.value.some(tab => tab.name === 'pending')
+
+ // 如果没有全部工单权限,但有待审核权限,则默认显示待审核
+ if (!hasAllTab && hasPendingTab) {
+ return 'pending'
+ }
+ // 如果有全部工单权限,则默认显示全部工单
+ else if (hasAllTab) {
+ return 'all'
+ }
+ // 否则显示第一个可用的tab
+ else {
+ return filteredTabs.value[0]?.name || 'all'
+ }
+})
+// 提取状态列表计算属性
+const statusList = computed(() => {
+ const visibleTabs = filteredTabs.value;
+ return visibleTabs
+ .filter(tab => tab.name !== 'all' && tab.name !== 'myTickets' && tab.value !== undefined)
+ .map(tab => String(tab.value));
+});
const stepStatusList = computed(() => {
// “我发起的工单”tab用默认流程,其它tab用接口返回的stepInfos
if (activeTab.value === 'myTickets') {
@@ -623,11 +650,6 @@
}))
})
// 方法
-function regExp(label, name) {
- const reg = new RegExp(label + '=([^&]*)(&|$)', 'g')
- return name.match(reg)[0].split('=')[1]
-}
-
function validData(value, defaultValue) {
return value !== undefined ? value : defaultValue
}
@@ -782,6 +804,7 @@
if (isFetching.value) return
isFetching.value = true
loading.value = true
+ const statusListVal = statusList.value;
try {
const currentTab = tabs.value.find(tab => tab.name === activeTab.value)
const params = {
@@ -806,6 +829,7 @@
user_id: currentTab?.name === 'myTickets' ? userInfo.value.user_id : undefined,
is_review: filters.isReview === '' ? undefined : filters.isReview,
source: 1,
+ status_list: statusListVal
}
const response = await getList(params)
@@ -891,7 +915,7 @@
function mapStatus(status) {
const statusTextMap = {
- '-1': '草稿',
+
2: '待审核',
0: '待处理',
3: '处理中',
@@ -911,16 +935,16 @@
return colorMap[String(status)] || ''
}
-async function fetchTabCounts(val) {
+async function fetchTabCounts() {
+ const statusListVal = statusList.value;
const params = {
- status_list: val
+ status_list: statusListVal
}
try {
const response = await getstatusCount(params)
- const statusCount = response.data.data || {}
-
- const totalCount = Object.values(statusCount).reduce((sum, count) => sum + (count || 0), 0)
-
+ const statusCount = response.data.data || {}
+ console.log('数据',statusCount);
+ const totalCount = Object.values(statusCount).reduce((sum, count) => sum + (count || 0), 0)
tabs.value.forEach(tab => {
if (tab.name === 'all') {
tab.count = totalCount
@@ -940,8 +964,8 @@
function handleTabChange(tab) {
activeTab.value = tab.props?.name || tab.name
- const statusList = ['0', '2', '3', '4']
- fetchTabCounts(statusList)
+
+ fetchTabCounts()
handleReset()
page.currentPage = 1
fetchTableData()
@@ -1446,7 +1470,8 @@
inputMapShowDefaultCenter.value = null
loadAMapScripts()
fetchDropdownData()
-
+ // 设置默认activeTab
+ activeTab.value = defaultActiveTab.value
const href = window.location.href;
if (route?.query?.status !== undefined && route?.query?.status !== null) {
filters.status = route?.query?.status + ''
--
Gitblit v1.9.3