普通招生

This commit is contained in:
guochunsi
2026-01-15 19:06:50 +08:00
parent 761fb9bdc3
commit 3cab9fab59
46 changed files with 1561 additions and 1033 deletions

View File

@@ -33,8 +33,8 @@
<el-form-item label="报名时段" prop="startDate">
<el-date-picker
v-model="dataForm.startDate"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
clearable
:disabled-date="startDateDisabledDate"
type="date"
@@ -42,8 +42,8 @@
<span style="margin: 0 8px;">-</span>
<el-date-picker
v-model="dataForm.endDate"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
clearable
:disabled-date="endDateDisabledDate"
type="date"
@@ -52,20 +52,23 @@
<el-form-item label="录取时段" prop="lqStartDate">
<el-date-picker
v-model="dataForm.lqStartDate"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
clearable
type="date"
/>
<span style="margin: 0 8px;">-</span>
<el-date-picker
v-model="dataForm.lqEndDate"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
format="YYYY-MM-DD"
value-format="YYYY-MM-DD"
clearable
type="date"
/>
</el-form-item>
</template>
<!-- 可折叠的高级筛选条件 -->
<template v-if="!visible">
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
<el-option
@@ -113,7 +116,7 @@
<el-form-item label="是否住宿" prop="isAccommodation">
<el-select v-model="dataForm.isAccommodation" filterable clearable placeholder="请选择是否住宿">
<el-option
v-for="item in yesNoList"
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -123,7 +126,7 @@
<el-form-item label="是否低保" prop="isMinimumLivingSecurity">
<el-select v-model="dataForm.isMinimumLivingSecurity" filterable clearable placeholder="请选择是否低保">
<el-option
v-for="item in yesNoList"
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -160,7 +163,7 @@
<el-form-item label="新市民材料已上传" prop="isNewCity">
<el-select v-model="dataForm.isNewCity" filterable clearable placeholder="请选择新市民材料已上传">
<el-option
v-for="item in yesNoList"
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -170,7 +173,7 @@
<el-form-item label="毕业证已上传" prop="graPic">
<el-select v-model="dataForm.graPic" filterable clearable placeholder="请选择毕业证已上传">
<el-option
v-for="item in yesNoList"
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -212,7 +215,7 @@
<el-form-item label="是否同步学工" prop="isTb">
<el-select v-model="dataForm.isTb" filterable clearable placeholder="请选择是否同步学工">
<el-option
v-for="item in yesNoList"
v-for="item in yes_no_type"
:key="item.value"
:label="item.label"
:value="item.value">
@@ -252,15 +255,14 @@
</el-option>
</el-select>
</el-form-item>
</template>
</template>
<!-- 操作按钮 -->
<template #actions>
<el-form-item>
<el-form-item>
<el-button type="primary" @click="handleFilter" icon="Search">查询</el-button>
<el-button type="primary" plain @click="resetForm('searchForm')" icon="Refresh" class="ml10">重置</el-button>
<el-button @click="resetForm('searchForm')" icon="Refresh" class="ml10">重置</el-button>
</el-form-item>
</template>
</search-form>
@@ -269,32 +271,25 @@
<el-row>
<div class="mb15" style="width: 100%;">
<el-button
type="primary"
icon="FolderAdd"
@click="addOrUpdateHandle()"
v-if="permissions.recruit_recruitstudentsignup_add">
</el-button>
<el-button
class="ml10"
type="warning"
plain
v-if="permissions.zipExport"
icon="Download"
@click="downZip()">招生名单打包导出
@click="downZip()">招生名单打包导出
</el-button>
<el-button
class="ml10"
type="warning"
plain
icon="Download"
@click="handleExport()">名单导出
@click="handleExport()">名单导出
</el-button>
<el-button
class="ml10"
type="primary"
plain
icon="UploadFilled"
v-if="permissions.recruit_send_img"
v-if="permissions.recruit_send_img"
@click="handleSendImg()">图片同步
</el-button>
</div>
@@ -303,11 +298,11 @@
<!-- 表格 -->
<el-table
ref="tableRef"
:data="dataList"
v-loading="dataListLoading"
:data="state.dataList"
v-loading="state.loading"
border
:cell-style="tableStyle?.cellStyle"
:header-cell-style="tableStyle?.headerCellStyle">
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle">
<el-table-column
header-align="center"
@@ -490,31 +485,31 @@
<!-- 分页 -->
<pagination
v-bind="pagination"
@current-change="currentChangeHandle"
v-bind="state.pagination"
@current-change="currentChangeHandle"
@size-change="sizeChangeHandle"
/>
<!-- 弹窗, 新增 / 修改 -->
<table-form v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></table-form>
<TableForm ref="addOrUpdateRef" @refreshDataList="getDataList"></TableForm>
<major-change v-if="majorChangeVisible" ref="majorChange" @refreshDataList="getDataList"></major-change>
<MajorChange ref="majorChangeRef" @refreshDataList="getDataList"></MajorChange>
<update v-if="updateVisible" ref="update" @refreshDataList="getDataList"></update>
<Update ref="updateRef" @refreshDataList="getDataList"></Update>
<!-- 支付二维码弹窗 -->
<pay-qrcode-dialog ref="payQrcodeDialogRef" @refresh="getDataList"></pay-qrcode-dialog>
<PayQrcodeDialog ref="payQrcodeDialogRef" @refresh="getDataList"></PayQrcodeDialog>
<!-- 延迟缴费弹窗 -->
<delay-pay-time-dialog ref="delayPayTimeDialogRef" @refresh="getDataList"></delay-pay-time-dialog>
<DelayPayTimeDialog ref="delayPayTimeDialogRef" @refresh="getDataList"></DelayPayTimeDialog>
<!-- 录取通知书弹窗 -->
<admission-notice-dialog ref="admissionNoticeDialogRef" :permissions="permissions" @refresh="getDataList"></admission-notice-dialog>
<AdmissionNoticeDialog ref="admissionNoticeDialogRef" :permissions="permissions" @refresh="getDataList"></AdmissionNoticeDialog>
<dorm-f-w v-if="dormFWRefVisible" ref="dormFWRef"></dorm-f-w>
<show-map v-if="baiduMapVisible" ref="baiduMapRef"></show-map>
<interview-form ref="interviewFormRef" @refresh="getDataList"></interview-form>
</div>
<DormFW ref="dormFWRef"></DormFW>
<ShowMap ref="baiduMapRef"></ShowMap>
<InterviewForm ref="interviewFormRef" @refresh="getDataList"></InterviewForm>
</div>
</div>
</template>
@@ -523,8 +518,9 @@ import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent, wat
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { BasicTableProps, useTable } from '/@/hooks/table'
import axios from 'axios'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import {
delObj,
exportZip,
@@ -539,21 +535,14 @@ import {
pushCity as pushCityApi
} from '/@/api/recruit/recruitstudentsignup'
import { getLabelValue, getLabelValueByProps, getMajorLabelWithYears } from '/@/utils/dictLabel'
import {getDeptList} from "/@/api/basic/basicclass";
import {listPlanByCondition as planMajor} from "/@/api/recruit/recruitstudentplan";
import {getTypeValue, getDictsByTypes} from "/@/api/admin/dict";
import {getUserListByRole} from "/@/api/admin/user";
import {queryTeacherBaseByNo} from "/@/api/professional/professionaluser/teacherbase";
// ROLE_CODE 常量定义
const ROLE_CODE = {
ROLE_RECRUIT_SECOND: 'ROLE_RECRUIT_SECOND',
ROLE_RECRUIT: 'ROLE_RECRUIT'
}
// Loading 函数(如果模块不存在,使用空函数)
const showLoading = () => {}
const hideLoading = () => {}
import { getDeptList } from "/@/api/basic/basicclass";
import { listPlanByCondition as planMajor } from "/@/api/recruit/recruitstudentplan";
import { getDictsByTypes } from "/@/api/admin/dict";
import { getUserListByRole } from "/@/api/admin/user";
import { queryTeacherBaseByNo } from "/@/api/professional/professionaluser/teacherbase";
import { useDict } from '/@/hooks/dict'
import { ROLE_CODE } from '/@/config/global'
import { showLoading, hideLoading } from '/@/api/asset/loading'
// 定义组件
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
@@ -628,32 +617,25 @@ const dataForm = reactive({
isBackTz: ''
})
// 数据列
const dataList = ref<any[]>([])
const pageIndex = ref(1)
const pageSize = ref(10)
const totalPage = ref(0)
const dataListLoading = ref(false)
// 分页对象(用于 pagination 组件)
const pagination = computed(() => ({
current: pageIndex.value,
size: pageSize.value,
total: totalPage.value
}))
// 表格样式(可选)
const tableStyle = ref({
cellStyle: {},
headerCellStyle: {}
// 表格状态
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: dataForm,
pageList: async (params: any) => {
const response = await fetchList(params)
return {
data: {
records: response.data.records || [],
total: response.data.total || 0
}
}
},
createdIsNeed: false
})
// 弹窗状态
const addOrUpdateVisible = ref(false)
const majorChangeVisible = ref(false)
const updateVisible = ref(false)
const dormFWRefVisible = ref(false)
const baiduMapVisible = ref(false)
// 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
// 弹窗状态(已移除,组件内部通过 v-model="visible" 控制)
// 列表数据
const auditorList = ref<any[]>([])
@@ -666,10 +648,12 @@ const interviewDicList = ref<any[]>([])
const zlshList = ref<any[]>([])
const paystatusList = ref<any[]>([])
// 字典数据
const { yes_no_type } = useDict('yes_no_type')
// 静态数据
const isBackTzList = [{ label: '未发放', value: '0' }, { label: '已发放', value: '1' }]
const auditStatusList = [{ label: '未录取', value: '-20' }, { label: '待审核', value: '0' }, { label: '已录取', value: '20' }]
const yesNoList = [{ label: '否', value: '0' }, { label: '是', value: '1' }]
const cityExamTypeList = [{ label: '待审核', value: '0' }, { label: '通过', value: '1' }, { label: '驳回', value: '2' }]
const pushedList = [{ label: '未推送', value: '0' }, { label: '已推送', value: '1' }]
const isOutFwList = [{ label: '待确认', value: '0' }, { label: '范围内', value: '1' }, { label: '范围外', value: '2' }]
@@ -705,9 +689,9 @@ const remoteTeacherByQuery = (query: string) => {
teacherList.value = response.data || []
}).catch(() => {
teacherList.value = []
})
})
}, 200)
}
}
}
// 发送图片
@@ -780,18 +764,18 @@ const downZip = () => {
// 百度地图
const baiduMap = (row: any) => {
baiduMapVisible.value = true
// 组件内部通过 v-model="visible" 控制显示
nextTick(() => {
baiduMapRef.value?.init(row)
})
})
}
// 设置宿舍
const setDormFW = () => {
dormFWRefVisible.value = true
// 组件内部通过 v-model="visible" 控制显示
nextTick(() => {
dormFWRef.value?.init()
})
})
}
// 一键判断是否超出住宿范围
@@ -805,7 +789,7 @@ const handleYjOut = () => {
}).then(() => {
message.success('操作成功')
getDataList()
})
})
}
// 导出审核
@@ -871,13 +855,6 @@ const unique = (arr: any[]) => {
return arr.filter((item) => !rese.has(item.username) && rese.set(item.username, 1))
}
// 性别
const getGender = (gender: string) => {
if (gender == '2') return '女'
if (gender == '1') return '男'
return ''
}
// 切换专业
const chanMajor = () => {
planMajorList.value = []
@@ -890,62 +867,32 @@ const chanMajor = () => {
// 查询
const handleFilter = () => {
pageIndex.value = 1
getDataList()
}
// 获取数据列表
const getDataList = () => {
dataList.value = []
dataListLoading.value = true
fetchList({
current: pageIndex.value,
size: pageSize.value,
...dataForm
}).then(response => {
dataList.value = response.data.records
totalPage.value = response.data.total
dataListLoading.value = false
}).catch(() => {
dataListLoading.value = false
})
}
// 每页数
const sizeChangeHandle = (val: number) => {
pageSize.value = val
pageIndex.value = 1
getDataList()
}
// 当前页
const currentChangeHandle = (val: number) => {
pageIndex.value = val
getDataList()
}
// 新增 / 修改
const addOrUpdateHandle = (id?: string, type?: number) => {
addOrUpdateVisible.value = true
nextTick(() => {
addOrUpdateRef.value?.init(id, type)
})
// 新增时默认 type=1可编辑查看时 type=0只读审核时 type=1可编辑
const finalType = type !== undefined ? type : (id ? 0 : 1)
addOrUpdateRef.value?.init(id || null, finalType)
})
}
// 编辑
const edit = (id: string) => {
updateVisible.value = true
nextTick(() => {
updateRef.value?.init(id)
})
})
}
// 专业调整
const majorChange = (id: string) => {
majorChangeVisible.value = true
nextTick(() => {
majorChangeRef.value?.init(id)
})
})
}
// 退学
@@ -955,17 +902,17 @@ const handleUpdate = (id: string, groupId: string, feeAgency: string) => {
}).then(() => {
message.success('操作成功')
getDataList()
})
})
}
// 删除
// 删除
const deleteHandle = (id: string) => {
messageBox.confirm('是否确认删除本条数据?请谨慎操作').then(() => {
return delObj(id)
}).then(() => {
message.success('删除成功')
getDataList()
})
})
}
// 重置表单
@@ -977,10 +924,7 @@ const resetForm = (formName: string) => {
// 缴费状态
const getStatus = (type: string) => {
if (type == '0') return '未缴费'
if (type == '5') return '部分缴费'
if (type == '10') return '已缴费'
return ''
return getLabelValue(paystatusList.value, type)
}
// 推送状态
@@ -1018,7 +962,7 @@ const handlePushCity = (id: string) => {
}).then(() => {
message.success('推送成功')
getDataList()
})
})
}
// 重新推送
@@ -1028,7 +972,7 @@ const handleRePush = (row: any) => {
}).then(() => {
message.success('推送成功')
getDataList()
})
})
}
// 延迟缴费
@@ -1047,7 +991,9 @@ const showPayCode = (row: any) => {
// 面试
const interviewForm = (row: any) => {
interviewFormRef.value?.init(row)
nextTick(() => {
interviewFormRef.value?.init(row)
})
}
// 初始化
@@ -1058,7 +1004,7 @@ const init = async () => {
})
// 获取招生计划列表
list().then(data => {
getList().then(data => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
@@ -1067,13 +1013,10 @@ const init = async () => {
}
})
// 获取文化程度字典
getTypeValue('finance_student_source').then(res => {
eduList.value = res.data
})
// 批量获取字典数据:面试结果、资料审核状态、缴费状态
getDictsByTypes(['interview_dic', 'recruit_zlsh', 'recruit_pay_status']).then((res) => {
// 批量获取字典数据:文化程度、面试结果、资料审核状态、缴费状态
getDictsByTypes(['finance_student_source','interview_dic', 'recruit_zlsh', 'recruit_pay_status']).then((res) => {
eduList.value = res.data.finance_student_source || []
interviewDicList.value = res.data.interview_dic || []
zlshList.value = res.data.recruit_zlsh || []
paystatusList.value = res.data.recruit_pay_status || []