普通招生

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

@@ -2,8 +2,8 @@
<el-dialog title="延迟缴费" v-model="visible" width="300px" height="50%" @close="handleClose">
<el-date-picker
v-model="delayPayTime"
format="yyyy-MM-dd HH:mm:ss"
value-format="yyyy-MM-dd HH:mm:ss"
format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"
filterable
clearable
type="datetime"

View File

@@ -47,7 +47,7 @@
import { ref, reactive, onMounted } from 'vue'
import axios from 'axios'
import { getAreaStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
import { getList } from "@/api/recruit/recruitstudentplangroup"
// 响应式数据
const dataForm = reactive({
@@ -64,7 +64,7 @@ const typeEchartBarRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id

View File

@@ -42,7 +42,7 @@
<script setup lang="ts">
import { ref, reactive, onMounted } from 'vue'
import { getContantByUserStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
import { getList } from "@/api/recruit/recruitstudentplangroup"
// 响应式数据
const dataForm = reactive({
@@ -57,7 +57,7 @@ const searchFormRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id

View File

@@ -45,7 +45,7 @@
import { ref, reactive, onMounted } from 'vue'
import axios from 'axios'
import { getContantByDeptStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
import { getList } from "@/api/recruit/recruitstudentplangroup"
// 响应式数据
const dataForm = reactive({
@@ -59,7 +59,7 @@ const searchFormRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id

View File

@@ -48,7 +48,7 @@
import { ref, reactive, onMounted } from 'vue'
import axios from 'axios'
import { getContantByUserStatic } from "@/api/recruit/recruitstudentsignup"
import { list } from "@/api/recruit/recruitstudentplangroup"
import { getList } from "@/api/recruit/recruitstudentplangroup"
// 响应式数据
const dataForm = reactive({
@@ -63,7 +63,7 @@ const searchFormRef = ref()
// 初始化
const init = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id

File diff suppressed because it is too large Load Diff

View File

@@ -4,8 +4,8 @@
append-to-body
:close-on-click-modal="false"
v-model="visible"
width="90%">
<div style="height: 100%;width:100%">
width="800">
<div>
<el-form :model="form" :rules="rules" ref="formRef" label-width="120px"
class="demo-ruleForm">
@@ -141,7 +141,7 @@ defineExpose({
#container {
overflow: hidden;
width: 100%;
height: 700px;
height: 500px;
margin: 0;
font-family: "微软雅黑";
}

View File

@@ -1,10 +1,8 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList" ref="searchFormRef">
<div>
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList" ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划" size="small"
style="width: 150px;">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划">
<el-option
v-for="item in planList"
:key="item.id"
@@ -16,7 +14,7 @@
<el-form-item>
<el-button type="warning"
icon="Download"
size="small"
plain
@click="handleExport">汇总导出</el-button>
</el-form-item>
</el-form>
@@ -34,12 +32,7 @@
width="120"
label="学院">
<template #default="scope">
<span>{{
global.getLabelValueByPropes(deptList, scope.row.xy, {
'key': 'deptCode',
'value': 'deptName'
})
}}</span>
<span>{{ getLabelValueByProps(deptList, scope.row.xy, { key: 'deptCode', value: 'deptName' }) }}</span>
</template>
</el-table-column>
<el-table-column
@@ -62,19 +55,16 @@
</el-table-column>
</el-table>
</basic-container>
</div>
</template>
<script setup lang="ts">
<script setup lang="ts" name="dormAnalysis">
import { ref, reactive, watch, onMounted } from 'vue'
import axios from 'axios'
import { getDeptList } from "@/api/basic/basicclass"
import { dormApplyAnalysis } from "@/api/recruit/recruitstudentsignup"
import { list } from '@/api/recruit/recruitstudentplangroup'
// @ts-ignore
import global from '@/components/tools/commondict'
import { getDeptList } from "/@/api/basic/basicclass"
import { dormApplyAnalysis } from "/@/api/recruit/recruitstudentsignup"
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { getLabelValueByProps } from '/@/utils/dictLabel'
// 响应式数据
const deptList = ref<any[]>([])
@@ -133,7 +123,7 @@ const handleExport = () => {
// 初始化招生计划
const initPlanGroup = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
@@ -166,8 +156,5 @@ onMounted(() => {
})
</script>
<style scoped>
.mod-config {
padding: 20px;
}
<style lang="scss" scoped>
</style>

View File

@@ -48,7 +48,7 @@ import { ref, reactive, onMounted } from 'vue'
import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { inSchoolSocreStatic } from '/@/api/recruit/recruitstudentsignup'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
// 消息提示 hooks
@@ -75,7 +75,7 @@ const init = async () => {
try {
const [deptResponse, planData] = await Promise.all([
getDeptListByLevelTwo(),
list()
getList()
])
deptCodes.value = deptResponse.data || []

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 || []

View File

@@ -1,9 +1,17 @@
<template>
<div class="mod-config">
<basic-container>
<el-form :inline="true" :model="dataForm" @keyup.enter="getDataList()" ref="searchFormRef">
<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="请选择招生计划" size="small" @change="chanMajor" style="width: 150px;">
<el-select v-model="dataForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
<el-option
v-for="item in planList"
:key="item.id"
@@ -13,7 +21,7 @@
</el-select>
</el-form-item>
<el-form-item label="学院" prop="xy">
<el-select v-model="dataForm.xy" filterable clearable placeholder="请选择学院" size="small" style="width: 130px;">
<el-select v-model="dataForm.xy" filterable clearable placeholder="请选择学院">
<el-option
v-for="item in deptList"
:key="item.deptCode"
@@ -22,16 +30,40 @@
</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 size="small"
:disabled-date="startDateDisabled" type="date" style="width: 200px;" ></el-date-picker>
-
<el-date-picker v-model="dataForm.endDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD" clearable size="small"
:disabled-date="endDateDisabled" type="date" style="width: 200px;" ></el-date-picker>
<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="startDateDisabled"
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="endDateDisabled"
type="date"
/>
</el-form-item>
<el-form-item label="班级" prop="classNo">
<el-select filterable clearable v-model="dataForm.classCode" placeholder="请选择班级">
<el-option
v-for="item in classList"
:key="item.classCode"
:label="item.classNo"
:value="item.classCode">
</el-option>
</el-select>
</el-form-item>
</template>
<!-- 可折叠的高级筛选条件 -->
<template v-if="!visible">
<el-form-item label="录取专业" prop="confirmedMajor">
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="请选择录取专业" size="small" >
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
@@ -42,7 +74,7 @@
</el-form-item>
<el-form-item label="拟报专业" prop="wishMajorOne">
<el-select v-model="dataForm.wishMajorOne" filterable clearable placeholder="请选择录取专业" size="small" >
<el-select v-model="dataForm.wishMajorOne" filterable clearable placeholder="请选择录取专业">
<el-option
v-for="item in planMajorList"
:key="item.majorCode"
@@ -52,10 +84,10 @@
</el-select>
</el-form-item>
<el-form-item label="唯一号/姓名/身份证号/学校名称" prop="search">
<el-input v-model="dataForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" size="small"></el-input>
<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="请选择文化程度" size="small" style="width: 120px;">
<el-select v-model="dataForm.degreeOfEducation" filterable clearable placeholder="请选择文化程度">
<el-option
v-for="item in eduList"
:key="item.value"
@@ -65,9 +97,9 @@
</el-select>
</el-form-item>
<el-form-item label="是否住宿" prop="isAccommodation">
<el-select v-model="dataForm.isAccommodation" filterable clearable placeholder="请选择是否住宿" size="small" style="width: 120px;" >
<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">
@@ -75,9 +107,9 @@
</el-select>
</el-form-item>
<el-form-item label="是否低保" prop="isMinimumLivingSecurity">
<el-select v-model="dataForm.isMinimumLivingSecurity" filterable clearable placeholder="请选择是否低保" size="small" style="width: 120px;" >
<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">
@@ -85,7 +117,7 @@
</el-select>
</el-form-item>
<el-form-item label="经办人" prop="auditor">
<el-select v-model="dataForm.auditor" filterable clearable placeholder="请选择经办人" size="small" style="width: 120px;">
<el-select v-model="dataForm.auditor" filterable clearable placeholder="请选择经办人">
<el-option
v-for="item in auditorList"
:key="item.username"
@@ -95,7 +127,7 @@
</el-select>
</el-form-item>
<el-form-item label="缴费状态" prop="paystatus">
<el-select v-model="dataForm.paystatus" filterable clearable placeholder="请选择缴费状态" size="small" style="width: 120px;" >
<el-select v-model="dataForm.paystatus" filterable clearable placeholder="请选择缴费状态">
<el-option
v-for="item in paystatusList"
:key="item.value"
@@ -105,9 +137,9 @@
</el-select>
</el-form-item>
<el-form-item label="新市民材料已上传" prop="isNewCity">
<el-select v-model="dataForm.isNewCity" filterable clearable placeholder="请选择新市民材料已上传" size="small" style="width: 120px;" >
<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">
@@ -115,9 +147,9 @@
</el-select>
</el-form-item>
<el-form-item label="毕业证已上传" prop="graPic">
<el-select v-model="dataForm.graPic" filterable clearable placeholder="请选择毕业证已上传" size="small" style="width: 120px;">
<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">
@@ -125,7 +157,7 @@
</el-select>
</el-form-item>
<el-form-item label="推送状态" prop="pushed">
<el-select v-model="dataForm.pushed" filterable clearable placeholder="请选择推送状态" size="small" style="width: 120px;" >
<el-select v-model="dataForm.pushed" filterable clearable placeholder="请选择推送状态">
<el-option
v-for="item in pushedList"
:key="item.value"
@@ -136,7 +168,7 @@
</el-form-item>
<el-form-item label="来源" prop="isOut">
<el-select v-model="dataForm.isOut" filterable clearable placeholder="请选择来源" size="small" style="width: 120px;" >
<el-select v-model="dataForm.isOut" filterable clearable placeholder="请选择来源">
<el-option
v-for="item in isOutList"
:key="item.value"
@@ -146,7 +178,7 @@
</el-select>
</el-form-item>
<el-form-item label="是否打印" prop="isBackTz">
<el-select v-model="dataForm.isBackTz" filterable clearable placeholder="请选择是否打印" size="small" style="width: 120px;" >
<el-select v-model="dataForm.isBackTz" filterable clearable placeholder="请选择是否打印">
<el-option
v-for="item in isBackTzList"
:key="item.value"
@@ -157,60 +189,72 @@
</el-form-item>
<el-form-item label="是否同步学工" prop="isTb">
<el-select v-model="dataForm.isTb" filterable clearable placeholder="请选择是否同步学工" size="small" style="width: 120px;" >
<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">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="班级" prop="classNo">
<el-select filterable clearable v-model="dataForm.classCode" size="small" placeholder="请选择班级" >
<el-option
v-for="item in classList"
:key="item.classCode"
:label="item.classNo"
:value="item.classCode">
</el-option>
</el-select>
</el-form-item>
</template>
</template>
<!-- 操作按钮 -->
<template #actions>
<el-form-item>
<el-button :icon="Search" type="primary" size="small"
@click="handleFilter()">查询
<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
type="warning"
plain
icon="Download"
@click="handleExport()">分班导出
</el-button>
<el-button :icon="Delete" type="default" plain size="small"
@click="resetForm('searchFormRef')">清空
<el-button
v-if="permissions.recruit_banding"
class="ml10"
type="danger"
plain
icon="Promotion"
@click="oneClassHandle()">一键分班
</el-button>
<el-button
v-if="permissions.recruit_banding"
class="ml10"
type="danger"
plain
icon="Promotion"
@click="oneStuNoHandle()">一键分学号
</el-button>
<el-button
v-if="permissions.recruit_synchronous_stuwork"
class="ml10"
type="primary"
plain
icon="Connection"
@click="tbStuWorkHandle()">同步学工
</el-button>
</div>
</el-row>
<el-button type="warning"
:icon="Download"
size="small"
@click="handleExport()">分班导出</el-button>
<el-button type="danger"
v-if="permissions.recruit_banding"
size="small"
@click="oneClassHandle()">一键分班</el-button>
<el-button type="danger"
v-if="permissions.recruit_banding"
size="small"
@click="oneStuNoHandle()">一键分学号</el-button>
<el-button type="success"
v-if="permissions.recruit_synchronous_stuwork"
size="small"
@click="tbStuWorkHandle()">同步学工</el-button>
</el-form-item>
</el-form>
<div class="avue-crud">
<el-table
:data="dataList"
border
stripe
v-loading="dataListLoading">
<!-- 表格 -->
<el-table
ref="tableRef"
:data="state.dataList"
border
stripe
v-loading="state.loading"
:cell-style="tableStyle.cellStyle"
:header-cell-style="tableStyle.headerCellStyle">
<el-table-column
prop="serialNumber"
@@ -228,15 +272,17 @@
prop="gender"
header-align="center"
align="center"
width="90"
label="性别">
<template #default="scope">
{{getGender(scope.row.gender)}}
<GenderTag :sex="scope.row.gender" />
</template>
</el-table-column>
<el-table-column
prop="idNumber"
header-align="center"
align="center"
min-width="180"
label="身份证号">
</el-table-column>
<el-table-column
@@ -275,10 +321,11 @@
prop="isTb"
header-align="center"
align="center"
width="100"
label="是否同步">
<template #default="scope">
<span v-if="scope.row.isTb=='0'" style="color: red"></span>
<span v-if="scope.row.isTb=='1'" style="color: green"></span>
<el-tag v-if="scope.row.isTb=='1'" type="success"></el-tag>
<el-tag v-else-if="scope.row.isTb=='0'" type="danger"></el-tag>
</template>
</el-table-column>
@@ -287,25 +334,28 @@
align="center"
label="操作">
<template #default="scope">
<el-button type="primary" link size="small" @click="addOrUpdateHandle(scope.row.id,0)" :icon="ZoomIn" plain>查看</el-button>
<el-button type="primary" link size="small" @click="changeclass(scope.row)" v-if="permissions.recruit_banding && scope.row.isTb=='0' && scope.row.classNo !=null" :icon="Edit" plain>调整班级</el-button>
<el-button type="primary" link icon="Document" size="small" @click="addOrUpdateHandle(scope.row.id,0)">
查看
</el-button>
<el-button
v-if="permissions.recruit_banding && scope.row.isTb=='0' && scope.row.classNo !=null"
type="primary"
link
size="small"
@click="changeclass(scope.row)">
<el-icon><Edit /></el-icon>
调整班级
</el-button>
</template>
</el-table-column>
</el-table>
</div>
</el-table>
<div class="avue-crud__pagination">
<el-pagination
@size-change="sizeChangeHandle"
@current-change="currentChangeHandle"
:current-page="pageIndex"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
:total="totalPage"
background
layout="total, sizes, prev, pager, next, jumper">
</el-pagination>
</div>
<!-- 分页 -->
<pagination
v-bind="state.pagination"
@current-change="currentChangeHandle"
@size-change="sizeChangeHandle"
/>
<!-- 弹窗, 新增 / 修改 -->
<TableForm v-if="addOrUpdateVisible" ref="addOrUpdateRef" @refreshDataList="getDataList" ></TableForm>
@@ -321,7 +371,10 @@
<el-table-column label="家长手机号" prop="parentTelOne" align="center"></el-table-column>
<el-table-column label="操作" prop="" align="center">
<template #default>
<el-button @click="updateFS()" :icon="Search" type="danger" size="small">立即查询</el-button>
<el-button @click="updateFS()" type="danger" size="small">
<el-icon><Search /></el-icon>
立即查询
</el-button>
</template>
</el-table-column>
</el-table>
@@ -414,21 +467,21 @@
</el-dialog>
<DormFW v-if="dormFWRefVisible" ref="dormFWRef"></DormFW>
<ShowMap v-if="baiduMapVisible" ref="baiduMapRef"></ShowMap>
</basic-container>
</div>
</div>
</template>
<script setup lang="ts">
import { ref, reactive, computed, nextTick, onMounted } from 'vue'
import { defineAsyncComponent } from 'vue'
import { Search, Delete, Download, ZoomIn, Edit } from '@element-plus/icons-vue'
import { ref, reactive, computed, 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 { list } from '@/api/recruit/recruitstudentplangroup'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import {
delObj,
exportZip,
@@ -444,21 +497,23 @@ import {
oneClass,
oneStuNo,
changeClassInfo, getMajorClass
} from '@/api/recruit/recruitstudentsignup'
import global from '@/components/tools/commondict'
import { getClassListByRole, getDeptList, queryAllClassByInfo } 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 { showLoading, hideLoading } from '@/api/asset/loading'
} from '/@/api/recruit/recruitstudentsignup'
import { getLabelValueByProps } from '/@/utils/dictLabel'
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 { 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()
@@ -475,20 +530,25 @@ const permissions = computed(() => {
// 使用 hooks
const message = useMessage()
const messageBox = useMessageBox()
// 辅助函数
const getLabelValueByPropes = (list: any[], key: string, props: { key: string, value: string }) => {
return global.getLabelValueByPropes(list, key, props)
return getLabelValueByProps(list, key, props)
}
const getLabelValueByPropes2 = (list: any[], key: string, props: { key: string, value: string }) => {
return global.getLabelValueByPropes2(list, key, props)
if (!list || !Array.isArray(list)) return ''
const item = list.find((it: any) => String(it[props.key]) === String(key))
if (!item) return ''
const majorName = item[props.value] ?? ''
const years = item.learnYear != null ? `${item.learnYear}年制` : ''
return years ? `${majorName}(${years})` : majorName
}
// 表单引用
const searchFormRef = ref()
const formRef = ref()
const tableRef = ref()
const addOrUpdateRef = ref()
const majorChangeRef = ref()
const updateRef = ref()
@@ -534,21 +594,39 @@ 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 showSearch = ref(true)
// 列表数据
const planList = ref<any[]>([])
const eduList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const auditStatusList = [{ label: "未录取", value: "-20" }, { label: "待审核", value: "0" }, { label: "已录取", value: "20" }]
const yesNoList = [{ label: "否", value: "0" }, { label: "是", value: "1" }]
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 deptList = ref<any[]>([])
const dataList = ref<any[]>([])
const pageIndex = ref(1)
const pageSize = ref(10)
const totalPage = ref(0)
const lqtzsShow = ref(false)
const dataListLoading = ref(false)
// 字典数据
const { yes_no_type } = useDict('yes_no_type')
// 表格状态
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: dataForm,
pageList: async (params: any) => {
params.auditStatus = '20'
const response = await classPage(params)
return {
data: {
records: response.data.records || [],
total: response.data.total || 0
}
}
},
createdIsNeed: false
})
// 使用 table hook
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
const addOrUpdateVisible = ref(false)
const changeClassVisible = ref(false)
const majorChangeVisible = ref(false)
@@ -765,7 +843,7 @@ const init = () => {
deptList.value = data.data
})
getClassData()
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
if (planList.value.length > 0) {
dataForm.groupId = planList.value[0].id
@@ -812,35 +890,6 @@ const chanMajor = () => {
}
const handleFilter = () => {
pageIndex.value = 1
getDataList()
}
// 获取数据列表
const getDataList = () => {
dataList.value = []
dataListLoading.value = true
dataForm.auditStatus = '20'
classPage(Object.assign({
current: pageIndex.value,
size: pageSize.value
}, dataForm)).then((response: any) => {
dataList.value = response.data.records
totalPage.value = response.data.total
})
dataListLoading.value = false
}
// 每页数
const sizeChangeHandle = (val: number) => {
pageSize.value = val
pageIndex.value = 1
getDataList()
}
// 当前页
const currentChangeHandle = (val: number) => {
pageIndex.value = val
getDataList()
}
const changeclass = (row: any) => {
@@ -922,8 +971,8 @@ const deleteHandle = (id: string) => {
}
const resetForm = (formName: string) => {
if (formName === 'searchFormRef') {
searchFormRef.value?.resetFields()
if (formName === 'searchForm') {
searchFormRef.value?.formRef?.resetFields()
} else if (formName === 'formRef') {
formRef.value?.resetFields()
}

View File

@@ -74,7 +74,7 @@ import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict'
import { juniorlneStatic } from '/@/api/recruit/recruitstudentsignup'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
// 消息提示 hooks
@@ -110,7 +110,7 @@ const init = async () => {
const [deptResponse, majorYearsRes, planData] = await Promise.all([
getDeptListByLevelTwo(),
getTypeValue('basic_major_years'),
list()
getList()
])
deptCodes.value = deptResponse.data || []

View File

@@ -1,27 +1,9 @@
<!--
- Copyright (c) 2018-2025, cyweb All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are met:
-
- Redistributions of source code must retain the above copyright notice,
- this list of conditions and the following disclaimer.
- Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- Neither the name of the pig4cloud.com developer nor the names of its
- contributors may be used to endorse or promote products derived from
- this software without specific prior written permission.
-
-->
<template>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<!-- 搜索表单 -->
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
<div>
<!-- 搜索表单 -->
<el-form :model="queryForm" inline ref="searchFormRef">
<el-form-item label="招生计划" prop="groupId">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" style="width: 150px;">
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
<el-option
v-for="item in planList"
:key="item.id"
@@ -31,7 +13,7 @@
</el-select>
</el-form-item>
<el-form-item label="学院" prop="xy">
<el-select v-model="queryForm.xy" filterable clearable placeholder="请选择学院" style="width: 130px;">
<el-select v-model="queryForm.xy" filterable clearable placeholder="请选择学院">
<el-option
v-for="item in deptList"
:key="item.deptCode"
@@ -54,7 +36,7 @@
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号" />
</el-form-item>
<el-form-item label="住宿范围" prop="isOutFw">
<el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围" style="width: 100px;">
<el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围">
<el-option
v-for="item in isOutFwList"
:key="item.value"
@@ -64,7 +46,7 @@
</el-select>
</el-form-item>
<el-form-item label="是否发送短信" prop="isSend">
<el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信" style="width: 100px;">
<el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信">
<el-option
v-for="item in isSendList"
:key="item.value"
@@ -74,9 +56,9 @@
</el-select>
</el-form-item>
<el-form-item label="性别" prop="gender">
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别" style="width: 120px;">
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别">
<el-option
v-for="item in genderList"
v-for="item in sexy"
:key="item.value"
:label="item.label"
:value="item.value"
@@ -85,7 +67,7 @@
</el-form-item>
<el-form-item>
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
@@ -145,7 +127,7 @@
<el-table-column prop="name" label="姓名" width="100" align="center" show-overflow-tooltip />
<el-table-column prop="gender" label="性别" width="80" align="center" show-overflow-tooltip>
<template #default="scope">
{{ getGender(scope.row.gender) }}
{{ getLabelValue(sexy, scope.row.gender) }}
</template>
</el-table-column>
<el-table-column prop="idNumber" label="身份证号" width="180" align="center" show-overflow-tooltip />
@@ -222,40 +204,8 @@
@size-change="sizeChangeHandle"
/>
<!-- 支付二维码弹窗 -->
<el-dialog v-model="dialogFormVisible" title="支付二维码" width="800px" @close="dialogFormVisible = false">
<el-table :data="tableData" border>
<el-table-column label="唯一号" prop="serialNumber" align="center" />
<el-table-column label="姓名" prop="name" align="center" />
<el-table-column label="家长手机号" prop="parentTelOne" align="center" />
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button type="danger" icon="Search" @click="updateFS">立即查询</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>
<dorm-f-w v-if="dormFWRefVisible" ref="dormFWRef" />
<show-map v-if="baiduMapVisible" ref="baiduMapRef" />
</div>
<DormFW ref="dormFWRef" />
<ShowMap ref="baiduMapRef" />
</div>
</template>
@@ -265,11 +215,12 @@ import { storeToRefs } from 'pinia'
import { useUserInfo } from '/@/stores/userInfo'
import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage, useMessageBox } from '/@/hooks/message'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { fetchListStuDorm, yjOut, setFw, delFw, yjSend } from '/@/api/recruit/recruitstudentsignup'
import { useDict } from '/@/hooks/dict'
import { getLabelValue } from '/@/utils/dictLabel'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { fetchListStuDorm, yjOut as yjOutApi, setFw as setFwApi, delFw, yjSend as yjSendApi } from '/@/api/recruit/recruitstudentsignup'
import { getDeptList } from '/@/api/basic/basicclass'
// @ts-ignore
import global from '@/components/tools/commondict'
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'))
@@ -291,6 +242,9 @@ const permissions = computed(() => {
const message = useMessage()
const messageBox = useMessageBox()
// 字典数据
const { sexy } = useDict('sexy')
// 表格引用
const tableRef = ref()
const searchFormRef = ref()
@@ -301,7 +255,6 @@ const baiduMapRef = ref()
const planList = ref<any[]>([])
const planMajorList = ref<any[]>([])
const deptList = ref<any[]>([])
const genderList = ref([{ label: '男', value: '1' }, { label: '女', value: '2' }])
const isOutFwList = ref([{ label: '待确认', value: '0' }, { label: '范围内', value: '1' }, { label: '范围外', value: '2' }])
const isSendList = ref([{ label: '未发送', value: 0 }, { label: '已发送', value: 1 }])
@@ -316,20 +269,7 @@ const queryForm = reactive({
gender: ''
})
// 弹窗状态
const dialogFormVisible = ref(false)
const dormFWRefVisible = ref(false)
const baiduMapVisible = ref(false)
const tableData = ref<any[]>([])
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)
// 弹窗状态DormFW 和 ShowMap 组件内部自己管理显示状态)
// 获取学院名称
const getDeptName = (deptCode: string) => {
@@ -337,17 +277,6 @@ const getDeptName = (deptCode: string) => {
return item ? item.deptName : ''
}
// 获取性别
const getGender = (gender: string) => {
if (gender == '2') {
return '女'
}
if (gender == '1') {
return '男'
}
return ''
}
// 表格状态
const state: BasicTableProps = reactive<BasicTableProps>({
queryForm: queryForm,
@@ -360,7 +289,16 @@ const state: BasicTableProps = reactive<BasicTableProps>({
}
}
},
createdIsNeed: false
createdIsNeed: false,
dataList: [],
loading: false,
pagination: {
current: 1,
size: 10,
total: 0,
pageSizes: [1, 10, 20, 50, 100, 200],
layout: 'total, sizes, prev, pager, next, jumper'
}
})
// 使用 table hook
@@ -374,7 +312,7 @@ const init = async () => {
deptList.value = deptData.data || []
// 获取招生计划列表
const planData = await list()
const planData = await getList()
planList.value = planData.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id
@@ -382,7 +320,7 @@ const init = async () => {
getDataList()
} catch (error) {
console.error('初始化失败', error)
message.error('初始化失败')
}
}
@@ -391,7 +329,7 @@ const setFw = async (row: any, type: number) => {
const title = type == 1 ? '范围内' : '范围外'
try {
await messageBox.confirm(`是否确认设置${title}?请谨慎操作`)
await setFw({ id: row.id, isOutFw: type })
await setFwApi({ id: row.id, isOutFw: type })
message.success('操作成功')
getDataList()
} catch {
@@ -401,7 +339,6 @@ const setFw = async (row: any, type: number) => {
// 设置住宿范围窗口
const setDormFW = () => {
dormFWRefVisible.value = true
nextTick(() => {
dormFWRef.value?.init()
})
@@ -416,7 +353,7 @@ const yjOut = async () => {
try {
await messageBox.confirm('是否确认一键判断是否超出住宿范围?请谨慎操作')
await yjOut({ groupId: queryForm.groupId })
await yjOutApi({ groupId: queryForm.groupId })
message.success('操作成功')
getDataList()
} catch {
@@ -433,7 +370,7 @@ const yjSend = async () => {
try {
await messageBox.confirm('是否确认批量发送短信通知?请谨慎操作')
await yjSend({ groupId: queryForm.groupId })
await yjSendApi({ groupId: queryForm.groupId })
message.success('操作成功')
getDataList()
} catch {
@@ -443,7 +380,6 @@ const yjSend = async () => {
// 百度地图
const baiduMap = (row: any) => {
baiduMapVisible.value = true
nextTick(() => {
baiduMapRef.value?.init(row)
})
@@ -467,11 +403,6 @@ const handleExport = async () => {
}
}
// 立即查询
const updateFS = async () => {
// 这个方法需要根据实际API调整
message.info('功能待实现')
}
// 重置查询
const resetQuery = () => {

View File

@@ -112,7 +112,7 @@ import { ref, reactive, nextTick } from 'vue'
import { ElNotification } from 'element-plus'
import { useMessageBox } from '/@/hooks/message'
import { getObj, changeMajor } from '@/api/recruit/recruitstudentsignup'
import { list } from "@/api/recruit/recruitstudentplangroup"
import { getList } from "@/api/recruit/recruitstudentplangroup"
import { listByEdu } from "@/api/recruit/recruitstudentplan"
import { getDictByType } from "@/api/contract/contract"
import { list as scoreList } from "@/api/recruit/recruitstudentplancorrectscoreconfig"
@@ -232,7 +232,7 @@ const dataRule = {
// 初始化数据
const initData = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
})
}

View File

@@ -46,7 +46,7 @@ import { ref, reactive, onMounted } from 'vue'
import { useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { getSchoolStatic } from '/@/api/recruit/recruitstudentsignup'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
// 消息提示 hooks
const message = useMessage()
@@ -72,7 +72,7 @@ const { tableStyle, downBlobFile } = useTable()
// 初始化
const init = async () => {
try {
const data = await list()
const data = await getList()
planList.value = data.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id

View File

@@ -57,7 +57,7 @@ import { ref, reactive, onMounted } from 'vue'
import { BasicTableProps, useTable } from '/@/hooks/table'
import { useMessage } from '/@/hooks/message'
import { useDict } from '/@/hooks/dict'
import { list } from '/@/api/recruit/recruitstudentplangroup'
import { getList } from '/@/api/recruit/recruitstudentplangroup'
import { fetchListByStatic, listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan'
import { getDeptList } from '/@/api/basic/basicclass'
// @ts-ignore
@@ -115,7 +115,7 @@ const init = async () => {
deptList.value.push({ deptCode: '合计', deptName: '合计' })
// 获取招生计划列表
const planData = await list()
const planData = await getList()
planList.value = planData.data || []
if (planList.value.length > 0) {
queryForm.groupId = planList.value[0].id

View File

@@ -1,21 +1,20 @@
<template>
<div class="mod-config">
<basic-container>
<div class="layout-padding">
<div class="layout-padding-auto layout-padding-view">
<el-tabs v-model="activeName">
<el-tab-pane label="申请列表" name="first">
<List></List>
<List />
</el-tab-pane>
<el-tab-pane label="申请汇总" name="second">
<DormAnalysis></DormAnalysis>
<DormAnalysis />
</el-tab-pane>
</el-tabs>
</basic-container>
</div>
</div>
</template>
<script setup lang="ts">
import { ref } from 'vue'
import { defineAsyncComponent } from 'vue'
<script setup lang="ts" name="studorm">
import { ref, defineAsyncComponent } from 'vue'
const List = defineAsyncComponent(() => import('./list.vue'))
const DormAnalysis = defineAsyncComponent(() => import('./dorm_analysis.vue'))
@@ -24,8 +23,15 @@ const DormAnalysis = defineAsyncComponent(() => import('./dorm_analysis.vue'))
const activeName = ref('first')
</script>
<style scoped>
.mod-config {
padding: 20px;
<style lang="scss" scoped>
:deep(.el-tabs) {
height: 100%;
display: flex;
flex-direction: column;
.el-tabs__content {
flex: 1;
overflow: auto;
}
}
</style>

View File

@@ -193,7 +193,7 @@ import { useUserInfo } from '/@/stores/userInfo'
import { Session } from '/@/utils/storage'
import axios from 'axios'
import { getObj, updateInfo } from '@/api/recruit/recruitstudentsignup'
import { list } from "@/api/recruit/recruitstudentplangroup"
import { getList } from "@/api/recruit/recruitstudentplangroup"
import { queryAllTeacher } from "@/api/professional/teacherbase"
// 使用 Pinia store
@@ -529,7 +529,7 @@ const upload6Success = (res: any, file: any) => {
// 初始化数据
const initData = () => {
list().then((data: any) => {
getList().then((data: any) => {
planList.value = data.data
})
// 联系人(教职工)