Files
hzdyjs/web/src/views/zsjy/enrollmentProcess/components/ProcessDetailDialog.vue
T
2025-07-24 16:27:26 +08:00

411 lines
11 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<template>
<el-dialog
v-model="dialogVisible"
title="流程详情"
width="900px"
class="process-detail-dialog"
:before-close="handleClose"
>
<div class="process-detail-container">
<!-- 基本信息 -->
<el-card class="detail-card" shadow="never">
<template #header>
<div class="card-header">
<span class="section-title">基本信息</span>
</div>
</template>
<el-descriptions :column="2" border>
<el-descriptions-item label="学生姓名">
<span class="detail-value">{{ processData.studentName }}</span>
</el-descriptions-item>
<el-descriptions-item label="身份证号">
<span class="detail-value">{{ processData.idCard }}</span>
</el-descriptions-item>
<el-descriptions-item label="当前状态">
<dict-tag :options="zsjy_enrollment_status" :value="processData.currentStatus" />
</el-descriptions-item>
<el-descriptions-item label="当前处理人">
<span class="detail-value">{{ processData.currentHandlerName || '-' }}</span>
</el-descriptions-item>
<el-descriptions-item label="完成状态">
<el-tag type="success" v-if="processData.isCompleted === 1 || processData.isCompleted === '1'">已完成</el-tag>
<el-tag type="info" v-else>未完成</el-tag>
</el-descriptions-item>
<el-descriptions-item label="创建时间">
<span class="detail-value">{{ parseTime(processData.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
</el-descriptions-item>
</el-descriptions>
</el-card>
<!-- 流程状态 -->
<el-card class="detail-card" shadow="never">
<template #header>
<div class="card-header">
<span class="section-title">流程状态</span>
</div>
</template>
<el-row :gutter="20">
<el-col :span="8">
<div class="status-item">
<div class="status-header">
<el-icon class="status-icon"><User /></el-icon>
<span class="status-title">信息审核</span>
</div>
<div class="status-content">
<div class="status-badge">
<dict-tag :options="zsjy_audit_status" :value="processData.infoAuditStatus" />
</div>
<div class="status-detail" v-if="processData.infoAuditStatus !== '0'">
<p><strong>审核人:</strong>{{ processData.infoAuditUserName || '-' }}</p>
<p><strong>审核时间:</strong>{{ parseTime(processData.infoAuditTime, '{y}-{m}-{d} {h}:{i}:{s}') || '-' }}</p>
<p><strong>审核意见:</strong>{{ processData.infoAuditOpinion || '-' }}</p>
</div>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="status-item">
<div class="status-header">
<el-icon class="status-icon"><Document /></el-icon>
<span class="status-title">录取处理</span>
</div>
<div class="status-content">
<div class="status-badge">
<dict-tag :options="zsjy_process_status" :value="processData.admissionStatus" />
</div>
<div class="status-detail" v-if="processData.admissionStatus !== '0'">
<p><strong>处理人:</strong>{{ processData.admissionUserName || '-' }}</p>
<p><strong>处理时间:</strong>{{ parseTime(processData.admissionTime, '{y}-{m}-{d} {h}:{i}:{s}') || '-' }}</p>
<p><strong>通知书号:</strong>{{ processData.noticeNumber || '-' }}</p>
<p><strong>处理意见:</strong>{{ processData.admissionOpinion || '-' }}</p>
</div>
</div>
</div>
</el-col>
<el-col :span="8">
<div class="status-item">
<div class="status-header">
<el-icon class="status-icon"><Finished /></el-icon>
<span class="status-title">最终审核</span>
</div>
<div class="status-content">
<div class="status-badge">
<dict-tag :options="zsjy_audit_status" :value="processData.finalAuditStatus" />
</div>
<div class="status-detail" v-if="processData.finalAuditStatus !== '0'">
<p><strong>审核人:</strong>{{ processData.finalAuditUserName || '-' }}</p>
<p><strong>审核时间:</strong>{{ parseTime(processData.finalAuditTime, '{y}-{m}-{d} {h}:{i}:{s}') || '-' }}</p>
<p><strong>审核意见:</strong>{{ processData.finalAuditOpinion || '-' }}</p>
</div>
</div>
</div>
</el-col>
</el-row>
</el-card>
<!-- 缴费信息 -->
<el-card class="detail-card" shadow="never">
<template #header>
<div class="card-header">
<span class="section-title">缴费信息</span>
</div>
</template>
<el-descriptions :column="2" border>
<el-descriptions-item label="缴费状态">
<el-tag :type="processData.paymentStatus == 1 ? 'success' : 'info'">
{{ processData.paymentStatus == 1 ? '已缴费' : '未缴费' }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="缴费确认时间">
<span class="detail-value">{{ parseTime(processData.paymentConfirmTime, '{y}-{m}-{d} {h}:{i}:{s}') || '-' }}</span>
</el-descriptions-item>
</el-descriptions>
</el-card>
<!-- 完成信息 -->
<el-card class="detail-card" shadow="never" v-if="processData.isCompleted === 1">
<template #header>
<div class="card-header">
<span class="section-title">完成信息</span>
</div>
</template>
<el-descriptions :column="1" border>
<el-descriptions-item label="完成时间">
<span class="detail-value">{{ parseTime(processData.completionTime, '{y}-{m}-{d} {h}:{i}:{s}') || '-' }}</span>
</el-descriptions-item>
</el-descriptions>
</el-card>
<!-- 备注信息 -->
<el-card class="detail-card" shadow="never" v-if="processData.remark">
<template #header>
<div class="card-header">
<span class="section-title">备注信息</span>
</div>
</template>
<div class="remark-content">
{{ processData.remark }}
</div>
</el-card>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">关闭</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, computed, toRefs } from 'vue'
import type { EnrollmentProcessVO } from '@/api/zsjy/enrollmentProcess'
interface Props {
visible: boolean
processData: Partial<EnrollmentProcessVO>
}
interface Emits {
(e: 'update:visible', value: boolean): void
}
const props = withDefaults(defineProps<Props>(), {
visible: false,
processData: () => ({})
})
const emit = defineEmits<Emits>()
const { proxy } = getCurrentInstance() as ComponentInternalInstance
const { zsjy_enrollment_status, zsjy_audit_status, zsjy_process_status, zsjy_payment_status, sys_yes_no } = toRefs<any>(
proxy?.useDict('zsjy_enrollment_status', 'zsjy_audit_status', 'zsjy_process_status', 'zsjy_payment_status', 'sys_yes_no')
)
// 对话框可见性
const dialogVisible = computed({
get: () => props.visible,
set: (value: boolean) => {
emit('update:visible', value)
}
})
/** 关闭对话框 */
const handleClose = () => {
dialogVisible.value = false
}
const isCompletedTag = computed(() => {
return String(processData.value.isCompleted) === '1' ? 'success' : 'info'
})
const isCompletedText = computed(() => {
return String(processData.value.isCompleted) === '1' ? '已完成' : '未完成'
})
</script>
<style scoped>
.process-detail-dialog :deep(.el-dialog) {
border-radius: 16px;
overflow: hidden;
}
.process-detail-dialog :deep(.el-dialog__header) {
background: linear-gradient(135deg, rgb(93, 135, 255) 0%, rgb(73, 190, 255) 100%);
color: white;
padding: 20px 24px;
margin: 0;
}
.process-detail-dialog :deep(.el-dialog__title) {
color: white;
font-size: 18px;
font-weight: 600;
}
.process-detail-dialog :deep(.el-dialog__headerbtn) {
.el-dialog__close {
color: white;
font-size: 20px;
transition: all 0.3s ease;
&:hover {
color: rgba(255, 255, 255, 0.8);
transform: rotate(90deg);
}
}
}
.process-detail-dialog :deep(.el-dialog__body) {
padding: 20px 24px;
background: #ffffff;
}
.process-detail-dialog :deep(.el-dialog__footer) {
padding: 16px 24px 20px;
background: #ffffff;
border-top: 1px solid rgba(93, 135, 255, 0.1);
}
.process-detail-container {
max-height: 70vh;
overflow-y: auto;
}
.detail-card {
margin-bottom: 16px;
border-radius: 8px;
border: 1px solid #e4e7ed;
}
.detail-card:last-child {
margin-bottom: 0;
}
.detail-card :deep(.el-card__header) {
background: #f8f9fa;
border-bottom: 1px solid #e4e7ed;
padding: 12px 16px;
}
.card-header {
display: flex;
align-items: center;
}
.section-title {
font-size: 16px;
font-weight: 600;
color: #1e293b;
position: relative;
}
.section-title::before {
content: '';
width: 3px;
height: 16px;
background: linear-gradient(135deg, rgb(93, 135, 255), rgb(73, 190, 255));
border-radius: 2px;
margin-right: 8px;
display: inline-block;
}
.detail-value {
color: #303133;
font-weight: 500;
}
/* 流程状态样式 */
.status-item {
border: 1px solid #e4e7ed;
border-radius: 8px;
padding: 16px;
height: 100%;
background: #fff;
transition: all 0.3s ease;
}
.status-item:hover {
border-color: #409eff;
box-shadow: 0 4px 12px rgba(64, 158, 255, 0.15);
}
.status-header {
display: flex;
align-items: center;
margin-bottom: 12px;
padding-bottom: 8px;
border-bottom: 1px solid #f0f2f5;
}
.status-icon {
font-size: 18px;
color: #409eff;
margin-right: 8px;
}
.status-title {
font-size: 14px;
font-weight: 600;
color: #303133;
}
.status-content {
min-height: 120px;
}
.status-badge {
margin-bottom: 12px;
}
.status-detail {
font-size: 13px;
line-height: 1.6;
}
.status-detail p {
margin: 6px 0;
color: #606266;
}
.status-detail strong {
color: #303133;
font-weight: 500;
}
/* 备注内容样式 */
.remark-content {
background: #f8f9fa;
padding: 12px 16px;
border-radius: 6px;
border-left: 4px solid #409eff;
color: #606266;
line-height: 1.6;
margin: 8px 0;
}
/* 对话框底部样式 */
.dialog-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
/* 滚动条样式 */
.process-detail-container::-webkit-scrollbar {
width: 6px;
}
.process-detail-container::-webkit-scrollbar-track {
background: #f1f1f1;
border-radius: 3px;
}
.process-detail-container::-webkit-scrollbar-thumb {
background: #c1c1c1;
border-radius: 3px;
}
.process-detail-container::-webkit-scrollbar-thumb:hover {
background: #a8a8a8;
}
/* 描述列表样式优化 */
:deep(.el-descriptions__body) {
background: #fff;
}
:deep(.el-descriptions__label) {
background: #f8f9fa !important;
color: #606266 !important;
font-weight: 500 !important;
width: 120px;
}
:deep(.el-descriptions__content) {
background: #fff !important;
color: #303133 !important;
}
</style>