This commit is contained in:
guochunsi
2026-01-20 17:33:36 +08:00
parent 39c07a03ee
commit 48f65a6d1b
26 changed files with 946 additions and 590 deletions

View File

@@ -177,17 +177,6 @@
</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
@@ -220,7 +209,7 @@
@click="handleExport()">分班导出
</el-button>
<el-button
v-if="permissions.recruit_banding"
v-auth="'recruit_banding'"
class="ml10"
type="danger"
plain
@@ -228,7 +217,7 @@
@click="oneClassHandle()">一键分班
</el-button>
<el-button
v-if="permissions.recruit_banding"
v-auth="'recruit_banding'"
class="ml10"
type="danger"
plain
@@ -236,7 +225,7 @@
@click="oneStuNoHandle()">一键分学号
</el-button>
<el-button
v-if="permissions.recruit_synchronous_stuwork"
v-auth="'recruit_synchronous_stuwork'"
class="ml10"
type="primary"
plain
@@ -332,18 +321,19 @@
<el-table-column
header-align="center"
align="center"
width="180"
label="操作">
<template #default="scope">
<el-button type="primary" link icon="Document" size="small" @click="addOrUpdateHandle(scope.row.id,0)">
<el-button type="primary" link icon="Document" @click="addOrUpdateHandle(scope.row.id,0)">
查看
</el-button>
<el-button
v-if="permissions.recruit_banding && scope.row.isTb=='0' && scope.row.classNo !=null"
v-if="scope.row.isTb=='0' && scope.row.classNo !=null"
v-auth="'recruit_banding'"
type="primary"
link
size="small"
icon="Switch"
@click="changeclass(scope.row)">
<el-icon><Edit /></el-icon>
调整班级
</el-button>
</template>
@@ -357,106 +347,31 @@
@size-change="sizeChangeHandle"
/>
<!-- 弹窗, 新增 / 修改 -->
<TableForm v-if="addOrUpdateVisible" ref="addOrUpdateRef" @refreshDataList="getDataList" ></TableForm>
<TableForm ref="addOrUpdateRef" @refreshDataList="getDataList" ></TableForm>
<MajorChange v-if="majorChangeVisible" ref="majorChangeRef" @refreshDataList="getDataList"></MajorChange>
<Update v-if="updateVisible" ref="updateRef" @refreshDataList="getDataList"></Update>
<el-dialog title="支付二维码" v-model="dialogFormVisible" width="800px"
@close="dialogFormVisible=false">
<el-table :data="tableData" border>
<el-table-column label="唯一号" prop="serialNumber" align="center"></el-table-column>
<el-table-column label="姓名" prop="name" align="center"></el-table-column>
<el-table-column label="家长手机号" prop="parentTelOne" align="center"></el-table-column>
<el-table-column label="操作" prop="" align="center">
<template #default>
<el-button @click="updateFS()" type="danger" size="small">
<el-icon><Search /></el-icon>
立即查询
</el-button>
</template>
</el-table-column>
</el-table>
<div style="padding-top: 20px;">
<div id="payQrcode1" style="display: inline-block;" >
{{payQrcode1Msg}}
</div>
<vue-qr :text="payQrcode1" :size="200" v-if="showPrise1" style="display: inline-block"></vue-qr>
<div id="payQrcode2" style="display: inline-block">
{{payQrcode2Msg}}
</div>
<vue-qr :text="payQrcode2" :size="200" v-if="showPrise2" style="display: inline-block"></vue-qr>
<div id="payQrcode3" style="display: inline-block">
{{payQrcode3Msg}}
</div>
<vue-qr :text="payQrcode3" :size="200" v-if="showPrise3" style="display: inline-block"></vue-qr>
</div>
<span style="color: red;padding-top: 20px;">** 此界面为查询学生缴款二维码如有收不到微信推送或手机号填错的可直接在此扫码支付支付成功后请手动点击"立即查询"按钮查询该生的缴费情况;因财政收费系统有一定的滞后性如点击"立即查询"后任显示未交费请稍后再继续查询或重新点击"立即查询"按钮 **</span>
</el-dialog>
<el-dialog title="延迟缴费" v-model="delayPayTimeVisible" width="300px"
@close="delayPayTimeVisible=false">
<el-date-picker v-model="delayPayTime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" clearable type="datetime" ></el-date-picker>
<template #footer>
<div class="dialog-footer">
<el-button @click="delayPayTimeVisible=false"> </el-button>
<el-button @click="updateInfoHandle" type="primary">保存</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="录取通知书" v-model="lqtzsVisible" width="80%"
@close="lqtzsVisible=false">
<div style="height: 60vh">
<iframe id="iframeid" :src="pdfPath" ref="iframeRef" frameborder="0" style="width:100%;height:100%;"></iframe>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="lqtzsVisible=false"> </el-button>
<el-button @click="suerLQTZ" v-if="permissions.sureLQTZ && lqtzsShow" type="primary">确认已打印</el-button>
</div>
</template>
</el-dialog>
<el-dialog title="班级调整" v-model="changeClassVisible" width="500px"
<el-dialog title="班级调整" v-model="changeClassVisible" width="600px"
@close="changeClassVisible=false">
<el-form ref="formRef" :model="changeForm" label-width="80px">
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="原班级">
<el-select v-model="changeForm.oldClass" size="small" placeholder="请选择班级" disabled >
<el-option
v-for="item in classList"
:key="item.classCode"
:label="item.classNo"
:value="item.classCode">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24">
<el-col :span="24">
<el-form-item label="新班级">
<el-select v-model="changeForm.classNo" filterable size="small" placeholder="请选择新班级" >
<el-option
v-for="item in changeClassList"
:key="item.classNo"
:label="item.classNo"
:value="item.classNo">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="原班级">
<el-select v-model="changeForm.oldClass" placeholder="请选择班级" disabled >
<el-option
v-for="item in classList"
:key="item.classCode"
:label="item.classNo"
:value="item.classCode">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="新班级">
<el-select v-model="changeForm.classNo" filterable placeholder="请选择新班级" >
<el-option
v-for="item in changeClassList"
:key="item.classNo"
:label="item.classNo"
:value="item.classNo">
</el-option>
</el-select>
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
@@ -465,35 +380,22 @@
</div>
</template>
</el-dialog>
<DormFW v-if="dormFWRefVisible" ref="dormFWRef"></DormFW>
<ShowMap v-if="baiduMapVisible" ref="baiduMapRef"></ShowMap>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, computed, nextTick, onMounted, defineAsyncComponent } from 'vue'
import { ref, reactive, nextTick, onMounted, defineAsyncComponent } from 'vue'
import { Search, ZoomIn, Edit } from '@element-plus/icons-vue'
import { ElNotification } from 'element-plus'
import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { useMessage } from '/@/hooks/message'
import { useMessageBox } from '/@/hooks/message'
import { BasicTableProps, useTable } from '/@/hooks/table'
import axios from 'axios'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import {
delObj,
exportZip,
classPage,
leaveSchool,
rePush,
updateInfo,
yjOut,
toWord,
sureLQTZ,
tbStuWork,
sendImg,
oneClass,
oneStuNo,
changeClassInfo, getMajorClass
@@ -503,31 +405,13 @@ import { getClassListByRole, getDeptList } from "/@/api/basic/basicclass"
import {listPlanByCondition as planMajor} from "/@/api/recruit/recruitstudentplan"
import { getTypeValue } from "/@/api/admin/dict"
import { getUserListByRole } from "/@/api/admin/user"
import { ROLE_CODE } from "/@/config/global"
import { updateFs } from "/@/api/finance/financenormalstu"
import { ROLE_CODE, PAY_STATUS_LIST, PUSHED_STATUS_LIST, DATA_SOURCE_LIST } from "/@/config/global"
import { showLoading, hideLoading } from '/@/api/asset/loading'
import { useDict } from '/@/hooks/dict'
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 GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.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()
@@ -550,11 +434,6 @@ const searchFormRef = ref()
const formRef = ref()
const tableRef = ref()
const addOrUpdateRef = ref()
const majorChangeRef = ref()
const updateRef = ref()
const dormFWRef = ref()
const baiduMapRef = ref()
const iframeRef = ref()
// 响应式数据
const changeForm = reactive({
@@ -588,12 +467,8 @@ const dataForm = reactive({
isBackTz: ""
})
const id = ref("")
const pdfPath = ref("")
const delayPayTime = ref("")
const auditorList = ref<any[]>([])
const isBackTzList = [{ label: "未打印", value: "0" }, { label: "已打印", value: "1" }]
const paystatusList = [{ label: "已缴费", value: "10" }, { label: "未缴费", value: "0" }, { label: "部分缴费", value: "5" }]
const paystatusList = PAY_STATUS_LIST
// 搜索表单显示状态
const showSearch = ref(true)
@@ -601,10 +476,9 @@ const showSearch = ref(true)
const planList = ref<any[]>([])
const eduList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const pushedList = [{ label: "未推送", value: "0" }, { label: "已推送", value: "1" }]
const isOutList = [{ label: "学校", value: "0" }, { label: "市平台", value: "1" }]
const pushedList = PUSHED_STATUS_LIST
const isOutList = DATA_SOURCE_LIST
const deptList = ref<any[]>([])
const lqtzsShow = ref(false)
// 字典数据
const { yes_no_type } = useDict('yes_no_type')
@@ -627,26 +501,7 @@ const state: BasicTableProps = reactive<BasicTableProps>({
// 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
const addOrUpdateVisible = ref(false)
const changeClassVisible = ref(false)
const majorChangeVisible = ref(false)
const lqtzsVisible = ref(false)
const updateVisible = ref(false)
const payQrcode1 = ref("")
const showPrise1 = ref(false)
const payQrcode1Msg = ref("")
const payQrcode2 = ref("")
const payQrcode2Msg = ref("")
const showPrise2 = ref(false)
const payQrcode3 = ref("")
const payQrcode3Msg = ref("")
const showPrise3 = ref(false)
const dialogFormVisible = ref(false)
const delayPayTimeVisible = ref(false)
const dormFWRefVisible = ref(false)
const baiduMapVisible = ref(false)
const tableData = ref<any[]>([])
const classList = ref<any[]>([])
const changeClassList = ref<any[]>([])
@@ -671,15 +526,7 @@ const getClassData = () => {
classList.value = data.data
})
}
const sendImgHandle = () => {
useMessageBox().confirm('是否确认同步招生图片到市平台?请谨慎操作').then(() => {
return sendImg()
}).then(() => {
message.success('同步图片请求已发起,请耐心等待')
}).catch(() => {
hideLoading()
})
}
const tbStuWorkHandle = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
@@ -728,62 +575,6 @@ const oneStuNoHandle = () => {
hideLoading()
})
}
const downZip = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
showLoading()
exportZip(dataForm).then((res: any) => {
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 yjOutHandle = () => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
useMessageBox().confirm('是否确认一键判断是否超出住宿范围?请谨慎操作').then(() => {
return yjOut({ groupId: dataForm.groupId })
}).then(() => {
message.success('操作成功')
getDataList()
})
}
const handleExportAudit = (type: number) => {
if (dataForm.groupId == '') {
message.warning('招生计划不能为空')
return
}
downFile(type)
}
const handleExport = () => {
if (dataForm.groupId == '') {
@@ -816,27 +607,6 @@ const exportExcel = (form: any, url: string) => {
})
}
const downFile = (type: number) => {
dataForm.type = String(type)
exportExcel(dataForm, '/recruit/recruitstudentsignup/exportExcel').then((res: any) => {
const blob = new Blob([res.data])
let fileName = ""
if (type == 1) {
fileName = '延迟缴费名单导出.xlsx'
} else {
fileName = '超时缴费名单导出.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 init = () => {
// 查询二级学院信息
getDeptList().then((data: any) => {
@@ -871,17 +641,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 = []
planMajor({ groupId: dataForm.groupId }).then((data: any) => {
@@ -906,27 +665,11 @@ const changeclass = (row: any) => {
// 新增 / 修改
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 majorChangeHandle = (id: string) => {
majorChangeVisible.value = true
nextTick(() => {
majorChangeRef.value?.init(id)
})
}
const changeClassInfoHandle = () => {
if (changeForm.classNo == '') {
message.error('调整班级不能空')
@@ -951,25 +694,6 @@ const changeClassInfoHandle = () => {
})
}
const updateHandle = (id: string, groupId: string, feeAgency: string) => {
useMessageBox().confirm('是否确认办理退学操作?请谨慎操作').then(() => {
return leaveSchool({ id: id, groupId: groupId, feeAgency: feeAgency })
}).then(() => {
message.success('操作成功')
getDataList()
})
}
// 删除
const deleteHandle = (id: string) => {
useMessageBox().confirm('是否确认删除本条数据?请谨慎操作').then(() => {
return delObj(id)
}).then(() => {
message.success('删除成功')
getDataList()
})
}
const resetForm = (formName: string) => {
if (formName === 'searchForm') {
searchFormRef.value?.formRef?.resetFields()
@@ -977,148 +701,6 @@ const resetForm = (formName: string) => {
formRef.value?.resetFields()
}
}
// 使用插槽 缴费状态
const getStatus = (type: string) => {
if (type == '0') {
return '未缴费'
} else if (type == '5') {
return '部分缴费'
} else if (type == '10') {
return '已缴费'
}
return ''
}
const getPushed = (type: string) => {
if (type == '0') {
return '未推送'
} else if (type == '1') {
return '已推送'
}
return ''
}
const getMajor = (type: string) => {
if (type == '0') {
return '未申请'
} else if (type == '1') {
return '待审核'
} else if (type == '2') {
return '驳回'
} else if (type == '3') {
return '已通过'
}
return ''
}
const lqtz = (row: any) => {
id.value = row.id
pdfPath.value = ""
if (row.isBackTz == '0') {
lqtzsShow.value = true
} else {
lqtzsShow.value = false
}
toWord(row).then((res: any) => {
pdfPath.value = "/recruit/file/previewPdf?filePath=" + encodeURIComponent(res.data)
lqtzsVisible.value = true
})
}
const infoTable = (row: any) => {
window.open("printRecruitedStu.html?appId=" + row.id)
}
const suerLQTZ = () => {
useMessageBox().confirm('是否确认已打印本通知书?请谨慎操作').then(() => {
return sureLQTZ({ id: id.value })
}).then(() => {
message.success('保存成功')
lqtzsVisible.value = false
getDataList()
})
}
const rePushHandle = (row: any) => {
useMessageBox().confirm('是否确认重新推送本条数据?请谨慎操作').then(() => {
return rePush({ id: row.id })
}).then(() => {
message.success('推送成功')
getDataList()
})
}
const delayPayTimeSet = (row: any) => {
delayPayTime.value = ''
id.value = row.id
if (row.delayPaymentTime) {
delayPayTime.value = row.delayPaymentTime
}
delayPayTimeVisible.value = true
}
const updateInfoHandle = () => {
useMessageBox().confirm('是否确认进度延迟收费操作?请谨慎操作').then(() => {
return updateInfo({ delayPaymentTime: delayPayTime.value, id: id.value })
}).then(() => {
delayPayTimeVisible.value = false
message.success('延迟收费修改成功')
getDataList()
})
}
const updateFS = () => {
updateFs({ "serialNumber": tableData.value[0].serialNumber.substring(1, tableData.value[0].serialNumber.length) }).then(() => {
ElNotification.success({
title: '成功',
message: '已提交查询请求请等待1分钟后重新查询'
})
dialogFormVisible.value = false
getDataList()
})
}
const showPayCode = (row: any) => {
showPrise1.value = false
showPrise2.value = false
showPrise3.value = false
// 置空
payQrcode1.value = ""
payQrcode2.value = ""
payQrcode3.value = ""
if (row.clfPayCode == "" || row.clfPayCode == undefined) {
payQrcode1Msg.value = ""
showPrise1.value = false
} else {
payQrcode1Msg.value = "材料费、代办费"
showPrise1.value = true
payQrcode1.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.clfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
if (row.xfPayCode == "" || row.xfPayCode == undefined) {
payQrcode2Msg.value = ""
showPrise2.value = false
} else {
payQrcode2Msg.value = "学费"
showPrise2.value = true
payQrcode2.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.xfPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
if (row.zdbPayCode == "" || row.zdbPayCode == undefined) {
payQrcode3Msg.value = ""
showPrise3.value = false
} else {
payQrcode3Msg.value = "中德班学费"
showPrise3.value = true
payQrcode3.value = 'https://jscz.govpay.ccb.com/online/fsjf?PyF_BillNo=' + row.zdbPayCode + '&Verf_CD=blank&Admn_Rgon_Cd=320400'
}
tableData.value = []
tableData.value.push(row)
dialogFormVisible.value = true
}
// 初始化
onMounted(() => {