From 58b9955666d6b0b7972bcab367b8a3a192e9cdf8 Mon Sep 17 00:00:00 2001
From: zjk <852185829@qq.com>
Date: 星期四, 06 八月 2026 15:45:19 +0800
Subject: [PATCH] feat(admin): 完善车牌管理,重构菜单并新增电影票包管理功能

---
 talent-card-admin/src/views/MovieTicketView.vue        |  396 +++++++++++++++++++++++++++++------
 talent-card-admin/src/views/ParkingPlateView.vue       |    2 
 talent-card-admin/src/views/ParkingPlateDetailView.vue |   72 ++++--
 talent-card-admin/src/style.css                        |  126 +++++++++++
 talent-card-admin/src/layouts/AdminLayout.vue          |   21 -
 5 files changed, 511 insertions(+), 106 deletions(-)

diff --git a/talent-card-admin/src/layouts/AdminLayout.vue b/talent-card-admin/src/layouts/AdminLayout.vue
index 84c2ffc..ef86de4 100644
--- a/talent-card-admin/src/layouts/AdminLayout.vue
+++ b/talent-card-admin/src/layouts/AdminLayout.vue
@@ -105,14 +105,7 @@
   { path: '/equity-images', label: '权益图片管理' },
   { path: '/talent-news-management', label: '人才资讯管理' },
   { path: '/talent-policy-management', label: '人才政策管理' },
-  {
-    index: 'movie-ticket-management',
-    label: '电影票管理',
-    children: [
-      { path: '/movie-ticket-records', label: '电影票领取记录' },
-      { path: '/movie-tickets', label: '电影票管理' },
-    ],
-  },
+  { path: '/movie-tickets', label: '电影票管理' },
 ]
 
 const systemMenus: MenuItem[] = [
@@ -131,10 +124,10 @@
   { index: 'system-management', label: '系统管理', icon: Setting, items: systemMenus },
 ]
 
-const defaultOpeneds = [
-  ...menuGroups.map((item) => item.index),
-  'movie-ticket-management',
-]
+const defaultOpeneds = computed(() => {
+  const currentGroup = menuGroups.find((item) => findMenuLabel(item.items, activeMenu.value))
+  return currentGroup ? [currentGroup.index] : []
+})
 
 const pageTitle = computed(() => {
   if (route.name === 'merchant-create' && route.query.mode === 'edit') {
@@ -179,6 +172,9 @@
   }
   if (route.path === '/talent-policies' || route.path === '/talent-policy-categories') {
     return '/talent-policy-management'
+  }
+  if (route.path === '/movie-ticket-records') {
+    return '/movie-tickets'
   }
   return route.path
 })
@@ -301,6 +297,7 @@
         router
         :default-active="activeMenu"
         :default-openeds="defaultOpeneds"
+        unique-opened
         class="admin-menu"
       >
         <el-menu-item index="/dashboard">
diff --git a/talent-card-admin/src/style.css b/talent-card-admin/src/style.css
index 95307e9..84ef689 100644
--- a/talent-card-admin/src/style.css
+++ b/talent-card-admin/src/style.css
@@ -2754,6 +2754,10 @@
   align-content: start;
 }
 
+.parking-plate-submit-time {
+  grid-column: 1 / 2;
+}
+
 .reservation-detail-grid.medical-application-info-grid {
   min-height: 154px;
   align-content: start;
@@ -3080,6 +3084,128 @@
   font-size: 12px;
 }
 
+.movie-ticket-package-page .panel {
+  min-height: 640px;
+  padding: 18px 14px 20px;
+}
+
+.movie-ticket-package-filter-form {
+  display: grid;
+  grid-template-columns: minmax(320px, 1fr) minmax(240px, 1fr) minmax(320px, 1fr) minmax(240px, 1fr) auto;
+  gap: 14px 28px;
+  align-items: start;
+  padding-bottom: 18px;
+  border-bottom: 1px solid #d9dee8;
+}
+
+.movie-ticket-package-filter-form .el-form-item {
+  margin-bottom: 0;
+}
+
+.movie-ticket-package-filter-form .el-input,
+.movie-ticket-package-filter-form .el-select,
+.movie-ticket-package-filter-form .el-date-editor {
+  width: 100%;
+}
+
+.movie-ticket-package-filter-actions {
+  grid-row: 1 / span 2;
+  grid-column: 5;
+  display: grid;
+  gap: 10px;
+  align-content: start;
+  min-width: 80px;
+}
+
+.movie-ticket-package-tools {
+  display: flex;
+  justify-content: space-between;
+  padding: 18px 0 16px;
+}
+
+.movie-ticket-package-table {
+  color: #111827;
+  font-size: 12px;
+}
+
+.movie-ticket-package-table.el-table {
+  border-radius: 0;
+}
+
+.movie-ticket-package-table .el-table__cell {
+  padding: 5px 0;
+}
+
+.movie-ticket-package-table .el-table__header th {
+  height: 34px;
+  color: #111827;
+  background: #f3f4f6;
+  font-weight: 700;
+}
+
+.movie-ticket-package-table .el-button {
+  padding: 0 2px;
+  font-size: 12px;
+}
+
+.movie-ticket-create-page {
+  display: grid;
+  gap: 12px;
+}
+
+.movie-ticket-create-panel {
+  min-height: 286px;
+  padding: 18px 16px 28px;
+  background: #ffffff;
+}
+
+.movie-ticket-create-panel h3 {
+  margin: 0 0 18px;
+  color: #111827;
+  font-size: 15px;
+  font-weight: 700;
+}
+
+.movie-ticket-create-form {
+  margin-bottom: 28px;
+}
+
+.movie-ticket-create-row {
+  display: grid;
+  grid-template-columns: 58px 180px 36px 160px 86px;
+  gap: 12px;
+  align-items: center;
+  color: #111827;
+  font-size: 13px;
+}
+
+.movie-ticket-create-row .el-input {
+  width: 100%;
+}
+
+.movie-ticket-benefit-list {
+  display: grid;
+  gap: 18px;
+}
+
+.movie-ticket-benefit-row {
+  display: grid;
+  grid-template-columns: 86px 40px 56px 80px 20px 56px 90px;
+  gap: 12px;
+  align-items: center;
+  color: #111827;
+  font-size: 13px;
+}
+
+.movie-ticket-benefit-row strong {
+  font-weight: 700;
+}
+
+.movie-ticket-benefit-row .el-input,
+.movie-ticket-benefit-row .el-select {
+  width: 100%;
+}
+
 .news-publish-page {
   min-height: calc(100vh - 126px);
   background: #ffffff;
diff --git a/talent-card-admin/src/views/MovieTicketView.vue b/talent-card-admin/src/views/MovieTicketView.vue
index bdaa853..c8c3bf2 100644
--- a/talent-card-admin/src/views/MovieTicketView.vue
+++ b/talent-card-admin/src/views/MovieTicketView.vue
@@ -1,89 +1,347 @@
 <script setup lang="ts">
-import { onMounted, ref } from 'vue'
+import { computed, onMounted, reactive, ref } from 'vue'
+import { useRouter } from 'vue-router'
+import { Download, Plus, Refresh, Search } from '@element-plus/icons-vue'
 import { ElMessage } from 'element-plus'
-import { getMovieTicketRules, saveMovieTicketRules } from '../api/admin'
-import type { MovieTicketRule } from '../types/admin'
+import { downloadExcel } from '../utils/excel'
 
-const resetCycles = ['每天', '每周', '每月', '每季', '每年']
+interface MovieTicketPackageRow {
+    id: number | string
+    packageNo: string
+    packageName: string
+    merchants: string
+    totalCount: number
+    claimedCount: number
+    remainCount: number
+    status: '正常' | '禁用'
+    talentKeyword?: string
+    cardLevel?: string
+    orderDate?: string
+}
+interface MovieTicketBenefitForm {
+    level: string
+    enabled: boolean
+    claimableCount: string
+    resetCycle: string
+}
+
+const router = useRouter()
 const loading = ref(false)
-const saving = ref(false)
+const pageMode = ref<'list' | 'create' | 'view'>('list')
 
-const rules = ref<MovieTicketRule[]>([
-  {
-    level: '卓越人才卡',
-    enabled: true,
-    claimableCount: '',
-    resetCycle: '每月',
-  },
-  {
-    level: '杰出人才卡',
-    enabled: true,
-    claimableCount: '',
-    resetCycle: '每月',
-  },
-  {
-    level: '菁英人才卡',
-    enabled: true,
-    claimableCount: '',
-    resetCycle: '每月',
-  },
+const cardLevels = ['卓越人才卡', '杰出人才卡', '菁英人才卡', '青年人才卡']
+const statusOptions = ['正常', '禁用']
+const resetCycles = ['每天', '每周', '每月', '每季', '每年']
+
+const filters = reactive({
+    talentKeyword: '',
+    cardLevel: '',
+    orderTime: [] as string[],
+    status: '',
+})
+
+const pagination = reactive({
+    page: 1,
+    size: 10,
+    total: 0,
+})
+
+const movieTicketPackageSource = ref<MovieTicketPackageRow[]>([
+    {
+        id: 1,
+        packageNo: '123464561',
+        packageName: '赵四',
+        merchants: 'XXX电影院、XXXX电影院',
+        totalCount: 12354,
+        claimedCount: 25,
+        remainCount: 1564,
+        status: '正常',
+        talentKeyword: '赵四 13800000000 TC0001',
+        cardLevel: '卓越人才卡',
+        orderDate: '2026-06-18',
+    },
 ])
 
-function normalizeRule(rule: MovieTicketRule): MovieTicketRule {
-  return {
-    ...rule,
-    enabled: rule.enabled === true || rule.enabled === 1,
-    claimableCount:
-      rule.claimableCount === '' || rule.claimableCount === undefined ? undefined : Number(rule.claimableCount),
-    resetCycle: rule.resetCycle || '每月',
-  }
+const createForm = reactive({
+    packageName: '',
+    totalCount: '',
+})
+
+const benefitForm = ref<MovieTicketBenefitForm[]>(defaultBenefitForm())
+const isReadonlyMode = computed(() => pageMode.value === 'view')
+
+function defaultBenefitForm(): MovieTicketBenefitForm[] {
+    return [
+        { level: '卓越人才卡', enabled: true, claimableCount: '', resetCycle: '每天' },
+        { level: '菁英人才卡', enabled: true, claimableCount: '', resetCycle: '每天' },
+        { level: '杰出人才卡', enabled: true, claimableCount: '', resetCycle: '每天' },
+    ]
 }
 
-async function loadRules() {
-  loading.value = true
-  try {
-    const result = await getMovieTicketRules()
-    if (result.length) {
-      rules.value = result.map(normalizeRule)
+const filteredRows = computed(() => {
+    return movieTicketPackageSource.value.filter((item) => {
+        const keywordMatched = !filters.talentKeyword
+            || `${item.talentKeyword || ''} ${item.packageName} ${item.packageNo}`.includes(filters.talentKeyword.trim())
+        const levelMatched = !filters.cardLevel || item.cardLevel === filters.cardLevel
+        const statusMatched = !filters.status || item.status === filters.status
+        const [startDate, endDate] = filters.orderTime
+        const timeMatched = !startDate || !endDate || !item.orderDate || (item.orderDate >= startDate && item.orderDate <= endDate)
+        return keywordMatched && levelMatched && statusMatched && timeMatched
+    })
+})
+
+const pagedRows = computed(() => {
+    const start = (pagination.page - 1) * pagination.size
+    return filteredRows.value.slice(start, start + pagination.size)
+})
+
+function loadData() {
+    loading.value = true
+    try {
+        pagination.total = filteredRows.value.length
+    } finally {
+        loading.value = false
     }
-  } finally {
-    loading.value = false
-  }
 }
 
-async function saveRules() {
-  saving.value = true
-  try {
-    rules.value = (await saveMovieTicketRules(rules.value.map(normalizeRule))).map(normalizeRule)
-  } finally {
-    saving.value = false
-  }
-  ElMessage.success('电影票规则已保存')
+function search() {
+    pagination.page = 1
+    loadData()
 }
 
-onMounted(loadRules)
+function resetFilters() {
+    filters.talentKeyword = ''
+    filters.cardLevel = ''
+    filters.orderTime = []
+    filters.status = ''
+    pagination.page = 1
+    loadData()
+}
+
+function openCreate() {
+    pageMode.value = 'create'
+    resetCreateForm()
+}
+
+function resetCreateForm() {
+    createForm.packageName = ''
+    createForm.totalCount = ''
+    benefitForm.value = defaultBenefitForm()
+}
+
+function openAvailableMerchants() {
+    ElMessage.info('可用商家配置暂未接入')
+}
+
+function fillViewForm(row: MovieTicketPackageRow) {
+    createForm.packageName = row.packageName
+    createForm.totalCount = String(row.totalCount)
+    benefitForm.value = defaultBenefitForm().map((item) => ({
+        ...item,
+        enabled: item.level === row.cardLevel,
+        claimableCount: item.level === row.cardLevel ? String(row.remainCount) : '',
+    }))
+}
+
+function saveCreate() {
+    if (!createForm.packageName.trim()) {
+        ElMessage.warning('请输入票包名称')
+        return
+    }
+    if (!createForm.totalCount.trim()) {
+        ElMessage.warning('请输入数量')
+        return
+    }
+    const totalCount = Number(createForm.totalCount)
+    if (!Number.isFinite(totalCount) || totalCount <= 0) {
+        ElMessage.warning('数量需为大于 0 的数字')
+        return
+    }
+    const invalidBenefit = benefitForm.value.find((item) => item.enabled && !item.claimableCount.trim())
+    if (invalidBenefit) {
+        ElMessage.warning(`请输入${invalidBenefit.level}可领数量`)
+        return
+    }
+
+    movieTicketPackageSource.value.unshift({
+        id: Date.now(),
+        packageNo: String(Date.now()),
+        packageName: createForm.packageName.trim(),
+        merchants: '待配置',
+        totalCount,
+        claimedCount: 0,
+        remainCount: totalCount,
+        status: '正常',
+        talentKeyword: '',
+        cardLevel: benefitForm.value.find((item) => item.enabled)?.level || '',
+        orderDate: new Date().toISOString().slice(0, 10),
+    })
+    pageMode.value = 'list'
+    pagination.page = 1
+    loadData()
+    ElMessage.success('票包已新增')
+}
+
+function toggleStatus(row: MovieTicketPackageRow) {
+    row.status = row.status === '正常' ? '禁用' : '正常'
+    ElMessage.success(`已${row.status === '正常' ? '启用' : '禁用'}该票包`)
+    loadData()
+}
+
+function viewDetail(row: MovieTicketPackageRow) {
+    fillViewForm(row)
+    pageMode.value = 'view'
+}
+
+function openReceiveRecords() {
+    router.push('/movie-ticket-records')
+}
+
+function backToList() {
+    pageMode.value = 'list'
+}
+
+function download() {
+    downloadExcel(
+        '电影票管理',
+        [
+            { title: '票包编号', value: row => row.packageNo },
+            { title: '票包名称', value: row => row.packageName },
+            { title: '适用商家', value: row => row.merchants },
+            { title: '数量', value: row => row.totalCount },
+            { title: '领取数量', value: row => row.claimedCount },
+            { title: '剩余', value: row => row.remainCount },
+            { title: '状态', value: row => row.status },
+        ],
+        filteredRows.value,
+    )
+    ElMessage.success(`已导出 ${filteredRows.value.length} 条电影票数据`)
+}
+
+onMounted(loadData)
 </script>
 
 <template>
-  <div v-loading="loading" class="movie-ticket-config-page">
-    <section class="movie-ticket-config-panel">
-      <h3>人才权益</h3>
+    <div v-if="pageMode === 'list'" class="page-stack prototype-page movie-ticket-package-page">
+        <section class="panel">
+            <div class="panel-header">
+                <h3>查询表格</h3>
+            </div>
 
-      <div class="movie-ticket-rule-list">
-        <div v-for="rule in rules" :key="rule.level" class="movie-ticket-rule-row">
-          <strong>{{ rule.level }}</strong>
-          <el-switch v-model="rule.enabled" />
-          <span>可领数量</span>
-          <el-input v-model="rule.claimableCount" placeholder="请输入" />
-          <span>张</span>
-          <span class="reset-label">重置周期</span>
-          <el-select v-model="rule.resetCycle">
-            <el-option v-for="cycle in resetCycles" :key="cycle" :label="cycle" :value="cycle" />
-          </el-select>
-        </div>
-      </div>
-    </section>
+            <el-form class="movie-ticket-package-filter-form" :model="filters" label-width="72px">
+                <el-form-item label="持卡人">
+                    <el-input v-model="filters.talentKeyword" placeholder="持卡人姓名、手机号、卡号" clearable />
+                </el-form-item>
+                <el-form-item label="卡片等级">
+                    <el-select v-model="filters.cardLevel" placeholder="全部" clearable>
+                        <el-option label="全部" value="" />
+                        <el-option v-for="level in cardLevels" :key="level" :label="level" :value="level" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="订单时间">
+                    <el-date-picker
+                        v-model="filters.orderTime"
+                        type="daterange"
+                        start-placeholder="开始日期"
+                        end-placeholder="结束日期"
+                        range-separator="至"
+                        value-format="YYYY-MM-DD"
+                    />
+                </el-form-item>
+                <el-form-item label="状态">
+                    <el-select v-model="filters.status" placeholder="全部" clearable>
+                        <el-option label="全部" value="" />
+                        <el-option v-for="status in statusOptions" :key="status" :label="status" :value="status" />
+                    </el-select>
+                </el-form-item>
+                <div class="movie-ticket-package-filter-actions">
+                    <el-button type="primary" :icon="Search" @click="search">查询</el-button>
+                    <el-button :icon="Refresh" @click="resetFilters">重置</el-button>
+                </div>
+            </el-form>
 
-    <el-button type="primary" class="movie-ticket-save-button" :loading="saving" @click="saveRules">保存</el-button>
-  </div>
+            <div class="movie-ticket-package-tools">
+                <el-button type="primary" :icon="Plus" @click="openCreate">新增</el-button>
+                <el-button :icon="Download" @click="download">下载</el-button>
+            </div>
+
+            <el-table
+                v-loading="loading"
+                :data="pagedRows"
+                border
+                class="movie-ticket-package-table"
+                empty-text="暂无电影票数据"
+            >
+                <el-table-column prop="packageNo" label="票包编号" min-width="120" align="center" />
+                <el-table-column prop="packageName" label="票包名称" min-width="140" align="center" />
+                <el-table-column prop="merchants" label="适用商家" min-width="150" align="center" show-overflow-tooltip />
+                <el-table-column prop="totalCount" label="数量" min-width="90" align="center" />
+                <el-table-column prop="claimedCount" label="领取数量" min-width="110" align="center" />
+                <el-table-column prop="remainCount" label="剩余" min-width="90" align="center" />
+                <el-table-column prop="status" label="状态" min-width="90" align="center" />
+                <el-table-column label="操作" min-width="160" align="center">
+                    <template #default="{ row }">
+                        <el-button link type="primary" @click="toggleStatus(row)">{{ row.status === '正常' ? '禁用' : '启用' }}</el-button>
+                        <el-button link type="primary" @click="viewDetail(row)">查看</el-button>
+                        <el-button link type="primary" @click="openReceiveRecords">领取记录</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+
+            <div class="pagination-row">
+                <el-pagination
+                    v-model:current-page="pagination.page"
+                    v-model:page-size="pagination.size"
+                    background
+                    layout="total, prev, pager, next"
+                    :pager-count="5"
+                    :total="pagination.total"
+                    @change="loadData"
+                />
+            </div>
+        </section>
+    </div>
+
+    <div v-else class="page-stack prototype-page movie-ticket-create-page">
+        <section class="panel movie-ticket-create-panel">
+            <h3>票包信息</h3>
+
+            <div class="movie-ticket-create-form">
+                <div class="movie-ticket-create-row">
+                    <label>票包名称</label>
+                    <el-input v-if="!isReadonlyMode" v-model="createForm.packageName" placeholder="攀枝花万达" />
+                    <span v-else>{{ createForm.packageName || '-' }}</span>
+                    <label>数量</label>
+                    <el-input v-if="!isReadonlyMode" v-model="createForm.totalCount" placeholder="888" />
+                    <span v-else>{{ createForm.totalCount || '-' }}</span>
+                    <el-button v-if="!isReadonlyMode" type="primary" @click="openAvailableMerchants">可用商家</el-button>
+                    <span v-else>可用商家</span>
+                </div>
+            </div>
+
+            <h3>人才权益</h3>
+
+            <div class="movie-ticket-benefit-list">
+                <div v-for="item in benefitForm" :key="item.level" class="movie-ticket-benefit-row">
+                    <strong>{{ item.level }}</strong>
+                    <el-switch v-if="!isReadonlyMode" v-model="item.enabled" />
+                    <span v-else>{{ item.enabled ? '开启' : '关闭' }}</span>
+                    <span>可领数量</span>
+                    <el-input v-if="!isReadonlyMode" v-model="item.claimableCount" placeholder="请输入" />
+                    <span v-else>{{ item.claimableCount || '-' }}</span>
+                    <span>张</span>
+                    <span>重置周期</span>
+                    <el-select v-if="!isReadonlyMode" v-model="item.resetCycle">
+                        <el-option v-for="cycle in resetCycles" :key="cycle" :label="cycle" :value="cycle" />
+                    </el-select>
+                    <span v-else>{{ item.resetCycle }}</span>
+                </div>
+            </div>
+        </section>
+
+        <template v-if="isReadonlyMode">
+            <el-button class="movie-ticket-save-button" @click="backToList">返回</el-button>
+        </template>
+        <el-button v-else type="primary" class="movie-ticket-save-button" @click="saveCreate">保存</el-button>
+    </div>
 </template>
diff --git a/talent-card-admin/src/views/ParkingPlateDetailView.vue b/talent-card-admin/src/views/ParkingPlateDetailView.vue
index 3c728aa..5a67fb4 100644
--- a/talent-card-admin/src/views/ParkingPlateDetailView.vue
+++ b/talent-card-admin/src/views/ParkingPlateDetailView.vue
@@ -13,23 +13,23 @@
   return value === undefined || value === null || value === '' ? '-' : String(value)
 }
 
-const cardholderInfo = computed(() => [
-  { label: '持卡人姓名:', value: text(detail.value?.talentName) },
-  { label: '手机号:', value: text(detail.value?.talentMobile) },
-  { label: '人才等级:', value: text(detail.value?.talentLevel) },
-])
+const cardholderInfo = computed(() => ({
+  talentName: text(detail.value?.talentName),
+  talentMobile: text(detail.value?.talentMobile),
+  talentLevel: text(detail.value?.talentLevel),
+}))
 
-const submissionInfo = computed(() => [
-  { label: '车牌号:', value: text(detail.value?.plateNo) },
-  { label: '停车场:', value: text(detail.value?.parkingLot) },
-  { label: '提交时间:', value: text(detail.value?.submittedAt) },
-])
+const submissionInfo = computed(() => ({
+  plateNo: text(detail.value?.plateNo),
+  parkingLot: text(detail.value?.parkingLot),
+  submittedAt: text(detail.value?.submittedAt),
+}))
 
-const statusInfo = computed(() => [
-  { label: '状态:', value: text(detail.value?.status) },
-  { label: '处理时间:', value: text(detail.value?.handledAt) },
-  { label: '处理人:', value: text(detail.value?.handlerName) },
-])
+const statusInfo = computed(() => ({
+  status: text(detail.value?.status),
+  handledAt: text(detail.value?.handledAt),
+  handlerName: text(detail.value?.handlerName),
+}))
 
 const handled = computed(() => detail.value?.status === '已处理')
 
@@ -56,9 +56,17 @@
       <div class="reservation-detail-section">
         <h3>持卡人信息</h3>
         <div class="reservation-detail-grid single-line">
-          <div v-for="item in cardholderInfo" :key="item.label" class="reservation-detail-item">
-            <span>{{ item.label }}</span>
-            <strong>{{ item.value }}</strong>
+          <div class="reservation-detail-item">
+            <span>持卡人姓名:</span>
+            <strong>{{ cardholderInfo.talentName }}</strong>
+          </div>
+          <div class="reservation-detail-item">
+            <span>手机号:</span>
+            <strong>{{ cardholderInfo.talentMobile }}</strong>
+          </div>
+          <div class="reservation-detail-item">
+            <span>人才等级:</span>
+            <strong>{{ cardholderInfo.talentLevel }}</strong>
           </div>
         </div>
       </div>
@@ -66,9 +74,17 @@
       <div class="reservation-detail-section">
         <h3>提交信息</h3>
         <div class="reservation-detail-grid parking-plate-submit-grid">
-          <div v-for="item in submissionInfo" :key="item.label" class="reservation-detail-item">
-            <span>{{ item.label }}</span>
-            <strong>{{ item.value }}</strong>
+          <div class="reservation-detail-item">
+            <span>车牌号:</span>
+            <strong>{{ submissionInfo.plateNo }}</strong>
+          </div>
+          <div class="reservation-detail-item">
+            <span>停车场:</span>
+            <strong>{{ submissionInfo.parkingLot }}</strong>
+          </div>
+          <div class="reservation-detail-item parking-plate-submit-time">
+            <span>提交时间:</span>
+            <strong>{{ submissionInfo.submittedAt }}</strong>
           </div>
         </div>
       </div>
@@ -76,9 +92,17 @@
       <div class="reservation-detail-section">
         <h3>状态信息</h3>
         <div class="reservation-detail-grid single-line">
-          <div v-for="item in statusInfo" :key="item.label" class="reservation-detail-item">
-            <span>{{ item.label }}</span>
-            <strong>{{ item.value }}</strong>
+          <div class="reservation-detail-item">
+            <span>状态:</span>
+            <strong>{{ statusInfo.status }}</strong>
+          </div>
+          <div class="reservation-detail-item">
+            <span>处理时间:</span>
+            <strong>{{ statusInfo.handledAt }}</strong>
+          </div>
+          <div class="reservation-detail-item">
+            <span>处理人:</span>
+            <strong>{{ statusInfo.handlerName }}</strong>
           </div>
         </div>
       </div>
diff --git a/talent-card-admin/src/views/ParkingPlateView.vue b/talent-card-admin/src/views/ParkingPlateView.vue
index 9b61c38..3cc9b08 100644
--- a/talent-card-admin/src/views/ParkingPlateView.vue
+++ b/talent-card-admin/src/views/ParkingPlateView.vue
@@ -154,7 +154,7 @@
         <el-table-column prop="status" label="状态" min-width="108" align="center" />
         <el-table-column label="操作" width="86" fixed="right" align="center">
           <template #default="{ row }">
-            <el-button v-if="row.applicationNo" link type="primary" @click="viewDetail(row)">查看</el-button>
+            <el-button link type="primary" @click="viewDetail(row)">查看</el-button>
           </template>
         </el-table-column>
       </el-table>

--
Gitblit v1.7.1