Files
school-developer/src/views/recruit/recruitstudentsignup/index.vue
guochunsi 761fb9bdc3 a
2026-01-15 11:39:10 +08:00

1111 lines
37 KiB
Vue

<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<!-- 搜索表单 -->
<search-form
v-show="showSearch"
:model="dataForm"
ref="searchFormRef"
@keyup-enter="handleFilter"
>
<template #default="{ visible }">
<template v-if="visible">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
<el-option
v-for="item in planList"
:key="item.id"
:label="item.groupName"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="学院" prop="xy">
<el-select v-model="dataForm.xy" filterable clearable placeholder="请选择学院">
<el-option
v-for="item in deptList"
:key="item.deptCode"
:label="item.deptName"
:value="item.deptCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="报名时段" prop="startDate">
<el-date-picker
v-model="dataForm.startDate"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
clearable
:disabled-date="startDateDisabledDate"
type="date"
/>
<span style="margin: 0 8px;">-</span>
<el-date-picker
v-model="dataForm.endDate"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
clearable
:disabled-date="endDateDisabledDate"
type="date"
/>
</el-form-item>
<el-form-item label="录取时段" prop="lqStartDate">
<el-date-picker
v-model="dataForm.lqStartDate"
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"
clearable
type="date"
/>
</el-form-item>
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName+'('+item.learnYear+'年制)'"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="拟报专业" prop="wishMajorOne">
<el-select v-model="dataForm.wishMajorOne" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
:label="item.majorName+'('+item.learnYear+'年制)'"
:value="item.majorCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="录取状态" prop="auditStatus">
<el-select v-model="dataForm.auditStatus" filterable clearable placeholder="请选择录取状态">
<el-option
v-for="item in auditStatusList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="唯一号/姓名/身份证号/学校名称" prop="search">
<el-input v-model="dataForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称"></el-input>
</el-form-item>
<el-form-item label="文化程度" prop="degreeOfEducation">
<el-select v-model="dataForm.degreeOfEducation" filterable clearable placeholder="请选择文化程度">
<el-option
v-for="item in eduList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否住宿" prop="isAccommodation">
<el-select v-model="dataForm.isAccommodation" filterable clearable placeholder="请选择是否住宿">
<el-option
v-for="item in yesNoList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否低保" prop="isMinimumLivingSecurity">
<el-select v-model="dataForm.isMinimumLivingSecurity" filterable clearable placeholder="请选择是否低保">
<el-option
v-for="item in yesNoList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="经办人" prop="auditor">
<el-select
v-model="dataForm.auditor"
filterable
remote
clearable
reserve-keyword
placeholder="请选择经办人"
:remote-method="remoteTeacherByQuery">
<el-option
v-for="item in teacherList"
:key="item.teacherNo"
:label="item.realName"
:value="item.teacherNo">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="缴费状态" prop="paystatus">
<el-select v-model="dataForm.paystatus" filterable clearable placeholder="请选择缴费状态">
<el-option
v-for="item in paystatusList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="新市民材料已上传" prop="isNewCity">
<el-select v-model="dataForm.isNewCity" filterable clearable placeholder="请选择新市民材料已上传">
<el-option
v-for="item in yesNoList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="毕业证已上传" prop="graPic">
<el-select v-model="dataForm.graPic" filterable clearable placeholder="请选择毕业证已上传">
<el-option
v-for="item in yesNoList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="推送状态" prop="pushed">
<el-select v-model="dataForm.pushed" filterable clearable placeholder="请选择推送状态">
<el-option
v-for="item in pushedList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="来源" prop="isOut">
<el-select v-model="dataForm.isOut" filterable clearable placeholder="请选择来源">
<el-option
v-for="item in isOutList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="证书发放" prop="isBackTz">
<el-select v-model="dataForm.isBackTz" filterable clearable placeholder="请选择是否发放">
<el-option
v-for="item in isBackTzList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="是否同步学工" prop="isTb">
<el-select v-model="dataForm.isTb" filterable clearable placeholder="请选择是否同步学工">
<el-option
v-for="item in yesNoList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="市局审核" prop="cityExamType">
<el-select v-model="dataForm.cityExamType" filterable clearable placeholder="请选择市局审核状态">
<el-option
v-for="item in cityExamTypeList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="面试结果" prop="interview">
<el-select v-model="dataForm.interview" filterable clearable placeholder="请选择面试结果">
<el-option
v-for="item in interviewDicList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="资料审核状态" prop="zlsh">
<el-select v-model="dataForm.zlsh" filterable clearable placeholder="请选择资料审核状态">
<el-option
v-for="item in zlshList"
:key="item.value"
:label="item.label"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</template>
</template>
<!-- 操作按钮 -->
<template #actions>
<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-form-item>
</template>
</search-form>
<!-- 操作按钮 -->
<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()">招生名单打包导出
</el-button>
<el-button
class="ml10"
type="warning"
plain
icon="Download"
@click="handleExport()">名单导出
</el-button>
<el-button
class="ml10"
type="primary"
plain
icon="UploadFilled"
v-if="permissions.recruit_send_img"
@click="handleSendImg()">图片同步
</el-button>
</div>
</el-row>
<!-- 表格 -->
<el-table
ref="tableRef"
:data="dataList"
v-loading="dataListLoading"
border
:cell-style="tableStyle?.cellStyle"
:header-cell-style="tableStyle?.headerCellStyle">
<el-table-column
header-align="center"
align="center"
label="操作">
<template #default="scope">
<el-button type="text" size="small" icon="el-icon-view" @click="addOrUpdateHandle(scope.row.id,0)">查看
</el-button>
<el-button v-if="permissions.recruit_recruitstudentsignup_edit" type="text" size="small"
icon="el-icon-edit" @click="edit(scope.row.id)">补材料
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_interview && scope.row.degreeOfEducation == '3'"
type="text" size="small"
icon="el-icon-check" @click="interviewForm(scope.row)">面试
</el-button>
<el-button v-if="permissions.recruit_recruitstudentsignup_edit && scope.row.auditStatus=='0'"
type="text" size="small" icon="iconfont icon-rizhiguanli"
@click="addOrUpdateHandle(scope.row.id,1)">审核
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_leaveSchool && scope.row.auditStatus=='20' && scope.row.isMajorChange!='1'"
type="text" size="small" icon="el-icon-circle-close"
@click="handleUpdate(scope.row.id,scope.row.groupId,scope.row.feeAgency)">退学
</el-button>
<el-button v-if="permissions.recruit_recruitstudentsignup_change && scope.row.auditStatus=='20' "
type="text" size="small" icon="iconfont iconbanjiguanli1" @click="majorChange(scope.row.id)">
调整专业
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_show && scope.row.pushed=='1' && scope.row.paiedOffline!='10'"
type="text" icon="el-icon-tickets" size="small" plain @click="showPayCode(scope.row)">支付二维码
</el-button>
<!-- <el-button v-if="permissions.recruit_recruitstudentsignup_show && scope.row.pushed=='1' && scope.row.paiedOffline=='0' && scope.row.auditStatus=='20'" type="text" icon="el-icon-check" size="small" @click="delayPayTimeSet(scope.row)">延迟收费</el-button>-->
<el-button
v-if="permissions.recruit_recruitstudentsignup_rePush && scope.row.pushed=='0' && scope.row.auditStatus=='20'"
type="text" icon="el-icon-check" size="small" plain @click="handleRePush(scope.row)">重新推送
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_show && ((scope.row.degreeOfEducation=='1'&& scope.row.isOut=='1' && scope.row.auditStatus=='20')
|| (scope.row.degreeOfEducation=='1'&& scope.row.isOut=='0' && scope.row.paiedOffline!='0' && scope.row.auditStatus=='20')
|| (scope.row.degreeOfEducation=='2' && scope.row.isGradePic=='1' && scope.row.paiedOffline!='0' && scope.row.auditStatus=='20')
|| (scope.row.degreeOfEducation=='3' && scope.row.isGradePic=='1' && scope.row.paiedOffline!='0' && scope.row.auditStatus=='20')
) "
type="text" icon="el-icon-check" size="small" plain @click="lqtz(scope.row)">录取通知书
</el-button>
<el-button
v-if="permissions.recruit_recruitstudentsignup_show && scope.row.paiedOffline!='0' && scope.row.auditStatus=='20'"
type="text" icon="el-icon-check" size="small" plain @click="infoTable(scope.row)">信息表
</el-button>
<el-button v-if="permissions.recruit_recruitstudentsignup_push && scope.row.auditStatus=='20'" type="text"
icon="el-icon-upload" size="small" plain @click="handlePushCity(scope.row.id)">推送市局
</el-button>
</template>
</el-table-column>
<el-table-column
prop="serialNumber"
header-align="center"
align="center"
width="120"
label="唯一号">
</el-table-column>
<el-table-column
prop="name"
header-align="center"
align="center"
width="120"
label="姓名">
</el-table-column>
<el-table-column
prop="name"
header-align="center"
align="left"
width="250"
label="资料检测">
<template #default="scope">
<div v-if="scope.row.isOut=='0'">
<span >资料审核状态:</span>
<span style="color: #b4bccc" v-if="scope.row.zlsh=='0'">未填写</span>
<span style="color: green" v-if="scope.row.zlsh=='2' && scope.row.isOut=='0'">通过</span>
<span style="color: #ff9900" v-if="scope.row.zlsh=='1' && scope.row.isOut=='0'">待审核</span>
<span style="color: red" v-if="scope.row.zlsh=='3' && scope.row.isOut=='0'">驳回</span>
<br/>
<span v-if="scope.row.zlsh !='2'">材料状态:</span>
<span style="color: #ff9900" v-if="!scope.row.graPic && scope.row.zlsh !='2'">缺少毕业证</span>
<span style="color: #3c763d" v-if="scope.row.degreeOfEducation == '1' && scope.row.isOut == '1'">无需上传</span>
<span style="color: #ff9900" v-if="scope.row.degreeOfEducation == '1' && scope.row.zlsh !='2' && !scope.row.yyPic && !scope.row.housePic && !scope.row.sbPic">, 缺新市民材料</span>
<br />
<span v-if="scope.row.zlsh=='3' && scope.row.zlshRemark !='' && scope.row.zlshRemark !=null">资料审核意见:</span>
<span style="color: red" v-if="scope.row.zlsh=='3' && scope.row.zlshRemark !='' && scope.row.zlshRemark !=null">{{scope.row.zlshRemark}}</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="confirmedMajor"
header-align="center"
align="left"
label="录取专业">
<template #default="scope">
<span>录取状态:</span>
<span v-if="scope.row.auditStatus==0"
style="color: orange">{{ getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
<span v-if="scope.row.auditStatus==20"
style="color: green">{{ getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
<span v-if="scope.row.auditStatus==-20"
style="color: red">{{ getLabelValue(auditStatusList, scope.row.auditStatus) }}</span>
<br/>
<div v-if="scope.row.auditStatus==20">
录取专业:
{{ getMajorLabelWithYears(planMajorList, scope.row.confirmedMajor, { key: 'majorCode', value: 'majorName' }) }}<br/>
</div>
<div v-if="scope.row.auditStatus==20">
录取时间:{{ dateFormat(scope.row.auditTime) }}
</div>
<div v-if="scope.row.degreeOfEducation == '3'">
面试结果:{{ getLabelValue(interviewDicList, scope.row.interview) }}
<span v-if="scope.row.interview == '-1' && scope.row.interviewReason"
style="color: #ff9900">({{ scope.row.interviewReason }})</span>
</div>
<div v-if="scope.row.confirmedMajor">
证书发放:
<span v-if="scope.row.isBackTz=='0'" style="color: red">未发放</span>
<span v-if="scope.row.isBackTz=='1'" style="color: green">已发放</span>
</div>
<div v-if="scope.row.confirmedMajor">
发放人:
<span v-if="scope.row.isBackTz=='0'" style="color: red"></span>
<span v-if="scope.row.isBackTz=='1'" style="color: green">{{ scope.row.sendUserName }}</span>
</div>
</template>
</el-table-column>
<el-table-column
prop="xy"
header-align="center"
align="center"
width="120"
label="学院(经办人)">
<template #default="scope">
<span v-if="scope.row.auditStatus==20">
{{ getLabelValueByProps(deptList, scope.row.xy, { key: 'deptCode', value: 'deptName' }) }}
</span> <br/>
<span v-if="scope.row.auditStatus==20">
({{scope.row.auditorName}})
</span>
</template>
</el-table-column>
<el-table-column
prop="paiedOffline"
header-align="center"
align="center"
width="90"
label="缴费状态">
<template #default="scope">
{{ getStatus(scope.row.paiedOffline) }}
</template>
</el-table-column>
<el-table-column
prop="pushed"
header-align="center"
align="center"
width="90"
label="推送状态">
<template #default="scope">
<span v-if="scope.row.pushed==0" style="color: red">{{ getPushed(scope.row.pushed) }}</span>
<span v-if="scope.row.pushed==1" style="color: green">{{ getPushed(scope.row.pushed) }}</span>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<pagination
v-bind="pagination"
@current-change="currentChangeHandle"
@size-change="sizeChangeHandle"
/>
<!-- 弹窗, 新增 / 修改 -->
<table-form v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></table-form>
<major-change v-if="majorChangeVisible" ref="majorChange" @refreshDataList="getDataList"></major-change>
<update v-if="updateVisible" ref="update" @refreshDataList="getDataList"></update>
<!-- 支付二维码弹窗 -->
<pay-qrcode-dialog ref="payQrcodeDialogRef" @refresh="getDataList"></pay-qrcode-dialog>
<!-- 延迟缴费弹窗 -->
<delay-pay-time-dialog ref="delayPayTimeDialogRef" @refresh="getDataList"></delay-pay-time-dialog>
<!-- 录取通知书弹窗 -->
<admission-notice-dialog ref="admissionNoticeDialogRef" :permissions="permissions" @refresh="getDataList"></admission-notice-dialog>
<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>
</div>
</template>
<script setup lang="ts" name="recruitstudentsignup">
import { ref, reactive, computed, onMounted, nextTick, defineAsyncComponent, watch } from 'vue'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { useMessage, useMessageBox } from '/@/hooks/message'
import axios from 'axios'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import {
delObj,
exportZip,
fetchList,
leaveSchool,
rePush as rePushApi,
yjOut,
oneClass,
oneStuNo,
tbStuWork,
sendImg,
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 = () => {}
// 定义组件
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
const MajorChange = defineAsyncComponent(() => import('./majorChange.vue'))
const Update = defineAsyncComponent(() => import('./update.vue'))
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'))
const InterviewForm = defineAsyncComponent(() => import('/@/views/recruit/recruitstudentsignup/interviewForm.vue'))
const PayQrcodeDialog = defineAsyncComponent(() => import('./PayQrcodeDialog.vue'))
const DelayPayTimeDialog = defineAsyncComponent(() => import('./DelayPayTimeDialog.vue'))
const AdmissionNoticeDialog = defineAsyncComponent(() => import('./AdmissionNoticeDialog.vue'))
// 使用 Pinia store
const userInfoStore = useUserInfo()
const { userInfos } = storeToRefs(userInfoStore)
// 创建权限对象
const permissions = computed(() => {
const perms: Record<string, boolean> = {}
userInfos.value.authBtnList.forEach((perm: string) => {
perms[perm] = true
})
return perms
})
// 消息提示 hooks
const message = useMessage()
const messageBox = useMessageBox()
// 表格引用
const tableRef = ref()
const searchFormRef = ref()
const addOrUpdateRef = ref()
const majorChangeRef = ref()
const updateRef = ref()
const dormFWRef = ref()
const baiduMapRef = ref()
const interviewFormRef = ref()
const payQrcodeDialogRef = ref()
const delayPayTimeDialogRef = ref()
const admissionNoticeDialogRef = ref()
// 搜索表单显示状态
const showSearch = ref(true)
// 表单数据
const dataForm = reactive({
zlsh: '',
groupId: '',
xy: '',
confirmedMajor: '',
degreeOfEducation: '',
isAccommodation: '',
isMinimumLivingSecurity: '',
search: '',
auditor: '',
isNewCity: '',
startDate: '',
endDate: '',
lqStartDate: '',
lqEndDate: '',
paystatus: '',
graPic: '',
pushed: '',
wishMajorOne: '',
isTb: '',
cityExamType: '',
interview: '',
type: '',
auditStatus: '',
isOut: '',
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 addOrUpdateVisible = ref(false)
const majorChangeVisible = ref(false)
const updateVisible = ref(false)
const dormFWRefVisible = ref(false)
const baiduMapVisible = ref(false)
// 列表数据
const auditorList = ref<any[]>([])
const planList = ref<any[]>([])
const eduList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([])
const teacherList = ref<any[]>([])
const interviewDicList = ref<any[]>([])
const zlshList = ref<any[]>([])
const paystatusList = ref<any[]>([])
// 静态数据
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' }]
const isOutList = [{ label: '学校', value: '0' }, { label: '市平台', value: '1' }]
// 日期格式化
const dateFormat = (date: string | null | undefined) => {
if (!date) return ''
// return formatDate(date, format)
return date
}
// 日期选择器禁用日期
const startDateDisabledDate = (time: Date) => {
if (dataForm.endDate) {
return new Date(dataForm.endDate).getTime() < time.getTime()
}
return false
}
const endDateDisabledDate = (time: Date) => {
if (dataForm.startDate) {
return new Date(dataForm.startDate).getTime() > time.getTime()
}
return false
}
// 检索教师
const remoteTeacherByQuery = (query: string) => {
teacherList.value = []
if (query !== '') {
setTimeout(() => {
queryTeacherBaseByNo(query).then((response: any) => {
teacherList.value = response.data || []
}).catch(() => {
teacherList.value = []
})
}, 200)
}
}
// 发送图片
const handleSendImg = () => {
messageBox.confirm('是否确认同步招生图片到市平台?请谨慎操作').then(() => {
return sendImg()
}).then(() => {
message.success('同步图片请求已发起,请耐心等待')
}).catch(() => {
hideLoading()
})
}
// 同步学工
const handleTbStuWork = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
messageBox.confirm('是否确认同步学工?请谨慎操作').then(() => {
showLoading()
return tbStuWork(dataForm)
}).then(() => {
hideLoading()
message.success('同步完成')
}).catch(() => {
hideLoading()
})
}
// 一键分配班级和学号
const handleOneClassAndStuNo = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
messageBox.confirm('是否确认一键分配班级和学号?请谨慎操作').then(() => {
showLoading()
return Promise.all([oneClass(dataForm), oneStuNo(dataForm)])
}).then(() => {
hideLoading()
message.success('分配完成')
}).catch(() => {
hideLoading()
})
}
// 下载zip
const downZip = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
showLoading()
exportZip(dataForm).then(res => {
hideLoading()
const blob = new Blob([res.data])
const elink = document.createElement('a')
elink.download = '招生名单.zip'
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {
hideLoading()
})
}
// 百度地图
const baiduMap = (row: any) => {
baiduMapVisible.value = true
nextTick(() => {
baiduMapRef.value?.init(row)
})
}
// 设置宿舍
const setDormFW = () => {
dormFWRefVisible.value = true
nextTick(() => {
dormFWRef.value?.init()
})
}
// 一键判断是否超出住宿范围
const handleYjOut = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
messageBox.confirm('是否确认一键判断是否超出住宿范围?请谨慎操作').then(() => {
return yjOut({ groupId: dataForm.groupId })
}).then(() => {
message.success('操作成功')
getDataList()
})
}
// 导出审核
const handleExportAudit = (type: number) => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
downFile(type)
}
// 导出Excel
const exportExcel = (form: any, url: string) => {
return axios({
method: 'post',
url: url,
data: form,
responseType: 'blob',
headers: {
'Content-Type': 'application/json'
}
})
}
// 导出文件
const downFile = (type: number) => {
dataForm.type = String(type)
exportExcel(dataForm, '/recruit/recruitstudentsignup/exportExcel').then(res => {
const blob = new Blob([res.data])
const fileName = type == 1 ? '延迟缴费名单导出.xlsx' : '超时缴费名单导出.xlsx'
const elink = document.createElement('a')
elink.download = fileName
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {})
}
// 导出
const handleExport = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
exportExcel(dataForm, '/recruit/recruitstudentsignup/exportData').then(res => {
const blob = new Blob([res.data])
const elink = document.createElement('a')
elink.download = '招生名单导出.xls'
elink.style.display = 'none'
elink.href = URL.createObjectURL(blob)
document.body.appendChild(elink)
elink.click()
URL.revokeObjectURL(elink.href)
document.body.removeChild(elink)
}).catch(() => {})
}
// 去重
const unique = (arr: any[]) => {
const rese = new Map()
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 = []
if (dataForm.groupId) {
planMajor({ groupId: dataForm.groupId }).then(data => {
planMajorList.value = data.data
})
}
}
// 查询
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)
})
}
// 编辑
const edit = (id: string) => {
updateVisible.value = true
nextTick(() => {
updateRef.value?.init(id)
})
}
// 专业调整
const majorChange = (id: string) => {
majorChangeVisible.value = true
nextTick(() => {
majorChangeRef.value?.init(id)
})
}
// 退学
const handleUpdate = (id: string, groupId: string, feeAgency: string) => {
messageBox.confirm('是否确认办理退学操作?请谨慎操作').then(() => {
return leaveSchool({ id, groupId, feeAgency })
}).then(() => {
message.success('操作成功')
getDataList()
})
}
// 删除
const deleteHandle = (id: string) => {
messageBox.confirm('是否确认删除本条数据?请谨慎操作').then(() => {
return delObj(id)
}).then(() => {
message.success('删除成功')
getDataList()
})
}
// 重置表单
const resetForm = (formName: string) => {
if (formName === 'searchForm') {
searchFormRef.value?.formRef?.resetFields()
}
}
// 缴费状态
const getStatus = (type: string) => {
if (type == '0') return '未缴费'
if (type == '5') return '部分缴费'
if (type == '10') return '已缴费'
return ''
}
// 推送状态
const getPushed = (type: string) => {
if (type == '0') return '未推送'
if (type == '1') return '已推送'
return ''
}
// 专业状态
const getMajor = (type: string) => {
if (type == '0') return '未申请'
if (type == '1') return '待审核'
if (type == '2') return '驳回'
if (type == '3') return '已通过'
return ''
}
// 录取通知书
const lqtz = (row: any) => {
nextTick(() => {
admissionNoticeDialogRef.value?.init(row)
})
}
// 信息表
const infoTable = (row: any) => {
window.open('printRecruitedStu.html?appId=' + row.id)
}
// 推送市局
const handlePushCity = (id: string) => {
messageBox.confirm('是否确认推送该数据到市局审核?请谨慎操作').then(() => {
return pushCityApi({ id })
}).then(() => {
message.success('推送成功')
getDataList()
})
}
// 重新推送
const handleRePush = (row: any) => {
messageBox.confirm('是否确认重新推送本条数据?请谨慎操作').then(() => {
return rePushApi({ id: row.id })
}).then(() => {
message.success('推送成功')
getDataList()
})
}
// 延迟缴费
const delayPayTimeSet = (row: any) => {
nextTick(() => {
delayPayTimeDialogRef.value?.init(row)
})
}
// 支付二维码
const showPayCode = (row: any) => {
nextTick(() => {
payQrcodeDialogRef.value?.init(row)
})
}
// 面试
const interviewForm = (row: any) => {
interviewFormRef.value?.init(row)
}
// 初始化
const init = async () => {
// 查询二级学院信息
getDeptList().then(data => {
deptList.value = data.data
})
// 获取招生计划列表
list().then(data => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
getDataList()
chanMajor()
}
})
// 获取文化程度字典
getTypeValue('finance_student_source').then(res => {
eduList.value = res.data
})
// 批量获取字典数据:面试结果、资料审核状态、缴费状态
getDictsByTypes(['interview_dic', 'recruit_zlsh', 'recruit_pay_status']).then((res) => {
interviewDicList.value = res.data.interview_dic || []
zlshList.value = res.data.recruit_zlsh || []
paystatusList.value = res.data.recruit_pay_status || []
})
// 所有经办人
getUserListByRole(ROLE_CODE.ROLE_RECRUIT_SECOND).then((res: any) => {
auditorList.value = res.data || []
getUserListByRole(ROLE_CODE.ROLE_RECRUIT).then((re: any) => {
if (re.data) {
re.data.forEach((r: any) => {
auditorList.value.push(r)
})
}
auditorList.value = unique(auditorList.value)
})
})
}
// 监听招生计划变化
watch(() => dataForm.groupId, () => {
if (dataForm.groupId) {
chanMajor()
}
})
onMounted(() => {
init()
})
</script>
<style lang="scss" scoped>
// 样式内容
</style>