feat: split payment-info into standalone menu with dual tabs

Remove payment tab from protocol-audit and keep deep-link redirect.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
zlwuandCursor committed 2026-10-05 13:03:16 +08:00
1 parent 1bc44cab13
commit 32c01a4c69
5 files changed
+117 -28

No files matched your search

+11
View File
@@ -60,6 +60,17 @@ STATIC_MENU_TREE = [
"component": "/cell-storage/presign-order/index",
"meta": {"title": "预签约订单", "keepAlive": True, "menuCode": "cell-storage:presign-order:list"},
},
{
"id": "904b5173519411f1944300163e3bdd96",
"name": "CellStoragePaymentInfo",
"path": "payment-info",
"component": "/cell-storage/payment-info/index",
"meta": {
"title": "缴费信息",
"keepAlive": True,
"menuCode": "cellStorage:paymentInfo:list",
},
},
{
"id": "50000000000000000000000000000013",
"name": "CellStorageSampleInfo",
+11 -12
View File
@@ -71,6 +71,17 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
menuCode: 'cell-storage:presign-order:list'
}
},
{
id: '904b5173519411f1944300163e3bdd96',
name: 'CellStoragePaymentInfo',
path: 'payment-info',
component: '/cell-storage/payment-info/index',
meta: {
title: '缴费信息',
keepAlive: true,
menuCode: 'cellStorage:paymentInfo:list'
}
},
{
id: '50000000000000000000000000000013',
name: 'CellStorageSampleInfo',
@@ -82,18 +93,6 @@ export const sqxpAdminRoutes: AppRouteRecord[] = [
menuCode: 'cell-storage:sample-info:list'
}
},
{
id: '904b5173519411f1944300163e3bdd96',
name: 'CellStoragePaymentInfo',
path: 'payment-info',
component: '/cell-storage/payment-info/index',
meta: {
title: '缴费信息',
keepAlive: false,
isHide: true,
menuCode: 'cellStorage:paymentInfo:list'
}
},
{
id: '50000000000000000000000000000004',
name: 'CellStoragePaymentConfirm',
@@ -0,0 +1,9 @@
<template>
<div class="payment-by-sample-tab">
<el-empty description="按样本视图开发中" :image-size="80" />
</div>
</template>
<script setup lang="ts">
defineOptions({ name: 'CellStoragePaymentBySampleTab' })
</script>
@@ -1,18 +1,88 @@
<!-- 旧「缴费信息」菜单入口:重定向至采集协议单管理 · 缴费信息 Tab -->
<!-- 缴费信息(流程看板 / 按样本) -->
<template>
<div />
<div class="page-container">
<section class="panel">
<nav class="pill-tab-nav" role="tablist" aria-label="视图类型">
<div class="pill-tab-nav__rail">
<div class="pill-tab-nav__progress" :style="pillProgressStyle" />
<button
v-for="(item, index) in entityTabs"
:key="item.key"
type="button"
class="pill-tab-nav__step"
:class="{
'is-active': activeTab === item.key,
'is-done': index < activeTabIndex
}"
role="tab"
:aria-selected="activeTab === item.key"
@click="activeTab = item.key"
>
<span class="pill-tab-nav__index">{{ index + 1 }}</span>
<span class="pill-tab-nav__text">
<span class="pill-tab-nav__title">{{ item.title }}</span>
<span class="pill-tab-nav__desc">{{ item.desc }}</span>
</span>
</button>
</div>
</nav>
<PaymentInfoTab v-if="activeTab === 'flow'" />
<PaymentBySampleTab v-else-if="activeTab === 'by-sample'" />
</section>
</div>
</template>
<script setup lang="ts">
import PaymentInfoTab from '../protocol-audit/PaymentInfoTab.vue'
import PaymentBySampleTab from './PaymentBySampleTab.vue'
defineOptions({ name: 'CellStoragePaymentInfo' })
const router = useRouter()
const VALID_TABS = ['flow', 'by-sample'] as const
type EntityTabKey = (typeof VALID_TABS)[number]
const entityTabs: Array<{
key: EntityTabKey
title: string
desc: string
}> = [
{
key: 'flow',
title: '流程看板',
desc: '按缴费流程状态处理'
},
{
key: 'by-sample',
title: '按样本',
desc: '一协议一样本的缴费总览'
}
]
const route = useRoute()
const activeTab = ref<EntityTabKey>('flow')
const activeTabIndex = computed(() =>
Math.max(
0,
entityTabs.findIndex((item) => item.key === activeTab.value)
)
)
const pillProgressStyle = computed(() => ({
width: `calc(${100 / entityTabs.length}% - 3px)`,
transform: `translateX(${activeTabIndex.value * 100}%)`
}))
onMounted(() => {
router.replace({
name: 'CellStorageProtocolAudit',
query: { ...route.query, tab: 'payment-info' }
})
const tab = String(route.query.tab || '')
if (tab === 'payment-info') {
activeTab.value = 'flow'
return
}
if (VALID_TABS.includes(tab as EntityTabKey)) {
activeTab.value = tab as EntityTabKey
}
})
</script>
@@ -1,4 +1,4 @@
<!-- 采集协议单管理(协议单 / 缴费 / 储存证 / 满月待办) -->
<!-- 采集协议单管理(协议单 / 储存证 / 满月待办) -->
<template>
<div class="page-container">
<section class="panel">
@@ -28,7 +28,6 @@
</nav>
<ProtocolAuditTab v-if="activeTab === 'protocol'" />
<PaymentInfoTab v-else-if="activeTab === 'payment-info'" />
<StorageCertTab v-else-if="activeTab === 'storage-cert'" />
<FullmoonTodoTab v-else-if="activeTab === 'fullmoon-todo'" />
</section>
@@ -37,7 +36,6 @@
<script setup lang="ts">
import ProtocolAuditTab from './ProtocolAuditTab.vue'
import PaymentInfoTab from './PaymentInfoTab.vue'
import StorageCertTab from './StorageCertTab.vue'
import FullmoonTodoTab from './FullmoonTodoTab.vue'
@@ -45,7 +43,7 @@
const LEGACY_SAMPLE_TABS = ['sample-reception', 'storage-entry'] as const
const VALID_TABS = ['protocol', 'payment-info', 'storage-cert', 'fullmoon-todo'] as const
const VALID_TABS = ['protocol', 'storage-cert', 'fullmoon-todo'] as const
type EntityTabKey = (typeof VALID_TABS)[number]
@@ -59,11 +57,6 @@
title: '协议单管理',
desc: '协议审核与状态维护'
},
{
key: 'payment-info',
title: '缴费信息',
desc: '缴费计划与到账查询'
},
{
key: 'storage-cert',
title: '储存证管理',
@@ -101,6 +94,13 @@
})
return
}
if (tab === 'payment-info') {
router.replace({
name: 'CellStoragePaymentInfo',
query: { ...route.query, tab: 'flow' }
})
return
}
if (VALID_TABS.includes(tab as EntityTabKey)) {
activeTab.value = tab as EntityTabKey
}