Files
school-developer/src/views/recruit/recruitstudentsignup/index.vue
zhoutianchi d1837e0a5f 1
2026-01-16 15:53:59 +08:00

1064 lines
36 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<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="deptCode">
<el-select v-model="dataForm.deptCode" 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>
</template>
<!-- 可折叠的高级筛选条件 -->
<template v-if="!visible">
<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 yes_no_type"
: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 yes_no_type"
: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 yes_no_type"
: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 yes_no_type"
: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 yes_no_type"
: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 @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
class="ml10"
type="primary"
icon="Plus"
v-if="permissions.recruit_send_img"
@click="handleAddData">新增
</el-button>
<el-button
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="state.dataList"
v-loading="state.loading"
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" @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="deptCode"
header-align="center"
align="center"
width="120"
label="学院(经办人)">
<template #default="scope">
<span v-if="scope.row.auditStatus==20">
{{ getLabelValueByProps(deptList, scope.row.deptCode, { 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="state.pagination"
@current-change="currentChangeHandle"
@size-change="sizeChangeHandle"
/>
<!-- 弹窗, 新增 / 修改 -->
<TableForm ref="addOrUpdateRef" @refreshDataList="getDataList"></TableForm>
<MajorChange ref="majorChangeRef" @refreshDataList="getDataList"></MajorChange>
<Update ref="updateRef" @refreshDataList="getDataList"></Update>
<!-- 支付二维码弹窗 -->
<PayQrcodeDialog ref="payQrcodeDialogRef" @refresh="getDataList"></PayQrcodeDialog>
<!-- 延迟缴费弹窗 -->
<DelayPayTimeDialog ref="delayPayTimeDialogRef" @refresh="getDataList"></DelayPayTimeDialog>
<!-- 录取通知书弹窗 -->
<AdmissionNoticeDialog ref="admissionNoticeDialogRef" :permissions="permissions" @refresh="getDataList"></AdmissionNoticeDialog>
<DormFW ref="dormFWRef"></DormFW>
<ShowMap ref="baiduMapRef"></ShowMap>
<InterviewForm ref="interviewFormRef" @refresh="getDataList"></InterviewForm>
</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 { BasicTableProps, useTable } from '/@/hooks/table'
import axios from 'axios'
import { getList } 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 { 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'))
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: '',
deptCode: '',
confirmedMajor: '',
degreeOfEducation: '',
isAccommodation: '',
isMinimumLivingSecurity: '',
search: '',
auditor: '',
isNewCity: '',
startDate: '',
endDate: '',
lqStartDate: '',
lqEndDate: '',
paystatus: '',
graPic: '',
pushed: '',
wishMajorOne: '',
isTb: '',
cityExamType: '',
interview: '',
type: '',
auditStatus: '',
isOut: '',
isBackTz: ''
})
// 表格状态
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
})
// 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
// 弹窗状态(已移除,组件内部通过 v-model="visible" 控制)
// 列表数据
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 { 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 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) => {
// 组件内部通过 v-model="visible" 控制显示
nextTick(() => {
baiduMapRef.value?.init(row)
})
}
// 设置宿舍
const setDormFW = () => {
// 组件内部通过 v-model="visible" 控制显示
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 chanMajor = () => {
planMajorList.value = []
if (dataForm.groupId) {
planMajor({ groupId: dataForm.groupId }).then(data => {
planMajorList.value = data.data
})
}
}
// 查询
const handleFilter = () => {
getDataList()
}
// 获取数据列表
const handleAddData=()=>{
addOrUpdateRef.value?.init(null, '1')
}
// 新增 / 修改
const addOrUpdateHandle = (id?: string, type?: number) => {
nextTick(() => {
// 新增时默认 type=1可编辑查看时 type=0只读审核时 type=1可编辑
const finalType = type !== undefined ? type : (id ? 0 : 1)
addOrUpdateRef.value?.init(id || null, finalType)
})
}
// 编辑
const edit = (id: string) => {
nextTick(() => {
updateRef.value?.init(id)
})
}
// 专业调整
const majorChange = (id: string) => {
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) => {
return getLabelValue(paystatusList.value, type)
}
// 推送状态
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) => {
nextTick(() => {
interviewFormRef.value?.init(row)
})
}
// 初始化
const init = async () => {
// 查询二级学院信息
getDeptList().then(data => {
deptList.value = data.data
})
// 获取招生计划列表
getList().then(data => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
getDataList()
chanMajor()
}
})
// 批量获取字典数据:文化程度、面试结果、资料审核状态、缴费状态
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 || []
})
// 所有经办人
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>