更新项目
This commit is contained in:
parent
09f7175f82
commit
1357b3fbf4
|
|
@ -2,25 +2,25 @@ import request from '@/utils/request'
|
|||
|
||||
// 资产信息列表
|
||||
export function infoLists(params?: Record<string, any>) {
|
||||
return request.get({ url: '/info/list', params })
|
||||
return request.get({ url: '/asset/info/list', params })
|
||||
}
|
||||
|
||||
// 资产信息详情
|
||||
export function infoDetail(params: Record<string, any>) {
|
||||
return request.get({ url: '/info/detail', params })
|
||||
return request.get({ url: '/asset/info/detail', params })
|
||||
}
|
||||
|
||||
// 资产信息新增
|
||||
export function infoAdd(params: Record<string, any>) {
|
||||
return request.post({ url: '/info/add', params })
|
||||
return request.post({ url: '/asset/info/add', params })
|
||||
}
|
||||
|
||||
// 资产信息编辑
|
||||
export function infoEdit(params: Record<string, any>) {
|
||||
return request.post({ url: '/info/edit', params })
|
||||
return request.post({ url: '/asset/info/edit', params })
|
||||
}
|
||||
|
||||
// 资产信息删除
|
||||
export function infoDelete(params: Record<string, any>) {
|
||||
return request.post({ url: '/info/del', params })
|
||||
return request.post({ url: '/asset/info/del', params })
|
||||
}
|
||||
|
|
|
|||
|
|
@ -47,10 +47,6 @@ export function useDictOptions<T = any>(options: Options) {
|
|||
}
|
||||
}
|
||||
|
||||
// useDictData<{
|
||||
// dict: any[]
|
||||
// }>(['dict'])
|
||||
|
||||
export function useDictData<T = any>(id: number) {
|
||||
const dictData: any = reactive({})
|
||||
const refresh = async () => {
|
||||
|
|
@ -59,10 +55,11 @@ export function useDictData<T = any>(id: number) {
|
|||
})
|
||||
Object.assign(dictData, data.lists)
|
||||
}
|
||||
refresh()
|
||||
const initPromise = refresh()
|
||||
|
||||
return {
|
||||
dictData: dictData as T,
|
||||
refresh
|
||||
refresh,
|
||||
initPromise
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
>
|
||||
<el-option label="全部" value="" />
|
||||
<el-option
|
||||
v-for="(item, index) in dictData.asset_classification"
|
||||
v-for="(item, index) in dictData"
|
||||
:key="index"
|
||||
:label="item.name"
|
||||
:value="item.value"
|
||||
|
|
@ -27,7 +27,15 @@
|
|||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否为固定资产" prop="isFixedAsset">
|
||||
<el-input class="w-[280px]" v-model="queryParams.isFixedAsset" />
|
||||
<el-select
|
||||
v-model="queryParams.isFixedAsset"
|
||||
class="w-[280px]"
|
||||
clearable
|
||||
>
|
||||
<el-option label="全部" value="" />
|
||||
<el-option label="固定资产" :value="0"/>
|
||||
<el-option label="非固定资产" :value="1"/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="非固定资产库存信息ID" prop="consumableId">
|
||||
<el-input class="w-[280px]" v-model="queryParams.consumableId" />
|
||||
|
|
@ -56,11 +64,7 @@
|
|||
<el-table-column label="资产名称" prop="assetName" min-width="100" />
|
||||
<el-table-column label="规格型号" prop="model" min-width="100" />
|
||||
<el-table-column label="品牌" prop="brand" min-width="100" />
|
||||
<el-table-column label="资产类别" prop="category" min-width="100">
|
||||
<template #default="{ row }">
|
||||
<dict-value :options="dictData.asset_classification" :value="row.category" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="资产类别" prop="category" min-width="100" />
|
||||
<el-table-column label="是否为固定资产" prop="isFixedAsset" min-width="100" />
|
||||
<el-table-column label="非固定资产库存信息ID" prop="consumableId" min-width="100" />
|
||||
<el-table-column label="资产描述" prop="description" min-width="100" />
|
||||
|
|
@ -94,7 +98,6 @@
|
|||
<edit-popup
|
||||
v-if="showEdit"
|
||||
ref="editRef"
|
||||
:dict-data="dictData"
|
||||
@success="getLists"
|
||||
@close="showEdit = false"
|
||||
/>
|
||||
|
|
@ -116,16 +119,13 @@ const queryParams = reactive({
|
|||
isFixedAsset: '',
|
||||
consumableId: '',
|
||||
})
|
||||
|
||||
const dictLoading = ref(false)
|
||||
const { pager, getLists, resetPage, resetParams } = usePaging({
|
||||
fetchFun: infoLists,
|
||||
params: queryParams
|
||||
})
|
||||
|
||||
const { dictData } = useDictData<{
|
||||
asset_classification: any[]
|
||||
}>(7)
|
||||
|
||||
const { dictData } = useDictData<Array<{name: string, value: any}>>(7)
|
||||
|
||||
const handleAdd = async () => {
|
||||
showEdit.value = true
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@
|
|||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="所属专业" prop="majorId">
|
||||
<el-select v-model="queryParams.majorId" class="w-[280px]" clearable>
|
||||
<el-select v-model="queryParams.majorId" class="w-[280px]" clearable @change="getLists">
|
||||
<el-option
|
||||
v-for="college in getMajorLists.lists"
|
||||
:key="college.id"
|
||||
|
|
@ -33,9 +33,6 @@
|
|||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班主任用户ID" prop="headTeacherId">
|
||||
<el-input class="w-[280px]" v-model="queryParams.headTeacherId" />
|
||||
</el-form-item>
|
||||
<el-form-item label="班级状态" prop="classStatus">
|
||||
<el-select
|
||||
v-model="queryParams.classStatus"
|
||||
|
|
@ -123,7 +120,6 @@ const { pager, getLists, resetPage, resetParams } = usePaging({
|
|||
for (const cls of classData.lists) {
|
||||
try {
|
||||
const progressRes = await taskSearch({ classId: cls.id })
|
||||
// 假设progressRes包含一个status字段表示进度状态
|
||||
cls.progress = progressRes.arrangementProgress
|
||||
} catch (err) {
|
||||
console.error(`获取班级${cls.id}进度失败`, err)
|
||||
|
|
@ -148,6 +144,7 @@ const fetchMajorLists = async () => {
|
|||
try {
|
||||
const res = await majorLists(queryParams)
|
||||
getMajorLists.value = res
|
||||
await getLists()
|
||||
} catch (err) {
|
||||
feedback.msgError('获取专业列表失败')
|
||||
}
|
||||
|
|
|
|||
|
|
@ -93,7 +93,7 @@
|
|||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import type { FormInstance, UploadFile, UploadFiles } from 'element-plus'
|
||||
import type { PropType } from 'vue'
|
||||
|
||||
import { courseAdd, courseDetail, courseEdit, courseUploadFile } from '@/api/course'
|
||||
|
|
@ -180,11 +180,15 @@ const fetchCourseTypeLists = async () => {
|
|||
}
|
||||
}
|
||||
|
||||
const handleUploadChange = async (file: { raw: string | Blob }) => {
|
||||
if (!file) return
|
||||
const handleUploadChange = async (uploadFile: UploadFile, uploadFiles: UploadFiles) => {
|
||||
// 检查raw属性是否存在
|
||||
if (!uploadFile.raw) {
|
||||
console.error('上传文件不存在')
|
||||
return
|
||||
}
|
||||
try {
|
||||
const formData = new FormData()
|
||||
formData.append('file', file.raw)
|
||||
formData.append('file', uploadFile.raw)
|
||||
const raw = await courseUploadFile(formData)
|
||||
// 上传成功后的处理
|
||||
console.log(raw.data.code)
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ html, body {
|
|||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 9999; /* 提高层级,避免被其他元素覆盖 */
|
||||
z-index: 10; /* 提高层级,避免被其他元素覆盖 */
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -68,7 +68,6 @@ export class Request {
|
|||
|
||||
const result = await response.json()
|
||||
|
||||
// 执行响应拦截器
|
||||
let finalResult = { ...result, status: response.status }
|
||||
for (const interceptor of this.interceptors.response) {
|
||||
finalResult = await interceptor(finalResult)
|
||||
|
|
@ -110,7 +109,6 @@ request.useRequestInterceptor(async (config) => {
|
|||
config.headers.Authorization = `Bearer ${token}`
|
||||
}
|
||||
|
||||
// 示例:对特定接口的身份证号进行格式验证
|
||||
if (config.url.includes('/enrollment/') && config.params?.idCard) {
|
||||
const idCardRegex = /(^\d{18}$)|(^\d{17}(\d|X|x)$)/
|
||||
if (!idCardRegex.test(config.params.idCard)) {
|
||||
|
|
@ -128,7 +126,6 @@ request.useResponseInterceptor(async (response) => {
|
|||
// 处理业务错误
|
||||
switch (response.code) {
|
||||
case 401:
|
||||
// token过期,跳转到登录页
|
||||
window.location.href = '/login'
|
||||
break
|
||||
case 403:
|
||||
|
|
@ -137,14 +134,12 @@ request.useResponseInterceptor(async (response) => {
|
|||
throw new Error(response.message || '请求失败')
|
||||
}
|
||||
}
|
||||
|
||||
return response.data || response
|
||||
return response
|
||||
})
|
||||
|
||||
// 添加错误处理拦截器
|
||||
request.useResponseInterceptor(async (response) => {
|
||||
// 你可以在这里添加更多的错误处理逻辑
|
||||
return response
|
||||
}) // true 表示添加到拦截器数组末尾
|
||||
})
|
||||
|
||||
export default request
|
||||
|
|
@ -1,594 +0,0 @@
|
|||
<template>
|
||||
<div class="px-[30px] py-5 user-info min-h-full flex flex-col">
|
||||
<!-- 标签页切换 -->
|
||||
<el-tabs v-model="activeTab" type="card" class="mb-6">
|
||||
<el-tab-pane label="新生报名" name="enroll">
|
||||
<!-- 报名表单区域 -->
|
||||
<div class="border-b border-br pb-5">
|
||||
<span class="text-2xl font-medium">新生报名</span>
|
||||
</div>
|
||||
<el-card class="!border-none mb-4" shadow="never">
|
||||
<div class="lg:flex gap-6">
|
||||
<!-- 基本信息表单 -->
|
||||
<el-card class="!border-none flex-1" shadow="never">
|
||||
<el-form
|
||||
layout="vertical"
|
||||
:model="studentData.baseInfo"
|
||||
class="mt-4"
|
||||
>
|
||||
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
||||
<el-form-item label="学生姓名">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.name"
|
||||
placeholder="请输入姓名"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别">
|
||||
<el-radio-group
|
||||
v-model="studentData.baseInfo.gender"
|
||||
:disabled="submission"
|
||||
>
|
||||
<el-radio :label="0">男</el-radio>
|
||||
<el-radio :label="1">女</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="身份证号">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.idCard"
|
||||
placeholder="请输入18位身份证号"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="出生日期">
|
||||
<el-date-picker
|
||||
v-model="studentData.baseInfo.birthday"
|
||||
type="datetime"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD"
|
||||
placeholder="请输入出生日期"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="联系方式">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.phone"
|
||||
placeholder="请输入手机号码"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="电子邮箱">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.email"
|
||||
placeholder="请输入电子邮箱"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="籍贯">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.nativePlace"
|
||||
placeholder="请输入籍贯"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="民族">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.nationality"
|
||||
placeholder="请输入民族"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="政治面貌">
|
||||
<el-select
|
||||
v-model="studentData.baseInfo.politicalStatus"
|
||||
clearable
|
||||
:disabled="submission"
|
||||
>
|
||||
<el-option label="群众" :value="0" />
|
||||
<el-option label="团员" :value="1" />
|
||||
<el-option label="党员" :value="2" />
|
||||
<el-option label="其他" :value="3" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="毕业年份">
|
||||
<el-input-number
|
||||
v-model="studentData.baseInfo.graduationYear"
|
||||
placeholder="请输入毕业年份"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="毕业院校">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.previousSchool"
|
||||
placeholder="请输入毕业院校"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校类型">
|
||||
<el-select
|
||||
v-model="studentData.baseInfo.schoolType"
|
||||
clearable
|
||||
:disabled="submission"
|
||||
>
|
||||
<el-option label="普通高中" :value="1" />
|
||||
<el-option label="职业高中" :value="2" />
|
||||
<el-option label="中专" :value="3" />
|
||||
<el-option label="大专" :value="4" />
|
||||
<el-option label="本科" :value="5" />
|
||||
<el-option label="其他" :value="6" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="家庭住址"
|
||||
class="md:col-span-2"
|
||||
>
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.homeAddress"
|
||||
placeholder="请输入详细家庭住址"
|
||||
type="textarea"
|
||||
:rows="3"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="紧急联系人">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.emergencyContact"
|
||||
placeholder="请输入紧急联系人姓名"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="紧急联系电话">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.emergencyPhone"
|
||||
placeholder="请输入紧急联系人电话"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="与紧急联系人关系">
|
||||
<el-input
|
||||
v-model="studentData.baseInfo.relationship"
|
||||
placeholder="请输入与紧急联系人的关系"
|
||||
:disabled="submission"
|
||||
/>
|
||||
</el-form-item>
|
||||
</div>
|
||||
</el-form>
|
||||
</el-card>
|
||||
</div>
|
||||
</el-card>
|
||||
<!-- 提交按钮 -->
|
||||
<el-card class="!border-none mb-4 flex-1" shadow="never">
|
||||
<div v-if="!submission" class="mt-6">
|
||||
<el-button
|
||||
class="ml-4"
|
||||
type="primary"
|
||||
block
|
||||
@click="handleConfirmSubmit"
|
||||
:disabled="statusConfig.steps[0].completed"
|
||||
>
|
||||
提交报名
|
||||
</el-button>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-tab-pane>
|
||||
|
||||
<el-tab-pane label="查询进度" name="query">
|
||||
<!-- 查询进度区域 -->
|
||||
<div class="border-b border-br pb-5">
|
||||
<span class="text-2xl font-medium">查询报名进度</span>
|
||||
</div>
|
||||
|
||||
<!-- 查询表单 -->
|
||||
<el-card class="!border-none mb-6" shadow="never">
|
||||
<el-form
|
||||
:model="queryForm"
|
||||
:rules="queryRules"
|
||||
ref="queryFormRef"
|
||||
label-width="100px"
|
||||
class="mt-4"
|
||||
>
|
||||
<el-form-item label="身份证号" prop="idCard">
|
||||
<el-input
|
||||
v-model="queryForm.idCard"
|
||||
placeholder="请输入18位身份证号"
|
||||
maxlength="18"
|
||||
@input="handleIdCardInput"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="handleQuerySubmit" :loading="isQueryLoading">
|
||||
查询
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-card>
|
||||
|
||||
<!-- 进度展示区域 -->
|
||||
<div v-if="submission" class="border-b border-br pb-5">
|
||||
<span class="text-2xl font-medium">注册状态</span>
|
||||
</div>
|
||||
<el-card
|
||||
v-if="submission"
|
||||
class="!border-none mb-4 flex-1"
|
||||
shadow="never"
|
||||
>
|
||||
<div class="status-info mt-4">
|
||||
<!-- 步骤条展示 -->
|
||||
<div class="mb-6">
|
||||
<div class="text-tx-secondary text-sm mb-4">状态进度</div>
|
||||
<el-steps
|
||||
:active="activeStep"
|
||||
finish-status="success"
|
||||
class="w-full"
|
||||
style="text-align: left"
|
||||
>
|
||||
<el-step
|
||||
v-for="(step, index) in statusConfig.steps"
|
||||
:key="index"
|
||||
:title="stepTitles[index]"
|
||||
:description="getStepDescription(index)"
|
||||
:status="getStepStatus(index)"
|
||||
/>
|
||||
</el-steps>
|
||||
</div>
|
||||
<!-- 显示拒绝原因 -->
|
||||
<div v-if="rejectionReason" class="text-danger mt-4">
|
||||
<i class="el-icon-error mr-2"></i>
|
||||
拒绝原因:{{ rejectionReason }}
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
|
||||
<!-- 查询进度弹窗(保持全局可访问) -->
|
||||
<el-dialog
|
||||
v-model="isQueryDialogOpen"
|
||||
title="查询报名进度"
|
||||
width="500px"
|
||||
:close-on-click-modal="false"
|
||||
>
|
||||
<el-form
|
||||
:model="queryForm"
|
||||
:rules="queryRules"
|
||||
ref="queryFormRef"
|
||||
label-width="100px"
|
||||
class="mt-4"
|
||||
>
|
||||
<el-form-item label="身份证号" prop="idCard">
|
||||
<el-input
|
||||
v-model="queryForm.idCard"
|
||||
placeholder="请输入18位身份证号"
|
||||
maxlength="18"
|
||||
@input="handleIdCardInput"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="isQueryDialogOpen = false">取消</el-button>
|
||||
<el-button type="primary" @click="handleQuerySubmit" :loading="isQueryLoading">
|
||||
查询
|
||||
</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { reactive, computed, onMounted, ref, unref } from 'vue'
|
||||
import { ElButton, ElMessage, ElForm, ElFormItem, ElInput, ElDialog, ElTabs, ElTabPane } from 'element-plus'
|
||||
import {
|
||||
getEnrollmentProcessStatus,
|
||||
submitEnrollmentInfo
|
||||
} from '@/api/enrollment'
|
||||
|
||||
// 新增:标签页激活状态
|
||||
const activeTab = ref('enroll') // 默认显示报名页面
|
||||
|
||||
// 步骤标题与后端状态对应
|
||||
const stepTitles = ['报名', '材料审核', '录取', '缴费']
|
||||
const submission = ref(false) // 提交状态
|
||||
const rejectionReason = ref('') // 拒绝原因
|
||||
|
||||
// 查询相关状态
|
||||
const isQueryDialogOpen = ref(false) // 查询弹窗显示状态
|
||||
const isQueryLoading = ref(false) // 查询加载状态
|
||||
const queryFormRef = ref<InstanceType<typeof ElForm> | null>(null) // 查询表单引用
|
||||
|
||||
// 查询表单数据
|
||||
const queryForm = reactive({
|
||||
idCard: ''
|
||||
})
|
||||
|
||||
// 查询表单校验规则
|
||||
const queryRules = reactive({
|
||||
idCard: [
|
||||
{ required: true, message: '请输入身份证号', trigger: 'blur' },
|
||||
{
|
||||
pattern: /(^\d{18}$)|(^\d{17}(\d|X|x)$)/,
|
||||
message: '请输入有效的18位身份证号',
|
||||
trigger: 'blur'
|
||||
}
|
||||
]
|
||||
})
|
||||
|
||||
// 学生信息数据
|
||||
const studentData = reactive({
|
||||
baseInfo: {
|
||||
name: '',
|
||||
gender: 0,
|
||||
idCard: '',
|
||||
birthday: '',
|
||||
nationality: '',
|
||||
phone: '',
|
||||
email: '',
|
||||
homeAddress: '',
|
||||
nativePlace: '',
|
||||
invitationCode: '',
|
||||
politicalStatus: 0,
|
||||
previousSchool: '',
|
||||
schoolType: '',
|
||||
graduationYear: 2025,
|
||||
emergencyContact: '',
|
||||
emergencyPhone: '',
|
||||
relationship: ''
|
||||
}
|
||||
})
|
||||
|
||||
// 状态配置
|
||||
const statusConfig = reactive({
|
||||
steps: [
|
||||
{ completed: false, time: 0, status: 0 }, // 报名
|
||||
{ completed: false, time: 0, status: 0 }, // 材料审核
|
||||
{ completed: false, time: 0, status: 0 }, // 录取
|
||||
{ completed: false, time: 0, status: 0 } // 缴费
|
||||
],
|
||||
applicationNumber: '' // 报名编号
|
||||
})
|
||||
|
||||
// 格式化时间戳为日期
|
||||
const formatTime = (timestamp: number) => {
|
||||
if (!timestamp) return ''
|
||||
const date = new Date(timestamp)
|
||||
return date.toLocaleDateString()
|
||||
}
|
||||
|
||||
// 获取步骤描述
|
||||
const getStepDescription = (index: number) => {
|
||||
const step = statusConfig.steps[index]
|
||||
const timeStr = formatTime(step.time)
|
||||
if (index === 0) {
|
||||
return step.completed ? `已完成${timeStr}` : '状态异常'
|
||||
} else if (index === 1) {
|
||||
if (step.status === 0) return '待审核'
|
||||
if (step.status === 1) return `审核通过 ${timeStr}`
|
||||
if (step.status === 2) return `审核不通过 ${timeStr}`
|
||||
} else if (index === 2) {
|
||||
if (step.status === 0) return '待审核'
|
||||
if (step.status === 1) return `已录取 ${timeStr}`
|
||||
if (step.status === 2) return `未录取 ${timeStr}`
|
||||
} else if (index === 3) {
|
||||
if (step.status === 0) return '未缴费'
|
||||
if (step.status === 1) return `已缴费 ${timeStr}`
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
||||
// 确认提交
|
||||
const handleConfirmSubmit = async () => {
|
||||
try {
|
||||
// 提交前校验身份证号
|
||||
if (!/(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(studentData.baseInfo.idCard)) {
|
||||
ElMessage.warning('请输入有效的18位身份证号')
|
||||
return
|
||||
}
|
||||
await submitEnrollmentInfo(studentData.baseInfo)
|
||||
submission.value = true
|
||||
ElMessage.success('报名提交成功')
|
||||
// 提交成功后自动切换到查询页面
|
||||
activeTab.value = 'query'
|
||||
// 提交成功后自动查询进度
|
||||
await loadProcessStatus(studentData.baseInfo.idCard)
|
||||
} catch (error) {
|
||||
ElMessage.error('报名提交失败,请稍后重试')
|
||||
console.error('提交报名信息失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// 打开查询弹窗
|
||||
const openQueryDialog = () => {
|
||||
queryForm.idCard = ''
|
||||
if (queryFormRef.value) {
|
||||
queryFormRef.value.clearValidate()
|
||||
}
|
||||
isQueryDialogOpen.value = true
|
||||
}
|
||||
|
||||
// 处理身份证输入
|
||||
const handleIdCardInput = () => {
|
||||
let idCardStr = String(queryForm.idCard || '')
|
||||
idCardStr = idCardStr.replace(/[^0-9Xx]/g, '')
|
||||
idCardStr = idCardStr.toUpperCase()
|
||||
if (idCardStr.length > 18) {
|
||||
idCardStr = idCardStr.slice(0, 18)
|
||||
}
|
||||
queryForm.idCard = idCardStr
|
||||
}
|
||||
|
||||
// 提交查询
|
||||
const handleQuerySubmit = async () => {
|
||||
const formRef = unref(queryFormRef)
|
||||
if (!formRef) return
|
||||
|
||||
try {
|
||||
await formRef.validate()
|
||||
isQueryLoading.value = true
|
||||
|
||||
const statusRes = await getEnrollmentProcessStatus(queryForm)
|
||||
|
||||
if (statusRes) {
|
||||
isQueryDialogOpen.value = false
|
||||
submission.value = true
|
||||
|
||||
statusConfig.applicationNumber = statusRes.applicationNumber || ''
|
||||
rejectionReason.value = statusRes.rejectionReason || ''
|
||||
|
||||
statusConfig.steps[0] = {
|
||||
completed: statusRes.applicationNumber ? true : false,
|
||||
time: statusRes.applicationTime || 0,
|
||||
status: statusRes.applicationTime > 0 ? 1 : 0
|
||||
}
|
||||
statusConfig.steps[1] = {
|
||||
completed: statusRes.approvalStatus === 1,
|
||||
time: statusRes.approvalTime || 0,
|
||||
status: statusRes.approvalStatus || 0
|
||||
}
|
||||
statusConfig.steps[2] = {
|
||||
completed: statusRes.admissionStatus === 1,
|
||||
time: statusRes.admissionTime || 0,
|
||||
status: statusRes.admissionStatus || 0
|
||||
}
|
||||
statusConfig.steps[3] = {
|
||||
completed: statusRes.paymentStatus === 1,
|
||||
time: statusRes.paymentTime || 0,
|
||||
status: statusRes.paymentStatus || 0
|
||||
}
|
||||
|
||||
ElMessage.success('查询成功')
|
||||
} else {
|
||||
ElMessage.info('未查询到相关报名记录')
|
||||
resetStatusConfig()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('查询进度失败:', error)
|
||||
ElMessage.error('查询失败,请稍后重试')
|
||||
} finally {
|
||||
isQueryLoading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
// 加载流程状态
|
||||
const loadProcessStatus = async (idCard?: string) => {
|
||||
const cardNo = idCard || studentData.baseInfo.idCard
|
||||
if (!cardNo || typeof cardNo !== 'string') return
|
||||
|
||||
try {
|
||||
const statusRes = await getEnrollmentProcessStatus(cardNo)
|
||||
if (statusRes) {
|
||||
submission.value = true
|
||||
statusConfig.applicationNumber = statusRes.data.applicationNumber || ''
|
||||
rejectionReason.value = statusRes.data.rejectionReason || ''
|
||||
|
||||
statusConfig.steps[0] = {
|
||||
completed: statusRes.data.applicationNumber ? true : false,
|
||||
time: statusRes.data.applicationTime || 0,
|
||||
status: statusRes.data.applicationTime > 0 ? 1 : 0
|
||||
}
|
||||
statusConfig.steps[1] = {
|
||||
completed: statusRes.data.approvalStatus === 1,
|
||||
time: statusRes.data.approvalTime || 0,
|
||||
status: statusRes.data.approvalStatus || 0
|
||||
}
|
||||
statusConfig.steps[2] = {
|
||||
completed: statusRes.data.admissionStatus === 1,
|
||||
time: statusRes.data.admissionTime || 0,
|
||||
status: statusRes.data.admissionStatus || 0
|
||||
}
|
||||
statusConfig.steps[3] = {
|
||||
completed: statusRes.data.paymentStatus === 1,
|
||||
time: statusRes.data.paymentTime || 0,
|
||||
status: statusRes.data.paymentStatus || 0
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('刷新状态失败:', error)
|
||||
}
|
||||
}
|
||||
|
||||
// 重置状态配置
|
||||
const resetStatusConfig = () => {
|
||||
statusConfig.steps = [
|
||||
{ completed: false, time: 0, status: 0 },
|
||||
{ completed: false, time: 0, status: 0 },
|
||||
{ completed: false, time: 0, status: 0 },
|
||||
{ completed: false, time: 0, status: 0 }
|
||||
]
|
||||
statusConfig.applicationNumber = ''
|
||||
rejectionReason.value = ''
|
||||
submission.value = false
|
||||
const graduationYear = studentData.baseInfo.graduationYear
|
||||
Object.assign(studentData.baseInfo, {
|
||||
name: '',
|
||||
gender: 0,
|
||||
idCard: '',
|
||||
birthday: '',
|
||||
nationality: '',
|
||||
phone: '',
|
||||
email: '',
|
||||
homeAddress: '',
|
||||
nativePlace: '',
|
||||
politicalStatus: 0,
|
||||
previousSchool: '',
|
||||
schoolType: '',
|
||||
graduationYear,
|
||||
emergencyContact: '',
|
||||
emergencyPhone: '',
|
||||
relationship: ''
|
||||
})
|
||||
}
|
||||
|
||||
// 动态推导当前激活的步骤
|
||||
const activeStep = computed(() => {
|
||||
if (
|
||||
statusConfig.steps[1].status === 2 ||
|
||||
statusConfig.steps[2].status === 2
|
||||
) {
|
||||
return statusConfig.steps[1].status === 2 ? 1 : 2
|
||||
}
|
||||
|
||||
const count = completedStepCount.value
|
||||
return count >= statusConfig.steps.length
|
||||
? statusConfig.steps.length - 1
|
||||
: count
|
||||
})
|
||||
|
||||
// 获取步骤状态
|
||||
const getStepStatus = (index: number) => {
|
||||
if (statusConfig.steps[index].completed) {
|
||||
return 'finish'
|
||||
}
|
||||
|
||||
if (
|
||||
(index === 1 && statusConfig.steps[index].status === 2) ||
|
||||
(index === 2 && statusConfig.steps[index].status === 2)
|
||||
) {
|
||||
return 'error'
|
||||
}
|
||||
|
||||
return index === activeStep.value ? 'process' : 'wait'
|
||||
}
|
||||
|
||||
// 计算已完成的步骤数量
|
||||
const completedStepCount = computed(() => {
|
||||
return statusConfig.steps.filter((step) => step.completed).length
|
||||
})
|
||||
|
||||
// 页面加载时初始化
|
||||
onMounted(() => {
|
||||
const idCard = studentData.baseInfo.idCard
|
||||
if (idCard && typeof idCard === 'string') {
|
||||
loadProcessStatus(idCard)
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.el-dialog__body {
|
||||
padding: 20px;
|
||||
}
|
||||
.el-form-item {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
.el-tabs {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -158,6 +158,9 @@ import { ElButton, ElMessage, ElForm, ElFormItem, ElInput } from 'element-plus'
|
|||
import {
|
||||
submitEnrollmentInfo
|
||||
} from '@/api/enrollment'
|
||||
import { useRouter } from 'vue-router'
|
||||
|
||||
const router = useRouter()
|
||||
|
||||
// 学生信息数据
|
||||
const studentData = reactive({
|
||||
|
|
@ -190,8 +193,16 @@ const handleConfirmSubmit = async () => {
|
|||
ElMessage.warning('请输入有效的18位身份证号')
|
||||
return
|
||||
}
|
||||
await submitEnrollmentInfo(studentData.baseInfo)
|
||||
const data = await submitEnrollmentInfo(studentData.baseInfo)
|
||||
console.log(data)
|
||||
if(data.code === 1){
|
||||
ElMessage.success('报名提交成功')
|
||||
router.push({
|
||||
path: '/query',
|
||||
query: { idCard: studentData.baseInfo.idCard }
|
||||
})
|
||||
}
|
||||
else ElMessage.error(data.msg)
|
||||
} catch (error) {
|
||||
ElMessage.error('报名提交失败,请稍后重试')
|
||||
console.error('提交报名信息失败:', error)
|
||||
|
|
|
|||
|
|
@ -104,23 +104,20 @@
|
|||
import { reactive, computed, onMounted, ref, unref } from 'vue'
|
||||
import { ElButton, ElMessage, ElForm, ElFormItem, ElInput, ElDialog, ElTabs, ElTabPane } from 'element-plus'
|
||||
import {
|
||||
getEnrollmentProcessStatus,
|
||||
submitEnrollmentInfo
|
||||
getEnrollmentProcessStatus
|
||||
} from '@/api/enrollment'
|
||||
import { useRoute } from 'vue-router'
|
||||
|
||||
// 新增:标签页激活状态
|
||||
const activeTab = ref('enroll') // 默认显示报名页面
|
||||
|
||||
const route = useRoute()
|
||||
// 步骤标题与后端状态对应
|
||||
const stepTitles = ['报名', '材料审核', '录取', '缴费']
|
||||
const stepTitles = ['报名', '缴费', '等待录取']
|
||||
const submission = ref(false) // 提交状态
|
||||
const rejectionReason = ref('') // 拒绝原因
|
||||
|
||||
// 查询相关状态
|
||||
const isQueryDialogOpen = ref(false) // 查询弹窗显示状态
|
||||
const isQueryLoading = ref(false) // 查询加载状态
|
||||
const queryFormRef = ref<InstanceType<typeof ElForm> | null>(null) // 查询表单引用
|
||||
|
||||
// 查询表单数据
|
||||
const queryForm = reactive({
|
||||
idCard: ''
|
||||
|
|
@ -165,9 +162,8 @@ const studentData = reactive({
|
|||
const statusConfig = reactive({
|
||||
steps: [
|
||||
{ completed: false, time: 0, status: 0 }, // 报名
|
||||
{ completed: false, time: 0, status: 0 }, // 材料审核
|
||||
{ completed: false, time: 0, status: 0 }, // 录取
|
||||
{ completed: false, time: 0, status: 0 } // 缴费
|
||||
{ completed: false, time: 0, status: 0 }, // 缴费
|
||||
{ completed: false, time: 0, status: 0 }, // 等待录取通知
|
||||
],
|
||||
applicationNumber: '' // 报名编号
|
||||
})
|
||||
|
|
@ -186,16 +182,12 @@ const getStepDescription = (index: number) => {
|
|||
if (index === 0) {
|
||||
return step.completed ? `已完成${timeStr}` : '状态异常'
|
||||
} else if (index === 1) {
|
||||
if (step.status === 0) return '待审核'
|
||||
if (step.status === 1) return `审核通过 ${timeStr}`
|
||||
if (step.status === 2) return `审核不通过 ${timeStr}`
|
||||
} else if (index === 2) {
|
||||
if (step.status === 0) return '待审核'
|
||||
if (step.status === 1) return `已录取 ${timeStr}`
|
||||
if (step.status === 2) return `未录取 ${timeStr}`
|
||||
} else if (index === 3) {
|
||||
if (step.status === 0) return '未缴费'
|
||||
if (step.status === 1) return `已缴费 ${timeStr}`
|
||||
} else if (index === 2) {
|
||||
if (step.status === 0) return '等待录取通知'
|
||||
if (step.status === 1) return `录取通知已发送 ${timeStr}`
|
||||
if (step.status === 2) return `未录取 ${timeStr}`
|
||||
}
|
||||
return ''
|
||||
}
|
||||
|
|
@ -220,7 +212,8 @@ const handleQuerySubmit = async () => {
|
|||
await formRef.validate()
|
||||
isQueryLoading.value = true
|
||||
|
||||
const statusRes = await getEnrollmentProcessStatus(queryForm)
|
||||
const data = await getEnrollmentProcessStatus(queryForm)
|
||||
const statusRes = data.data
|
||||
|
||||
if (statusRes) {
|
||||
isQueryDialogOpen.value = false
|
||||
|
|
@ -240,15 +233,10 @@ const handleQuerySubmit = async () => {
|
|||
status: statusRes.approvalStatus || 0
|
||||
}
|
||||
statusConfig.steps[2] = {
|
||||
completed: statusRes.admissionStatus === 1,
|
||||
completed: statusRes.admissionStatus === 6,
|
||||
time: statusRes.admissionTime || 0,
|
||||
status: statusRes.admissionStatus || 0
|
||||
}
|
||||
statusConfig.steps[3] = {
|
||||
completed: statusRes.paymentStatus === 1,
|
||||
time: statusRes.paymentTime || 0,
|
||||
status: statusRes.paymentStatus || 0
|
||||
}
|
||||
|
||||
ElMessage.success('查询成功')
|
||||
} else {
|
||||
|
|
@ -290,11 +278,6 @@ const loadProcessStatus = async (idCard?: string) => {
|
|||
time: statusRes.data.admissionTime || 0,
|
||||
status: statusRes.data.admissionStatus || 0
|
||||
}
|
||||
statusConfig.steps[3] = {
|
||||
completed: statusRes.data.paymentStatus === 1,
|
||||
time: statusRes.data.paymentTime || 0,
|
||||
status: statusRes.data.paymentStatus || 0
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('刷新状态失败:', error)
|
||||
|
|
@ -304,7 +287,6 @@ const loadProcessStatus = async (idCard?: string) => {
|
|||
// 重置状态配置
|
||||
const resetStatusConfig = () => {
|
||||
statusConfig.steps = [
|
||||
{ completed: false, time: 0, status: 0 },
|
||||
{ completed: false, time: 0, status: 0 },
|
||||
{ completed: false, time: 0, status: 0 },
|
||||
{ completed: false, time: 0, status: 0 }
|
||||
|
|
@ -371,10 +353,20 @@ const completedStepCount = computed(() => {
|
|||
|
||||
// 页面加载时初始化
|
||||
onMounted(() => {
|
||||
// 新增:从路由参数获取身份证号并自动查询
|
||||
const idCardFromRoute = route.query.idCard as string
|
||||
if (idCardFromRoute) {
|
||||
queryForm.idCard = idCardFromRoute
|
||||
// 延迟执行避免表单验证时机问题
|
||||
setTimeout(() => {
|
||||
handleQuerySubmit()
|
||||
}, 100)
|
||||
} else {
|
||||
const idCard = studentData.baseInfo.idCard
|
||||
if (idCard && typeof idCard === 'string') {
|
||||
loadProcessStatus(idCard)
|
||||
}
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
|
|
|
|||
Loading…
Reference in New Issue