wuzhen 提交

This commit is contained in:
wuzhen committed 2025-07-24 21:03:00 +08:00
1 parent cacd54716a
commit 0917c7f156
70 files changed
+9026

No files matched your search

+129
View File
@@ -0,0 +1,129 @@
import request from '@/utils/request'
import type { PageQuery } from '@/types/page'
import type { EnrollmentProcessVO } from './enrollmentProcess'
/**
* 查询招生录取统计列表
* @param query 查询参数
* @returns 招生录取统计列表
*/
export function listEnrollmentStatistics(query: PageQuery) {
return request({
url: '/zsjy/enrollment/statistics/list',
method: 'get',
params: query
})
}
/**
* 导出招生录取统计列表
* @param query 查询参数
*/
export function exportEnrollmentStatistics(query: PageQuery) {
return request({
url: '/zsjy/enrollment/statistics/export',
method: 'post',
params: query,
responseType: 'blob'
})
}
/**
* 获取招生录取统计详细信息
* @param id 统计ID
* @returns 招生录取统计详细信息
*/
export function getEnrollmentStatistics(id: string | number) {
return request({
url: `/zsjy/enrollment/statistics/${id}`,
method: 'get'
})
}
/**
* 查询招生录取统计图表数据
* @returns 图表数据
*/
export function getEnrollmentStatisticsChartData() {
return request({
url: '/zsjy/enrollment/statistics/chart',
method: 'get'
})
}
/**
* 查询招生录取统计概览数据
* @returns 概览数据
*/
export function getEnrollmentStatisticsOverview() {
return request({
url: '/zsjy/enrollment/statistics/overview',
method: 'get'
})
}
/**
* 查询招生录取统计按专业分布数据
* @returns 专业分布数据
*/
export function getEnrollmentStatisticsByMajor() {
return request({
url: '/zsjy/enrollment/statistics/major',
method: 'get'
})
}
/**
* 查询招生录取统计按学院分布数据
* @returns 学院分布数据
*/
export function getEnrollmentStatisticsByCollege() {
return request({
url: '/zsjy/enrollment/statistics/college',
method: 'get'
})
}
/**
* 查询招生录取统计按地区分布数据
* @returns 地区分布数据
*/
export function getEnrollmentStatisticsByRegion() {
return request({
url: '/zsjy/enrollment/statistics/region',
method: 'get'
})
}
/**
* 查询招生录取统计按性别分布数据
* @returns 性别分布数据
*/
export function getEnrollmentStatisticsByGender() {
return request({
url: '/zsjy/enrollment/statistics/gender',
method: 'get'
})
}
/**
* 查询招生录取统计按缴费状态分布数据
* @returns 缴费状态分布数据
*/
export function getEnrollmentStatisticsByPayment() {
return request({
url: '/zsjy/enrollment/statistics/payment',
method: 'get'
})
}
/**
* 查询招生录取统计按流程状态分布数据
* @returns 流程状态分布数据
*/
export function getEnrollmentStatisticsByStatus() {
return request({
url: '/zsjy/enrollment/statistics/status',
method: 'get'
})
}
@@ -0,0 +1,323 @@
<template>
<el-dialog
v-model="dialogVisible"
title="学生报名详情"
width="1000px"
class="student-detail-dialog"
:close-on-click-modal="false"
>
<div class="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="3" border>
<el-descriptions-item label="姓名">{{ studentData.studentName || studentData.name || '-' }}</el-descriptions-item>
<el-descriptions-item label="身份证号">{{ formatIdCard(studentData.idCard) }}</el-descriptions-item>
<el-descriptions-item label="性别">{{ studentData.gender === 'M' ? '男' : '女' }}</el-descriptions-item>
<el-descriptions-item label="出生日期">{{ formatDate(studentData.birthDate) }}</el-descriptions-item>
<el-descriptions-item label="联系电话">{{ studentData.phone1 || '-' }}</el-descriptions-item>
<el-descriptions-item label="备用电话">{{ studentData.phone2 || '-' }}</el-descriptions-item>
<el-descriptions-item label="民族">{{ studentData.nation || '-' }}</el-descriptions-item>
<el-descriptions-item label="是否住宿">{{ studentData.isBoarding === 1 || studentData.isBoarding === '1' ? '是' : '否' }}</el-descriptions-item>
<el-descriptions-item label="健康状况">{{ studentData.healthStatus || '-' }}</el-descriptions-item>
<el-descriptions-item label="家庭住址" :span="3">{{ studentData.homeAddress || '-' }}</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-descriptions :column="3" border>
<el-descriptions-item label="毕业中学">{{ studentData.middleSchool || '-' }}</el-descriptions-item>
<el-descriptions-item label="准考证号">{{ studentData.examNumber || '-' }}</el-descriptions-item>
<el-descriptions-item label="中考地区">{{ studentData.examRegion || studentData.province || '-' }}</el-descriptions-item>
<el-descriptions-item label="中考满分">{{ studentData.totalScoreFull || '-' }}</el-descriptions-item>
<el-descriptions-item label="中考成绩">{{ studentData.totalScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="语文成绩">{{ studentData.chineseScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="数学成绩">{{ studentData.mathScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="英语成绩">{{ studentData.englishScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="科学成绩">{{ studentData.scienceScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="社会成绩">{{ studentData.socialScore || '-' }}</el-descriptions-item>
<el-descriptions-item label="体育成绩">{{ studentData.peScore || '-' }}</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-descriptions :column="2" border>
<el-descriptions-item label="报考专业">{{ studentData.majorName || studentData.appliedMajor || '-' }}</el-descriptions-item>
<el-descriptions-item label="专业代码">{{ studentData.majorCode || '-' }}</el-descriptions-item>
<el-descriptions-item label="校服尺码">{{ studentData.uniformSize || '-' }}</el-descriptions-item>
</el-descriptions>
</el-card>
<!-- 其他信息 -->
<el-card class="detail-card" shadow="never" v-if="studentData.specialties || studentData.awards">
<template #header>
<div class="card-header">
<span class="section-title">其他信息</span>
</div>
</template>
<el-descriptions :column="1" border>
<el-descriptions-item label="特长爱好" v-if="studentData.specialties">{{ studentData.specialties }}</el-descriptions-item>
<el-descriptions-item label="获奖情况" v-if="studentData.awards">{{ studentData.awards }}</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-descriptions :column="2" border>
<el-descriptions-item label="当前状态">
<el-tag :type="getStatusType(studentData.currentStatus || studentData.enrollmentStatus)">
{{ getStatusText(studentData.currentStatus || studentData.enrollmentStatus) }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="处理人">{{ studentData.currentHandlerName || '-' }}</el-descriptions-item>
<el-descriptions-item label="缴费状态">
<span v-if="studentData.paymentStatus === '1'">
<el-tag type="success">已缴费</el-tag>
</span>
<span v-else>
<el-tag type="info">未缴费</el-tag>
</span>
</el-descriptions-item>
<el-descriptions-item label="完成状态">
<span v-if="isStudentCompleted">
<el-tag type="success">已完成</el-tag>
</span>
<span v-else>
<el-tag type="info">未完成</el-tag>
</span>
</el-descriptions-item>
<el-descriptions-item label="报名时间">{{ formatTime(studentData.createTime || studentData.applicationTime) }}</el-descriptions-item>
<el-descriptions-item label="最后更新时间">{{ formatTime(studentData.updateTime) }}</el-descriptions-item>
</el-descriptions>
</el-card>
<!-- 备注信息 -->
<el-card class="detail-card" shadow="never" v-if="studentData.remark">
<template #header>
<div class="card-header">
<span class="section-title">备注信息</span>
</div>
</template>
<div class="remark-content">
{{ studentData.remark }}
</div>
</el-card>
</div>
<template #footer>
<span class="dialog-footer">
<el-button @click="dialogVisible = false">关闭</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import { ref, computed } from 'vue';
import type { EnrollmentProcessVO } from '@/api/zsjy/enrollmentProcess';
import type { EnrollmentInfoVO } from '@/api/zsjy/enrollment/types';
// 合并类型,处理可能存在的字段
type StudentDataType = Partial<EnrollmentProcessVO> & Partial<EnrollmentInfoVO> & {
// 额外可能存在的字段
studentName?: string;
majorName?: string;
province?: string;
}
const props = defineProps({
visible: {
type: Boolean,
default: false
},
studentData: {
type: Object as () => StudentDataType,
default: () => ({})
}
});
const emit = defineEmits(['update:visible']);
// 对话框可见性
const dialogVisible = computed({
get: () => props.visible,
set: (value) => {
emit('update:visible', value);
}
});
// 判断学生是否已完成
const isStudentCompleted = computed(() => {
const isCompleted = props.studentData.isCompleted;
// 显式检查字符串和数字类型的值
return String(isCompleted) === '1';
});
// 格式化身份证号(隐藏中间部分)
const formatIdCard = (idCard: string | undefined) => {
if (!idCard) return '-';
if (idCard.length >= 18) {
return idCard.substring(0, 6) + '********' + idCard.substring(14);
}
return idCard;
};
// 格式化日期
const formatDate = (date: string | Date | undefined) => {
if (!date) return '-';
const d = new Date(date);
return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;
};
// 格式化时间
const formatTime = (time: string | Date | undefined) => {
if (!time) return '-';
const date = new Date(time);
return date.toLocaleString('zh-CN', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit'
});
};
// 获取状态类型
const getStatusType = (status: string | undefined) => {
if (!status) return 'info';
switch (status) {
case '0': return 'info'; // 待审核
case '1': return 'warning'; // 信息审核中
case '2': return 'warning'; // 录取处理中
case '3': return 'warning'; // 待最终确认
case '4': return 'success'; // 录取完成
case '9': return 'danger'; // 已驳回
default: return 'info';
}
};
// 获取状态文本
const getStatusText = (status: string | undefined) => {
if (!status) return '未知状态';
switch (status) {
case '0': return '待审核';
case '1': return '信息审核中';
case '2': return '录取处理中';
case '3': return '待最终确认';
case '4': return '录取完成';
case '9': return '已驳回';
default: return '未知状态';
}
};
</script>
<style scoped>
.student-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;
}
.student-detail-dialog :deep(.el-dialog__title) {
color: white;
font-size: 18px;
font-weight: 600;
}
.student-detail-dialog :deep(.el-dialog__body) {
padding: 20px 24px;
}
.detail-container {
max-height: 70vh;
overflow-y: auto;
padding-right: 5px;
}
.detail-card {
margin-bottom: 16px;
border-radius: 8px;
}
.detail-card:last-child {
margin-bottom: 0;
}
.card-header {
display: flex;
justify-content: space-between;
align-items: center;
}
.section-title {
font-size: 16px;
font-weight: 600;
position: relative;
padding-left: 10px;
}
.section-title::before {
content: '';
width: 3px;
height: 16px;
background: linear-gradient(135deg, rgb(93, 135, 255), rgb(73, 190, 255));
border-radius: 2px;
position: absolute;
left: 0;
top: 50%;
transform: translateY(-50%);
}
.remark-content {
background-color: #f8f9fa;
padding: 12px;
border-radius: 4px;
border-left: 3px solid #409eff;
}
:deep(.el-descriptions__label) {
width: 120px;
background-color: #f7f7f7 !important;
}
/* 美化滚动条 */
.detail-container::-webkit-scrollbar {
width: 6px;
height: 6px;
}
.detail-container::-webkit-scrollbar-thumb {
border-radius: 3px;
background-color: #c0c4cc;
}
.detail-container::-webkit-scrollbar-track {
border-radius: 3px;
background-color: #f2f2f2;
}
</style>
@@ -0,0 +1,755 @@
<template>
<div class="p-2 page-container">
<!-- 搜索条件区域 -->
<transition :enter-active-class="animate.searchAnimate?.enter" :leave-active-class="animate.searchAnimate?.leave">
<div ref="searchRef" v-show="showSearch" class="mb-[10px]">
<el-card shadow="hover">
<el-form ref="queryFormRef" :model="queryParams" label-width="100px">
<!-- 第一行条件 -->
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="学生姓名" prop="studentName">
<el-input v-model="queryParams.studentName" placeholder="请输入学生姓名" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="身份证号" prop="idCard">
<el-input v-model="queryParams.idCard" placeholder="请输入身份证号" clearable @keyup.enter="handleQuery" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="所属学院" prop="collegeId">
<el-select v-model="queryParams.params.collegeId" placeholder="请选择学院" clearable class="w-100" @change="onSearchCollegeChange">
<el-option
v-for="college in collegeOptions"
:key="college.deptId"
:label="college.deptName"
:value="college.deptCategory"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="专业" prop="majorId">
<el-select v-model="queryParams.params.majorId" placeholder="请选择专业" clearable class="w-100">
<el-option
v-for="major in searchMajorOptions"
:key="major.value"
:label="major.label"
:value="major.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行条件 -->
<el-row :gutter="20">
<el-col :span="6">
<el-form-item label="性别" prop="gender">
<el-select v-model="queryParams.params.gender" placeholder="请选择性别" clearable >
<el-option v-for="option in genderOptions" :key="option.code" :label="option.name" :value="option.code" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="当前状态" prop="currentStatus">
<el-select v-model="queryParams.currentStatus" placeholder="请选择状态" clearable >
<el-option v-for="option in statusOptions" :key="option.code" :label="option.name" :value="option.code" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="地区" prop="province">
<el-select v-model="queryParams.params.province" placeholder="请选择地区" clearable>
<el-option v-for="option in regionOptions" :key="option.code" :label="option.name" :value="option.code" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="缴费状态" prop="paymentStatus">
<el-select v-model="queryParams.params.paymentStatus" placeholder="请选择缴费状态" clearable>
<el-option :label="'未缴费'" :value="'0'" />
<el-option :label="'已缴费'" :value="'1'" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行条件 -->
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="报名日期" prop="dateRange">
<el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" style="width: 380px" value-format="YYYY-MM-DD" @change="handleDateRangeChange" />
</el-form-item>
</el-col>
</el-row>
<!-- 操作按钮 -->
<el-row>
<el-col :span="24" class="search-btn-container">
<el-form-item>
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button icon="Download" @click="handleExport">导出</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</transition>
<!-- 表格数据展示 -->
<el-card shadow="never" class="button-card table-card">
<template #header>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button icon="Download" type="primary" plain @click="handleExport">导出数据</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
</template>
<el-table v-loading="tableLoading" :data="enrollmentList" stripe border style="width: 100%">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="studentName" label="学生姓名" min-width="100" align="center" />
<el-table-column prop="idCard" label="身份证号" min-width="180" align="center" :formatter="formatIdCard" show-overflow-tooltip />
<el-table-column prop="gender" label="性别" width="80" align="center">
<template #default="scope">
{{ scope.row.gender === 'M' ? '男' : '女' }}
</template>
</el-table-column>
<el-table-column label="所属学院" min-width="150" align="center" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.applied_major }}
</template>
</el-table-column>
<el-table-column label="专业" min-width="150" align="center" show-overflow-tooltip>
<template #default="scope">
{{ scope.row.majorName || scope.row.applied_major || '-' }}
</template>
</el-table-column>
<el-table-column prop="province" label="地区" min-width="100" align="center" />
<el-table-column prop="currentStatus" label="当前状态" min-width="120" align="center">
<template #default="scope">
<el-tag :type="getStatusType(scope.row.currentStatus)">{{ getStatusText(scope.row.currentStatus) }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="paymentStatus" label="缴费状态" width="100" align="center">
<template #default="scope">
<el-tag :type="scope.row.paymentStatus === '1' ? 'success' : 'info'">
{{ scope.row.paymentStatus === '1' ? '已缴费' : '未缴费' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="isCompleted" label="是否完成" width="100" align="center">
<template #default="scope">
<el-tag :type="scope.row.isCompleted === 1 || scope.row.isCompleted === '1' ? 'success' : 'info'">
{{ scope.row.isCompleted === 1 || scope.row.isCompleted === '1' ? '已完成' : '未完成' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createTime" label="报名时间" min-width="160" align="center" sortable />
<el-table-column label="操作" fixed="right" align="center" width="120">
<template #default="scope">
<el-button link type="primary" icon="View" @click="handleView(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
@pagination="getList"
/>
</el-card>
<!-- 学生详情对话框 -->
<StudentDetailDialog
v-model:visible="detailDialogVisible"
:student-data="currentStudent"
/>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, onMounted, getCurrentInstance } from 'vue';
import { listEnrollmentProcess, exportEnrollmentProcess, EnrollmentProcessQuery, EnrollmentProcessVO, getEnrollmentProcess } from '@/api/zsjy/enrollmentProcess';
import { listDept } from '@/api/system/dept';
import type { DeptVO } from '@/api/system/dept/types';
import StudentDetailDialog from './components/StudentDetailDialog.vue';
const { proxy } = getCurrentInstance();
const { zsjy_gender, sys_yes_no, zsjy_major, zsjy_college } = proxy?.useDict('zsjy_gender', 'sys_yes_no', 'zsjy_major', 'zsjy_college');
// 设置动画效果
const animate = {
searchAnimate: {
enter: 'animate__fadeInDown',
leave: 'animate__fadeOutUp'
}
};
// 查询条件
const queryFormRef = ref();
const showSearch = ref(true);
const queryParams = reactive<EnrollmentProcessQuery>({
studentName: undefined,
idCard: undefined,
currentStatus: undefined,
pageNum: 1,
pageSize: 10,
params: {
beginCreateTime: undefined,
endCreateTime: undefined,
collegeId: undefined,
majorId: undefined,
province: undefined,
gender: undefined,
paymentStatus: undefined
}
});
// 日期范围
const dateRange = ref<[Date, Date]>();
// 学院和专业选项
const collegeOptions = ref<DeptVO[]>([]);
const majorOptionsByCollege = ref<{[key: string]: DeptVO[]}>({});
const searchMajorOptions = ref<any[]>([]);
// 所有专业数据(包含学院信息)
const allMajors = ref<any[]>([
{ code: '1', name: '计算机科学与技术', collegeCode: 'CS' },
{ code: '2', name: '软件工程', collegeCode: 'CS' },
{ code: '3', name: '数据科学', collegeCode: 'CS' },
{ code: '4', name: '电子信息工程', collegeCode: 'EE' },
{ code: '5', name: '通信工程', collegeCode: 'EE' },
{ code: '6', name: '自动化', collegeCode: 'EE' },
{ code: '7', name: '机械设计制造及其自动化', collegeCode: 'ME' },
{ code: '8', name: '机械电子工程', collegeCode: 'ME' },
{ code: '9', name: '工商管理', collegeCode: 'EC' },
{ code: '10', name: '会计学', collegeCode: 'EC' },
{ code: '11', name: '汉语言文学', collegeCode: 'LA' },
{ code: '12', name: '英语', collegeCode: 'LA' }
]);
/** 搜索区域学院选择变化处理 */
const onSearchCollegeChange = (selectedCollegeId: string) => {
console.log('搜索区域学院选择变化:', selectedCollegeId);
// 清空专业选择
queryParams.params.majorId = undefined;
if (!selectedCollegeId) {
// 如果没有选择学院,清空专业选项
searchMajorOptions.value = [];
return;
}
// 根据选择的学院获取对应的专业列表
const majors: any[] = [];
// 首先从字典中获取
if (zsjy_major?.value) {
const filteredMajors = zsjy_major.value.filter(
item => item.cssClass === selectedCollegeId
);
majors.push(...filteredMajors.map(m => ({ value: m.value, label: m.label })));
}
// 然后从部门数据中获取
const college = collegeOptions.value.find(c => c.deptCategory === selectedCollegeId);
if (college && majorOptionsByCollege.value[college.deptId]) {
const deptMajors = majorOptionsByCollege.value[college.deptId];
majors.push(...deptMajors.map(m => ({
value: m.deptName,
label: m.deptName
})));
}
// 去除可能的重复项
const uniqueMajors = majors.filter((item, index, self) =>
index === self.findIndex(m => m.value === item.value)
);
// 更新专业选项
searchMajorOptions.value = uniqueMajors;
console.log('搜索专业选项已更新:', searchMajorOptions.value);
};
/** 获取学院和专业数据 */
const getCollegeAndMajorData = async () => {
try {
console.log('开始加载学院和专业数据...');
// 强制刷新字典数据
console.log('加载学院字典数据...');
try {
const dictResponse = await proxy?.getDicts("zsjy_college");
console.log('学院字典加载结果:', dictResponse);
} catch (dictError) {
console.error('加载字典数据出错:', dictError);
}
// 获取所有部门数据
console.log('加载部门数据...');
const res = await listDept();
if (res.code === 200 && res.data) {
// 找出学院 - 类别编码以xy开头的部门
const colleges = res.data.filter((dept: DeptVO) => {
return dept.deptCategory && dept.deptCategory.startsWith('xy');
});
collegeOptions.value = colleges;
console.log('获取到的学院数据:', colleges.map(c => ({
deptId: c.deptId,
deptName: c.deptName,
deptCategory: c.deptCategory
})));
// 如果没有找到学院数据,尝试其他可能的过滤条件
if (colleges.length === 0) {
console.log('未找到xy开头的学院,尝试其他可能的部门...');
// 尝试查找所有非叶子节点部门
const possibleColleges = res.data.filter((dept: DeptVO) => {
return !dept.isLeaf;
});
if (possibleColleges.length > 0) {
collegeOptions.value = possibleColleges;
console.log('找到可能的学院:', possibleColleges.map(c => ({
deptId: c.deptId,
deptName: c.deptName,
deptCategory: c.deptCategory
})));
}
}
// 找出专业 - 类别编码以zy开头的部门
const allMajors = res.data.filter((dept: DeptVO) => {
return dept.deptCategory && dept.deptCategory.startsWith('zy');
});
console.log('获取到的所有专业数据:', allMajors.length);
// 按照上下级关系组织专业
colleges.forEach((college: DeptVO) => {
// 找出该学院下的所有专业
const majors = allMajors.filter((dept: DeptVO) =>
// 使用上下级关系或其他关联关系确定专业归属哪个学院
dept.parentId === college.deptId
);
majorOptionsByCollege.value[college.deptId] = majors;
if (majors.length > 0) {
console.log(`学院 ${college.deptName} 的专业数量: ${majors.length}`);
}
});
return {
success: true,
collegeCount: collegeOptions.value.length
};
} else {
console.error('部门数据返回异常:', res);
return {
success: false,
error: '部门数据返回异常'
};
}
} catch (error) {
console.error('获取部门数据出错:', error);
proxy?.$modal.msgError('获取学院和专业数据失败');
return {
success: false,
error: error
};
}
};
const regionOptions = ref<any[]>([
{ code: '330000', name: '浙江省' },
{ code: '320000', name: '江苏省' }
]);
const statusOptions = ref<any[]>([
{ code: '0', name: '待审核' },
{ code: '1', name: '信息审核中' },
{ code: '2', name: '录取处理中' },
{ code: '3', name: '待最终确认' },
{ code: '4', name: '录取完成' },
{ code: '9', name: '已驳回' }
]);
const genderOptions = ref<any[]>([
{ code: 'M', name: '男' },
{ code: 'F', name: '女' }
]);
// 报名列表数据
const enrollmentList = ref<EnrollmentProcessVO[]>([]);
const total = ref(0);
// 加载状态
const tableLoading = ref(false);
// 详情对话框相关
const detailDialogVisible = ref(false);
const currentStudent = ref<Partial<EnrollmentProcessVO>>({});
const detailLoading = ref(false);
// 初始化
onMounted(async () => {
// 获取学院和专业数据
await getCollegeAndMajorData();
await getList();
});
// 处理日期范围变化
const handleDateRangeChange = (val: [Date, Date] | null) => {
if (val && val.length === 2) {
queryParams.params = {
...queryParams.params,
beginCreateTime: val[0],
endCreateTime: val[1]
};
} else {
queryParams.params = {
...queryParams.params,
beginCreateTime: undefined,
endCreateTime: undefined
};
}
};
// 处理查询
const handleQuery = async () => {
queryParams.pageNum = 1;
getList();
};
// 获取列表数据
const getList = async () => {
tableLoading.value = true;
try {
console.log('查询参数:', queryParams);
// 检查API路径是否正确
console.log('调用API: listEnrollmentProcess', listEnrollmentProcess);
// 尝试调用API
const res = await listEnrollmentProcess(queryParams);
console.log('API响应:', res);
if (res && res.code === 200) {
console.log('获取到数据条数:', res.rows?.length || 0);
console.log('原始数据详情:', JSON.stringify(res.rows));
// 检查原始数据中是否包含学院信息
if (res.rows && res.rows.length > 0) {
const firstRow = res.rows[0];
console.log('第一行数据的所有字段:', Object.keys(firstRow));
console.log('第一行数据的学院相关字段:', {
collegeName: firstRow.collegeName,
college_name: firstRow.college_name,
collage_name: firstRow.collage_name,
collegeId: firstRow.collegeId,
college_id: firstRow.college_id,
collage_id: firstRow.collage_id,
applied_major: firstRow.applied_major
});
}
// 简单处理,不做额外转换
enrollmentList.value = res.rows || [];
total.value = res.total || 0;
} else {
console.error('API返回错误:', res);
}
} catch (error) {
console.error('获取报名数据失败:', error);
} finally {
tableLoading.value = false;
}
};
// 重置查询条件
const resetQuery = () => {
dateRange.value = undefined;
queryFormRef.value.resetFields();
queryParams.params = {
beginCreateTime: undefined,
endCreateTime: undefined,
collegeId: undefined,
majorId: undefined,
province: undefined,
gender: undefined,
paymentStatus: undefined
};
// 重置后清空专业选项
searchMajorOptions.value = [];
handleQuery();
};
// 处理导出
const handleExport = () => {
exportEnrollmentProcess(queryParams);
};
// 查看详情
const handleView = async (row: EnrollmentProcessVO) => {
detailLoading.value = true;
try {
let processData: any = {};
// 如果是从报名信息表里直接获取的数据(可能没有流程ID)
if (row.id) {
const res = await getEnrollmentProcess(row.id);
if (res && res.code === 200) {
processData = res.data;
} else {
// 回退到使用行数据
processData = { ...row };
}
} else {
// 使用行数据(可能是从enrollment_info表里直接获取的)
processData = { ...row };
}
// 处理完成状态,确保它是字符串类型
if (processData.isCompleted !== undefined) {
processData.isCompleted = String(processData.isCompleted);
}
// 处理缴费状态,确保它不为空
if (processData.paymentStatus === undefined || processData.paymentStatus === null) {
processData.paymentStatus = '0'; // 默认为未缴费
}
// 设置当前流程数据
currentStudent.value = processData;
// 打开详情对话框
detailDialogVisible.value = true;
} catch (error) {
console.error('获取流程详情失败:', error);
// 即使获取详情失败,也尝试使用行数据显示
const processData = { ...row };
// 处理完成状态,确保它是字符串类型
if (processData.isCompleted !== undefined) {
processData.isCompleted = String(processData.isCompleted);
}
// 处理缴费状态,确保它不为空
if (processData.paymentStatus === undefined || processData.paymentStatus === null) {
processData.paymentStatus = '0'; // 默认为未缴费
}
currentStudent.value = processData;
detailDialogVisible.value = true;
} finally {
detailLoading.value = false;
}
};
// 格式化身份证号(隐藏中间部分)
const formatIdCard = (row: any) => {
if (!row.idCard) return '';
const idCard = row.idCard.toString();
if (idCard.length >= 18) {
return idCard.substring(0, 6) + '********' + idCard.substring(14);
}
return idCard;
};
// 获取状态类型
const getStatusType = (status: string) => {
switch (status) {
case '0': return 'info'; // 待审核
case '1': return 'warning'; // 信息审核中
case '2': return 'warning'; // 录取处理中
case '3': return 'warning'; // 待最终确认
case '4': return 'success'; // 录取完成
case '9': return 'danger'; // 已驳回
default: return 'info';
}
};
// 获取状态文本
const getStatusText = (status: string) => {
switch (status) {
case '0': return '待审核';
case '1': return '信息审核中';
case '2': return '录取处理中';
case '3': return '待最终确认';
case '4': return '录取完成';
case '9': return '已驳回';
default: return '未知状态';
}
};
// 获取学院名称的方法
const getCollegeName = (row: any): string => {
// 如果已有学院名称,直接返回
if (row.collegeName) {
return row.collegeName;
}
// 检查下划线命名方式
if (row.college_name) {
return row.college_name;
}
// 如果有学院代码,尝试从映射表获取
let collegeId = row.collegeId || row.college_id;
if (collegeId) {
const collegeMap: {[key: string]: string} = {
'CS': '计算机科学与技术学院',
'EE': '电子信息工程学院',
'ME': '机械工程学院',
'EC': '经济管理学院',
'LA': '文理学院'
};
if (collegeMap[collegeId]) {
return collegeMap[collegeId];
}
}
// 默认返回空字符串
return '-';
};
// 从代码获取学院名称
const getCollegeNameFromCode = (code: string): string => {
if (!code) return '-';
// 从字典获取
if (zsjy_college?.value) {
const collegeDict = zsjy_college.value.find(dict => dict.value === code);
if (collegeDict) {
return collegeDict.label;
}
}
// 从硬编码映射获取
const collegeMap: {[key: string]: string} = {
'CS': '计算机科学与技术学院',
'EE': '电子信息工程学院',
'ME': '机械工程学院',
'EC': '经济管理学院',
'LA': '文理学院',
'XY001': '计算机科学与技术学院',
'XY002': '电子信息工程学院',
'XY003': '机械工程学院',
'XY004': '经济管理学院',
'XY005': '文理学院'
};
return collegeMap[code] || code;
};
</script>
<style scoped>
.page-container {
padding: var(--space-sm);
}
.search-card {
margin-bottom: var(--space-lg);
border-radius: var(--border-radius-lg);
box-shadow: var(--art-box-shadow-sm) !important;
}
.table-card {
border-radius: var(--border-radius-lg);
margin-bottom: var(--space-lg);
box-shadow: var(--art-box-shadow-sm) !important;
}
.search-btn-container {
display: flex;
justify-content: right;
margin-top: var(--space-lg);
}
.mr-1 {
margin-right: 5px;
}
.w-100 {
width: 100% !important;
}
:deep(.el-table th) {
background-color: var(--tableHeaderBg) !important;
color: var(--tableHeaderTextColor) !important;
font-weight: 500;
}
:deep(.el-form-item__label) {
font-weight: 500;
color: var(--art-text-gray-700);
}
:deep(.el-button--primary) {
background-color: rgb(var(--art-primary));
border-color: rgb(var(--art-primary));
}
:deep(.el-button--primary.is-plain) {
color: rgb(var(--art-primary));
background: rgb(var(--art-bg-primary));
border-color: rgba(var(--art-primary), 0.2);
}
:deep(.el-select) {
width: 100%;
}
:deep(.el-date-editor) {
width: 100% !important;
}
:deep(.el-tag--primary) {
background-color: rgb(var(--art-bg-primary));
border-color: rgba(var(--art-primary), 0.2);
color: rgb(var(--art-primary));
}
:deep(.el-tag--success) {
background-color: rgb(var(--art-bg-success));
border-color: rgba(var(--art-success), 0.2);
color: rgb(var(--art-success));
}
:deep(.el-tag--info) {
background-color: rgb(var(--art-bg-info));
border-color: rgba(var(--art-info), 0.2);
color: rgb(var(--art-info));
}
:deep(.el-tag--warning) {
background-color: rgb(var(--art-bg-warning));
border-color: rgba(var(--art-warning), 0.2);
color: rgb(var(--art-warning));
}
:deep(.el-tag--danger) {
background-color: rgb(var(--art-bg-error));
border-color: rgba(var(--art-error), 0.2);
color: rgb(var(--art-error));
}
.mb8 {
margin-bottom: 8px;
}
</style>
Binary file not shown.

After

Width:  |  Height:  |  Size: 320 KiB