fix
This commit is contained in:
@@ -16,51 +16,51 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName" @tab-click="handleTabClick">
|
||||
<el-tab-pane label="回校列表" name="tab">
|
||||
<TabIndex ref="tabIndexRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="回校统计" name="static">
|
||||
<StaticIndex ref="staticIndexRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName" @tab-click="handleTabClick">
|
||||
<el-tab-pane label="回校列表" name="tab">
|
||||
<TabIndex ref="tabIndexRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="回校统计" name="static">
|
||||
<StaticIndex ref="staticIndexRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="backSchool">
|
||||
import { ref, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { ref, nextTick, defineAsyncComponent } from 'vue';
|
||||
|
||||
const TabIndex = defineAsyncComponent(() => import('./tabIndex.vue'))
|
||||
const StaticIndex = defineAsyncComponent(() => import('./staticIndex.vue'))
|
||||
const TabIndex = defineAsyncComponent(() => import('./tabIndex.vue'));
|
||||
const StaticIndex = defineAsyncComponent(() => import('./staticIndex.vue'));
|
||||
|
||||
const activeName = ref('tab')
|
||||
const tabIndexRef = ref()
|
||||
const staticIndexRef = ref()
|
||||
const activeName = ref('tab');
|
||||
const tabIndexRef = ref();
|
||||
const staticIndexRef = ref();
|
||||
|
||||
const handleTabClick = (tab: any) => {
|
||||
if (tab.paneName == 'tab') {
|
||||
nextTick(() => {
|
||||
tabIndexRef.value?.init()
|
||||
})
|
||||
} else {
|
||||
nextTick(() => {
|
||||
staticIndexRef.value?.init()
|
||||
})
|
||||
}
|
||||
}
|
||||
if (tab.paneName == 'tab') {
|
||||
nextTick(() => {
|
||||
tabIndexRef.value?.init();
|
||||
});
|
||||
} else {
|
||||
nextTick(() => {
|
||||
staticIndexRef.value?.init();
|
||||
});
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-tabs) {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.el-tab-pane {
|
||||
height: 100%;
|
||||
}
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.el-tab-pane {
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,174 +16,169 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="static-index-container">
|
||||
<!-- 搜索表单 -->
|
||||
<div class="search-form-wrapper">
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="getTabStaticDataList">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getTabStaticDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="static-index-container">
|
||||
<!-- 搜索表单 -->
|
||||
<div class="search-form-wrapper">
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="getTabStaticDataList">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getTabStaticDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="table-wrapper">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="tableData"
|
||||
v-loading="dataListLoading"
|
||||
border
|
||||
stripe
|
||||
show-summary
|
||||
:summary-method="getSummaries"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
height="100%"
|
||||
>
|
||||
<el-table-column prop="groupId" label="招生计划" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getPlanName(scope.row.groupId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="majorName" label="专业名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="wlx" label="未联系" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="yjbd" label="已经报到" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="tcbd" label="推迟报到" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fqbd" label="放弃报到" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fwlx" label="无法联系" align="center" show-overflow-tooltip />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="table-wrapper">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="tableData"
|
||||
v-loading="dataListLoading"
|
||||
border
|
||||
stripe
|
||||
show-summary
|
||||
:summary-method="getSummaries"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
height="100%"
|
||||
>
|
||||
<el-table-column prop="groupId" label="招生计划" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getPlanName(scope.row.groupId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="majorName" label="专业名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="wlx" label="未联系" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="yjbd" label="已经报到" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="tcbd" label="推迟报到" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fqbd" label="放弃报到" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fwlx" label="无法联系" align="center" show-overflow-tooltip />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="backSchoolCheckinStaticIndex">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getTabStaticDataList as getTabStaticDataListApi } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { useTable } from '/@/hooks/table'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { getTabStaticDataList as getTabStaticDataListApi } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { useTable } from '/@/hooks/table';
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const tableData = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const planList = ref<any[]>([]);
|
||||
const tableData = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 获取计划名称
|
||||
const getPlanName = (groupId: string) => {
|
||||
const item = planList.value.find(item => item.id === groupId)
|
||||
return item ? item.groupName : ''
|
||||
}
|
||||
const item = planList.value.find((item) => item.id === groupId);
|
||||
return item ? item.groupName : '';
|
||||
};
|
||||
|
||||
// 表格样式
|
||||
const { tableStyle } = useTable({ queryForm: queryForm, pageList: async () => ({ data: { records: [], total: 0 } }), createdIsNeed: false })
|
||||
const { tableStyle } = useTable({ queryForm: queryForm, pageList: async () => ({ data: { records: [], total: 0 } }), createdIsNeed: false });
|
||||
|
||||
// 获取汇总数据
|
||||
const getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计'
|
||||
} else if (index != 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const value = Number(curr)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计';
|
||||
} else if (index != 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const value = Number(curr);
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0);
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
// 获取统计数据
|
||||
const getTabStaticDataList = async () => {
|
||||
try {
|
||||
tableData.value = []
|
||||
dataListLoading.value = true
|
||||
const response = await getTabStaticDataListApi(queryForm)
|
||||
tableData.value = response.data || []
|
||||
} catch (error) {
|
||||
// 获取统计数据失败
|
||||
} finally {
|
||||
dataListLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
tableData.value = [];
|
||||
dataListLoading.value = true;
|
||||
const response = await getTabStaticDataListApi(queryForm);
|
||||
tableData.value = response.data || [];
|
||||
} catch (error) {
|
||||
// 获取统计数据失败
|
||||
} finally {
|
||||
dataListLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getTabStaticDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getTabStaticDataList();
|
||||
};
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
getTabStaticDataList()
|
||||
}
|
||||
} catch (error) {
|
||||
// 初始化失败
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
getTabStaticDataList();
|
||||
}
|
||||
} catch (error) {
|
||||
// 初始化失败
|
||||
}
|
||||
};
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.static-index-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.search-form-wrapper {
|
||||
flex-shrink: 0;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.table-wrapper {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
min-height: 0;
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
min-height: 0;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,248 +16,228 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="入学年份" prop="grade">
|
||||
<el-select v-model="queryForm.grade" filterable clearable placeholder="请选择入学年份">
|
||||
<el-option
|
||||
v-for="item in gradeList"
|
||||
:key="item.year"
|
||||
:label="item.year"
|
||||
:value="item.year"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option
|
||||
v-for="item in deptList"
|
||||
:key="item.deptCode"
|
||||
:label="item.deptName"
|
||||
:value="item.deptCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班级" prop="classCode">
|
||||
<el-select v-model="queryForm.classCode" filterable clearable placeholder="请选择班级">
|
||||
<el-option
|
||||
v-for="item in classData"
|
||||
:key="item.classCode"
|
||||
:label="item.classNo"
|
||||
:value="item.classCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="searchData">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="入学年份" prop="grade">
|
||||
<el-select v-model="queryForm.grade" filterable clearable placeholder="请选择入学年份">
|
||||
<el-option v-for="item in gradeList" :key="item.year" :label="item.year" :value="item.year" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option v-for="item in deptList" :key="item.deptCode" :label="item.deptName" :value="item.deptCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班级" prop="classCode">
|
||||
<el-select v-model="queryForm.classCode" filterable clearable placeholder="请选择班级">
|
||||
<el-option v-for="item in classData" :key="item.classCode" :label="item.classNo" :value="item.classCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="searchData">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_statistics_output')"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
:loading="exportLoading"
|
||||
@click="handleExportOut"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_statistics_output')"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
:loading="exportLoading"
|
||||
@click="handleExportOut"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="tableData"
|
||||
height="650"
|
||||
show-summary
|
||||
:summary-method="getSummaries"
|
||||
stripe
|
||||
border
|
||||
v-loading="tableLoading"
|
||||
:header-cell-style="{ 'text-align': 'center' }"
|
||||
:cell-style="{ 'text-align': 'center' }"
|
||||
class="el_table_job_fair_stu"
|
||||
>
|
||||
<el-table-column type="index" width="50" fixed label="序号" />
|
||||
<el-table-column prop="deptName" label="学院" />
|
||||
<el-table-column prop="classNo" label="班级" />
|
||||
<el-table-column prop="classNum" label="预计报到人数" />
|
||||
<el-table-column prop="checkInOk" label="已经报到" />
|
||||
<el-table-column prop="postpone" label="推迟报到" />
|
||||
<el-table-column prop="abandon" label="放弃报到" />
|
||||
<el-table-column prop="missing" label="无法联系" />
|
||||
<el-table-column prop="contact" label="未联系" />
|
||||
<el-table-column prop="checkInRate" label="报到率" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="tableData"
|
||||
height="650"
|
||||
show-summary
|
||||
:summary-method="getSummaries"
|
||||
stripe
|
||||
border
|
||||
v-loading="tableLoading"
|
||||
:header-cell-style="{ 'text-align': 'center' }"
|
||||
:cell-style="{ 'text-align': 'center' }"
|
||||
class="el_table_job_fair_stu"
|
||||
>
|
||||
<el-table-column type="index" width="50" fixed label="序号" />
|
||||
<el-table-column prop="deptName" label="学院" />
|
||||
<el-table-column prop="classNo" label="班级" />
|
||||
<el-table-column prop="classNum" label="预计报到人数" />
|
||||
<el-table-column prop="checkInOk" label="已经报到" />
|
||||
<el-table-column prop="postpone" label="推迟报到" />
|
||||
<el-table-column prop="abandon" label="放弃报到" />
|
||||
<el-table-column prop="missing" label="无法联系" />
|
||||
<el-table-column prop="contact" label="未联系" />
|
||||
<el-table-column prop="checkInRate" label="报到率" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="backSchoolCheckin-statistics">
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { getDataStatistics } from '/@/api/recruit/newstucheckin'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getDeptList } from '/@/api/basic/basicclass'
|
||||
import { queryAllClass } from '/@/api/basic/basicclass'
|
||||
import axios from 'axios'
|
||||
import { ref, reactive, computed, onMounted } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { getDataStatistics } from '/@/api/recruit/newstucheckin';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { getDeptList } from '/@/api/basic/basicclass';
|
||||
import { queryAllClass } from '/@/api/basic/basicclass';
|
||||
import axios from 'axios';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const tableData = ref<any[]>([])
|
||||
const tableLoading = ref(false)
|
||||
const exportLoading = ref(false)
|
||||
const gradeList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const classData = ref<any[]>([])
|
||||
const tableData = ref<any[]>([]);
|
||||
const tableLoading = ref(false);
|
||||
const exportLoading = ref(false);
|
||||
const gradeList = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
const classData = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
grade: '',
|
||||
deptCode: '',
|
||||
classCode: ''
|
||||
})
|
||||
grade: '',
|
||||
deptCode: '',
|
||||
classCode: '',
|
||||
});
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
await Promise.all([
|
||||
getGradeData(),
|
||||
getDeptData(),
|
||||
getClassData()
|
||||
])
|
||||
getList()
|
||||
}
|
||||
await Promise.all([getGradeData(), getDeptData(), getClassData()]);
|
||||
getList();
|
||||
};
|
||||
|
||||
// 查看所有入学年份
|
||||
const getGradeData = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
gradeList.value = data.data || []
|
||||
} catch (error) {
|
||||
console.error('获取入学年份失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
gradeList.value = data.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取入学年份失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 查找所有二级学院
|
||||
const getDeptData = async () => {
|
||||
try {
|
||||
const data = await getDeptList()
|
||||
deptList.value = data.data || []
|
||||
} catch (error) {
|
||||
console.error('获取学院列表失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getDeptList();
|
||||
deptList.value = data.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取学院列表失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 查找所有班级
|
||||
const getClassData = async () => {
|
||||
try {
|
||||
const data = await queryAllClass()
|
||||
classData.value = data.data || []
|
||||
} catch (error) {
|
||||
console.error('获取班级列表失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await queryAllClass();
|
||||
classData.value = data.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取班级列表失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getList = async () => {
|
||||
try {
|
||||
tableLoading.value = true
|
||||
const response = await getDataStatistics(queryForm)
|
||||
tableData.value = response.data || []
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error)
|
||||
} finally {
|
||||
tableLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
tableLoading.value = true;
|
||||
const response = await getDataStatistics(queryForm);
|
||||
tableData.value = response.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error);
|
||||
} finally {
|
||||
tableLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 查询
|
||||
const searchData = () => {
|
||||
getList()
|
||||
}
|
||||
getList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.grade = ''
|
||||
queryForm.deptCode = ''
|
||||
queryForm.classCode = ''
|
||||
getList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.grade = '';
|
||||
queryForm.deptCode = '';
|
||||
queryForm.classCode = '';
|
||||
getList();
|
||||
};
|
||||
|
||||
// 导出
|
||||
const handleExportOut = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
const res = await axios({
|
||||
method: 'post',
|
||||
url: '/recruit/newstucheckin/exportDataStatistics',
|
||||
data: queryForm,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
const blob = new Blob([res.data])
|
||||
const fileName = '新生报到统计.xls'
|
||||
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 (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
const res = await axios({
|
||||
method: 'post',
|
||||
url: '/recruit/newstucheckin/exportDataStatistics',
|
||||
data: queryForm,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
const blob = new Blob([res.data]);
|
||||
const fileName = '新生报到统计.xls';
|
||||
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 (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 合计方法
|
||||
const getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '合计'
|
||||
return
|
||||
}
|
||||
if (index === 1 || index === 2) {
|
||||
sums[index] = ''
|
||||
return
|
||||
}
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: any) => {
|
||||
const value = Number(curr)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
sums[index] += ''
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '合计';
|
||||
return;
|
||||
}
|
||||
if (index === 1 || index === 2) {
|
||||
sums[index] = '';
|
||||
return;
|
||||
}
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: any) => {
|
||||
const value = Number(curr);
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0);
|
||||
sums[index] += '';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,146 +1,130 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog v-model="newStuCheckInDialog" width="600">
|
||||
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input v-model="form.name" disabled/>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-dialog v-model="newStuCheckInDialog" width="600">
|
||||
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input v-model="form.name" disabled />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-radio-group v-model="form.gender">
|
||||
<el-radio v-for="item in genderData" :key="item.value" :label="item.value" :disabled="true">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-radio-group v-model="form.gender">
|
||||
<el-radio v-for="item in genderData" :key="item.value" :label="item.value" :disabled="true">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="身份证号" prop="idNumber">
|
||||
<el-input v-model="form.idNumber" disabled/>
|
||||
</el-form-item>
|
||||
<el-form-item label="身份证号" prop="idNumber">
|
||||
<el-input v-model="form.idNumber" disabled />
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="报到状态" prop="backSchoolState">
|
||||
<el-select v-model="form.backSchoolState" filterable placeholder="请选择报到状态">
|
||||
<el-option
|
||||
v-for="item in checkInStatusData"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="报到状态" prop="backSchoolState">
|
||||
<el-select v-model="form.backSchoolState" filterable placeholder="请选择报到状态">
|
||||
<el-option v-for="item in checkInStatusData" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="回校备注" prop="backSchoolRemark">
|
||||
<el-input v-model="form.backSchoolRemark" :rows="2" type="textarea"/>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="newStuCheckInDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
<el-form-item label="回校备注" prop="backSchoolRemark">
|
||||
<el-input v-model="form.backSchoolRemark" :rows="2" type="textarea" />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="newStuCheckInDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="backSchoolCheckin-stu-check-in">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import { putBackObj } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getDicts } from '/@/api/admin/dict'
|
||||
import { ref, reactive } from 'vue';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { putBackObj } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
|
||||
// 性别字典
|
||||
const { sexy:genderData } = useDict('sexy')
|
||||
const { sexy: genderData } = useDict('sexy');
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 定义 emits
|
||||
const emit = defineEmits(['reload'])
|
||||
const emit = defineEmits(['reload']);
|
||||
|
||||
// 引用
|
||||
const formRef = ref()
|
||||
const formRef = ref();
|
||||
|
||||
// 状态
|
||||
const newStuCheckInDialog = ref(false)
|
||||
const checkInStatusData = ref<any[]>([])
|
||||
const submitLoading = ref(false)
|
||||
const page = ref<any>({})
|
||||
const newStuCheckInDialog = ref(false);
|
||||
const checkInStatusData = ref<any[]>([]);
|
||||
const submitLoading = ref(false);
|
||||
const page = ref<any>({});
|
||||
|
||||
// 表单数据
|
||||
const form = reactive({
|
||||
id: '',
|
||||
name: '',
|
||||
backSchoolState: '',
|
||||
gender: '',
|
||||
idNumber: '',
|
||||
backSchoolRemark: ''
|
||||
})
|
||||
id: '',
|
||||
name: '',
|
||||
backSchoolState: '',
|
||||
gender: '',
|
||||
idNumber: '',
|
||||
backSchoolRemark: '',
|
||||
});
|
||||
|
||||
// 表单验证规则
|
||||
const rules = reactive({
|
||||
name: [
|
||||
{ required: true, message: '请输入姓名', trigger: ['blur', 'change'] }
|
||||
],
|
||||
gender: [
|
||||
{ required: true, message: '请输入性别', trigger: ['blur', 'change'] }
|
||||
],
|
||||
idNumber: [
|
||||
{ required: true, message: '请输入身份证号', trigger: ['blur', 'change'] }
|
||||
],
|
||||
backSchoolState: [
|
||||
{ required: true, message: '请输入报到状态', trigger: ['blur', 'change'] }
|
||||
]
|
||||
})
|
||||
name: [{ required: true, message: '请输入姓名', trigger: ['blur', 'change'] }],
|
||||
gender: [{ required: true, message: '请输入性别', trigger: ['blur', 'change'] }],
|
||||
idNumber: [{ required: true, message: '请输入身份证号', trigger: ['blur', 'change'] }],
|
||||
backSchoolState: [{ required: true, message: '请输入报到状态', trigger: ['blur', 'change'] }],
|
||||
});
|
||||
|
||||
// 初始化表单
|
||||
const initForm = () => {
|
||||
form.id = ''
|
||||
form.name = ''
|
||||
form.backSchoolState = ''
|
||||
form.gender = ''
|
||||
form.idNumber = ''
|
||||
form.backSchoolRemark = ''
|
||||
}
|
||||
form.id = '';
|
||||
form.name = '';
|
||||
form.backSchoolState = '';
|
||||
form.gender = '';
|
||||
form.idNumber = '';
|
||||
form.backSchoolRemark = '';
|
||||
};
|
||||
|
||||
// 初始化
|
||||
const init = async (formData: any, pageData: any) => {
|
||||
initForm()
|
||||
page.value = pageData
|
||||
submitLoading.value = false
|
||||
newStuCheckInDialog.value = true
|
||||
checkInStatusData.value = []
|
||||
|
||||
try {
|
||||
const dictData = await getDicts('check_in_status')
|
||||
checkInStatusData.value = dictData.data || []
|
||||
} catch (error) {
|
||||
console.error('获取字典数据失败', error)
|
||||
}
|
||||
|
||||
Object.assign(form, formData)
|
||||
}
|
||||
initForm();
|
||||
page.value = pageData;
|
||||
submitLoading.value = false;
|
||||
newStuCheckInDialog.value = true;
|
||||
checkInStatusData.value = [];
|
||||
|
||||
try {
|
||||
const dictData = await getDicts('check_in_status');
|
||||
checkInStatusData.value = dictData.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取字典数据失败', error);
|
||||
}
|
||||
|
||||
Object.assign(form, formData);
|
||||
};
|
||||
|
||||
// 报到
|
||||
const checkIn = async () => {
|
||||
if (!formRef.value) return
|
||||
|
||||
try {
|
||||
await formRef.value.validate()
|
||||
submitLoading.value = true
|
||||
await putBackObj(form)
|
||||
message.success('报到成功')
|
||||
emit('reload')
|
||||
newStuCheckInDialog.value = false
|
||||
} finally {
|
||||
submitLoading.value = false
|
||||
}
|
||||
}
|
||||
if (!formRef.value) return;
|
||||
|
||||
try {
|
||||
await formRef.value.validate();
|
||||
submitLoading.value = true;
|
||||
await putBackObj(form);
|
||||
message.success('报到成功');
|
||||
emit('reload');
|
||||
newStuCheckInDialog.value = false;
|
||||
} finally {
|
||||
submitLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 暴露方法
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
<style scoped></style>
|
||||
|
||||
@@ -528,11 +528,11 @@ const resetQuery = () => {
|
||||
};
|
||||
|
||||
const handleLeaveSchool = (row: any, force: any) => {
|
||||
var str = force? '强制' : '';
|
||||
var str = force ? '强制' : '';
|
||||
useMessageBox()
|
||||
.confirm('是否确认'+str+'办理退档操作?请谨慎操作')
|
||||
.confirm('是否确认' + str + '办理退档操作?请谨慎操作')
|
||||
.then(() => {
|
||||
return leaveSchool({ 'id':row.id,'force':force });
|
||||
return leaveSchool({ id: row.id, force: force });
|
||||
})
|
||||
.then(() => {
|
||||
message.success('操作成功');
|
||||
|
||||
@@ -1,22 +1,16 @@
|
||||
<template>
|
||||
<el-dialog v-model="visible" :title="title" width="600" append-to-body>
|
||||
<div style="text-align: center; margin-bottom: 20px" v-if="currentType!='R10003'">
|
||||
<div style="text-align: center; margin-bottom: 20px" v-if="currentType != 'R10003'">
|
||||
<el-button type="success" :icon="Download" @click="handleDownloadTemplate">下载模板</el-button>
|
||||
</div>
|
||||
|
||||
<el-alert
|
||||
v-if="currentType=='R10003'"
|
||||
type="warning"
|
||||
:closable="false"
|
||||
show-icon
|
||||
style="margin-bottom: 20px;">
|
||||
<template #title>
|
||||
<span> 请从中招平台导出数据后导入</span>
|
||||
</template>
|
||||
</el-alert>
|
||||
<el-alert v-if="currentType == 'R10003'" type="warning" :closable="false" show-icon style="margin-bottom: 20px">
|
||||
<template #title>
|
||||
<span> 请从中招平台导出数据后导入</span>
|
||||
</template>
|
||||
</el-alert>
|
||||
|
||||
|
||||
<el-upload
|
||||
<el-upload
|
||||
ref="uploadRef"
|
||||
class="upload-demo"
|
||||
:action="uploadUrl"
|
||||
@@ -51,34 +45,34 @@ const visible = ref(false);
|
||||
const headers = computed(() => {
|
||||
return {
|
||||
Authorization: 'Bearer ' + Session.getToken(),
|
||||
TENANT_ID: Session.getTenant()
|
||||
TENANT_ID: Session.getTenant(),
|
||||
};
|
||||
});
|
||||
|
||||
const uploadUrl = ref('')
|
||||
const currentType = ref('')
|
||||
const uploadRef = ref<{ clearFiles?: () => void }>()
|
||||
const uploadUrl = ref('');
|
||||
const currentType = ref('');
|
||||
const uploadRef = ref<{ clearFiles?: () => void }>();
|
||||
const titleMap: Record<string, string> = {
|
||||
R10001: '计划专业导入',
|
||||
R10002: '地区分数导入',
|
||||
R10003: '中招平台数据导入',
|
||||
R10004: '学校维护导入',
|
||||
}
|
||||
R10001: '计划专业导入',
|
||||
R10002: '地区分数导入',
|
||||
R10003: '中招平台数据导入',
|
||||
R10004: '学校维护导入',
|
||||
};
|
||||
// 方法
|
||||
const init = (type: any) => {
|
||||
currentType.value = type
|
||||
uploadUrl.value = '/api/recruit/file/importRecruitInfo?type=' + type
|
||||
title.value = titleMap[type] || '信息导入'
|
||||
visible.value = true
|
||||
currentType.value = type;
|
||||
uploadUrl.value = '/api/recruit/file/importRecruitInfo?type=' + type;
|
||||
title.value = titleMap[type] || '信息导入';
|
||||
visible.value = true;
|
||||
nextTick(() => {
|
||||
uploadRef.value?.clearFiles()
|
||||
})
|
||||
}
|
||||
uploadRef.value?.clearFiles();
|
||||
});
|
||||
};
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
const handleUploadSuccess = () => {
|
||||
visible.value = false;
|
||||
@@ -88,7 +82,7 @@ const handleUploadSuccess = () => {
|
||||
type: 'success',
|
||||
});
|
||||
|
||||
emit('refreshDataList')
|
||||
emit('refreshDataList');
|
||||
};
|
||||
|
||||
const handleAvatarError = (err: any) => {
|
||||
@@ -103,12 +97,12 @@ const handleAvatarError = (err: any) => {
|
||||
};
|
||||
|
||||
const handleDownloadTemplate = () => {
|
||||
downBlobFile('/recruit/file/exportRecruitTemplate', { type: currentType.value || 'planMajor' }, title.value+'模板.xlsx')
|
||||
}
|
||||
downBlobFile('/recruit/file/exportRecruitTemplate', { type: currentType.value || 'planMajor' }, title.value + '模板.xlsx');
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,545 +1,485 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="关键词">
|
||||
<el-input
|
||||
v-model="queryForm.searchTotal"
|
||||
clearable
|
||||
placeholder="请输入姓名/身份证号/家庭联系人"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select
|
||||
v-model="queryForm.deptCode"
|
||||
filterable
|
||||
clearable
|
||||
placeholder="请选择学院">
|
||||
<el-option
|
||||
v-for="item in deptList"
|
||||
:key="item.deptCode"
|
||||
:label="item.deptName"
|
||||
:value="item.deptCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="入学年份" prop="grade">
|
||||
<el-select
|
||||
v-model="queryForm.grade"
|
||||
filterable
|
||||
clearable
|
||||
placeholder="请选择入学年份">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.year"
|
||||
:value="item.year"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班级" prop="classCode">
|
||||
<el-select
|
||||
v-model="queryForm.classCode"
|
||||
filterable
|
||||
clearable
|
||||
placeholder="请选择班级">
|
||||
<el-option
|
||||
v-for="item in classList"
|
||||
:key="item.classCode"
|
||||
:label="item.classNo"
|
||||
:value="item.classCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="报到状态" prop="checkInStatus">
|
||||
<el-select
|
||||
v-model="queryForm.checkInStatus"
|
||||
filterable
|
||||
clearable
|
||||
placeholder="请选择报到状态">
|
||||
<el-option
|
||||
v-for="item in checkInStatusData"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="住宿申请" prop="isDormApply">
|
||||
<el-select
|
||||
v-model="queryForm.isDormApply"
|
||||
filterable
|
||||
clearable
|
||||
placeholder="请选择住宿申请">
|
||||
<el-option
|
||||
v-for="item in dormApplyStatusList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="关键词">
|
||||
<el-input v-model="queryForm.searchTotal" clearable placeholder="请输入姓名/身份证号/家庭联系人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option v-for="item in deptList" :key="item.deptCode" :label="item.deptName" :value="item.deptCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="入学年份" prop="grade">
|
||||
<el-select v-model="queryForm.grade" filterable clearable placeholder="请选择入学年份">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.year" :value="item.year" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班级" prop="classCode">
|
||||
<el-select v-model="queryForm.classCode" filterable clearable placeholder="请选择班级">
|
||||
<el-option v-for="item in classList" :key="item.classCode" :label="item.classNo" :value="item.classCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="报到状态" prop="checkInStatus">
|
||||
<el-select v-model="queryForm.checkInStatus" filterable clearable placeholder="请选择报到状态">
|
||||
<el-option v-for="item in checkInStatusData" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="住宿申请" prop="isDormApply">
|
||||
<el-select v-model="queryForm.isDormApply" filterable clearable placeholder="请选择住宿申请">
|
||||
<el-option v-for="item in dormApplyStatusList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_output')"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
@click="handleExportOut"
|
||||
:loading="exportLoading"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="deptCode" label="学院" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="classCode" label="班级" align="center" width="80" show-overflow-tooltip />
|
||||
<el-table-column label="姓名/学号" align="center" min-width="150" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<TeacherNameNo :name="scope.row.name" :no="scope.row.stuNo" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="gender" label="性别" align="center" width="80">
|
||||
<template #default="scope">
|
||||
<GenderTag :sex="scope.row.gender" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="idNumber" label="身份证号" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="checkInStatus" label="报到状态" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<ClickableTag
|
||||
v-if="getCheckInStatusConfigLocal(scope.row.checkInStatus)"
|
||||
:type="getCheckInStatusConfigLocal(scope.row.checkInStatus)?.type || 'info'"
|
||||
:left-icon="getCheckInStatusConfigLocal(scope.row.checkInStatus)?.icon"
|
||||
:right-icon="null">
|
||||
{{ getCheckInStatusConfigLocal(scope.row.checkInStatus)?.label }}
|
||||
</ClickableTag>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isRoom" label="是否住宿" align="center" width="120">
|
||||
<template #default="scope">
|
||||
<template v-if="scope.row.isRoom == '1'">
|
||||
<DetailPopover
|
||||
title="住宿信息"
|
||||
:title-icon="InfoFilled"
|
||||
:width="320"
|
||||
:items="[
|
||||
{
|
||||
label: '住宿申请',
|
||||
layout: 'horizontal'
|
||||
},
|
||||
{
|
||||
label: '宿舍号',
|
||||
layout: 'horizontal'
|
||||
},
|
||||
{
|
||||
label: '床位号',
|
||||
layout: 'horizontal'
|
||||
}
|
||||
]">
|
||||
<template #reference>
|
||||
<ClickableTag
|
||||
type="success"
|
||||
>
|
||||
{{ getStatusConfig(yes_no_type, scope.row.isRoom)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
<!-- 住宿申请状态 -->
|
||||
<template #content-0>
|
||||
<div class="dorm-apply-content">
|
||||
<ClickableTag
|
||||
v-if="getStatusConfig(dormApplyStatusList, scope.row.isDormApply)"
|
||||
:type="scope.row.isDormApply == '1'?'success':'danger'"
|
||||
:left-icon="scope.row.isDormApply == '1'?'CircleCheck':'CircleClose'"
|
||||
:right-icon="null">
|
||||
{{getStatusConfig(dormApplyStatusList, scope.row.isDormApply)?.label}}
|
||||
</ClickableTag>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 宿舍号 -->
|
||||
<template #content-1>
|
||||
<div class="dorm-room-content">
|
||||
<span :class="scope.row.roomNo ? 'room-text' : 'empty-text'">
|
||||
{{ scope.row.roomNo || '-' }}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 床位号 -->
|
||||
<template #content-2>
|
||||
<el-tag v-if="scope.row.bedNo" size="small" type="sucess" effect="dark">
|
||||
{{ scope.row.bedNo }}号
|
||||
</el-tag>
|
||||
</template>
|
||||
</DetailPopover>
|
||||
</template>
|
||||
<span v-else>{{ getStatusConfig(yes_no_type, scope.row.isRoom)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="degreeOfEducation" label="文化程度" align="center" show-overflow-tooltip >
|
||||
<template #default="scope">
|
||||
<span>{{ getStatusConfig(eduList, scope.row.degreeOfEducation)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="residenceDetail" label="居住地址" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="parentName" label="家庭联系人" width="100" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="家长电话1" align="center" prop="parentTelOne" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="家长电话2" align="center" prop="parentTelTwo" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="300" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleCheckIn(scope.row)"
|
||||
>
|
||||
报到
|
||||
</el-button>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_output')"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
@click="handleExportOut"
|
||||
:loading="exportLoading"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignup_leaveSchool')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleLeaveSchool(scope.row, false)"
|
||||
>
|
||||
退档
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_leaveSchool_force')" type="primary" link icon="EditPen" @click="handleLeaveSchool(scope.row, true)">
|
||||
强制退档
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="deptCode" label="学院" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="classCode" label="班级" align="center" width="80" show-overflow-tooltip />
|
||||
<el-table-column label="姓名/学号" align="center" min-width="150" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<TeacherNameNo :name="scope.row.name" :no="scope.row.stuNo" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="gender" label="性别" align="center" width="80">
|
||||
<template #default="scope">
|
||||
<GenderTag :sex="scope.row.gender" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="idNumber" label="身份证号" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="checkInStatus" label="报到状态" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<ClickableTag
|
||||
v-if="getCheckInStatusConfigLocal(scope.row.checkInStatus)"
|
||||
:type="getCheckInStatusConfigLocal(scope.row.checkInStatus)?.type || 'info'"
|
||||
:left-icon="getCheckInStatusConfigLocal(scope.row.checkInStatus)?.icon"
|
||||
:right-icon="null"
|
||||
>
|
||||
{{ getCheckInStatusConfigLocal(scope.row.checkInStatus)?.label }}
|
||||
</ClickableTag>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isRoom" label="是否住宿" align="center" width="120">
|
||||
<template #default="scope">
|
||||
<template v-if="scope.row.isRoom == '1'">
|
||||
<DetailPopover
|
||||
title="住宿信息"
|
||||
:title-icon="InfoFilled"
|
||||
:width="320"
|
||||
:items="[
|
||||
{
|
||||
label: '住宿申请',
|
||||
layout: 'horizontal',
|
||||
},
|
||||
{
|
||||
label: '宿舍号',
|
||||
layout: 'horizontal',
|
||||
},
|
||||
{
|
||||
label: '床位号',
|
||||
layout: 'horizontal',
|
||||
},
|
||||
]"
|
||||
>
|
||||
<template #reference>
|
||||
<ClickableTag type="success">
|
||||
{{ getStatusConfig(yes_no_type, scope.row.isRoom)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
<!-- 住宿申请状态 -->
|
||||
<template #content-0>
|
||||
<div class="dorm-apply-content">
|
||||
<ClickableTag
|
||||
v-if="getStatusConfig(dormApplyStatusList, scope.row.isDormApply)"
|
||||
:type="scope.row.isDormApply == '1' ? 'success' : 'danger'"
|
||||
:left-icon="scope.row.isDormApply == '1' ? 'CircleCheck' : 'CircleClose'"
|
||||
:right-icon="null"
|
||||
>
|
||||
{{ getStatusConfig(dormApplyStatusList, scope.row.isDormApply)?.label }}
|
||||
</ClickableTag>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 宿舍号 -->
|
||||
<template #content-1>
|
||||
<div class="dorm-room-content">
|
||||
<span :class="scope.row.roomNo ? 'room-text' : 'empty-text'">
|
||||
{{ scope.row.roomNo || '-' }}
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
<!-- 床位号 -->
|
||||
<template #content-2>
|
||||
<el-tag v-if="scope.row.bedNo" size="small" type="sucess" effect="dark"> {{ scope.row.bedNo }}号 </el-tag>
|
||||
</template>
|
||||
</DetailPopover>
|
||||
</template>
|
||||
<span v-else>{{ getStatusConfig(yes_no_type, scope.row.isRoom)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="degreeOfEducation" label="文化程度" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span>{{ getStatusConfig(eduList, scope.row.degreeOfEducation)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="residenceDetail" label="居住地址" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="parentName" label="家庭联系人" width="100" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="家长电话1" align="center" prop="parentTelOne" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="家长电话2" align="center" prop="parentTelTwo" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column prop="remarks" label="备注" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="300" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_newstucheckin_edit')" type="primary" link icon="EditPen" @click="handleCheckIn(scope.row)">
|
||||
报到
|
||||
</el-button>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignup_leaveSchool')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleLeaveSchool(scope.row, false)"
|
||||
>
|
||||
退档
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_leaveSchool_force')" type="primary" link icon="EditPen" @click="handleLeaveSchool(scope.row, true)">
|
||||
强制退档
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 报到弹窗组件 -->
|
||||
<stu-check-in ref="stuCheckInRef" @reload="refreshChange"></stu-check-in>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 报到弹窗组件 -->
|
||||
<stu-check-in ref="stuCheckInRef" @reload="refreshChange"></stu-check-in>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="newstucheckin">
|
||||
import { ref, reactive, onMounted, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import {useMessage, useMessageBox} from '/@/hooks/message'
|
||||
import { fetchList } from '/@/api/recruit/newstucheckin'
|
||||
import { getDictsByTypes } from '/@/api/admin/dict'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import request from '/@/utils/request'
|
||||
import { getStatusConfig, getCheckInStatusConfig, DORM_APPLY_STATUS_LIST } from '/@/config/global'
|
||||
import { getDeptList, getClassListByRole } from '/@/api/basic/basicclass'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import DetailPopover from '/@/components/DetailPopover/index.vue'
|
||||
import ClickableTag from '/@/components/ClickableTag/index.vue'
|
||||
import { InfoFilled, CircleCheck, CircleClose, DocumentChecked, Warning, Clock } from '@element-plus/icons-vue'
|
||||
import {leaveSchool} from "/@/api/recruit/recruitstudentsignup";
|
||||
import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { fetchList } from '/@/api/recruit/newstucheckin';
|
||||
import { getDictsByTypes } from '/@/api/admin/dict';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import request from '/@/utils/request';
|
||||
import { getStatusConfig, getCheckInStatusConfig, DORM_APPLY_STATUS_LIST } from '/@/config/global';
|
||||
import { getDeptList, getClassListByRole } from '/@/api/basic/basicclass';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import DetailPopover from '/@/components/DetailPopover/index.vue';
|
||||
import ClickableTag from '/@/components/ClickableTag/index.vue';
|
||||
import { InfoFilled, CircleCheck, CircleClose, DocumentChecked, Warning, Clock } from '@element-plus/icons-vue';
|
||||
import { leaveSchool } from '/@/api/recruit/recruitstudentsignup';
|
||||
|
||||
const StuCheckIn = defineAsyncComponent(() => import('./stu-check-in.vue'))
|
||||
const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue'))
|
||||
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const StuCheckIn = defineAsyncComponent(() => import('./stu-check-in.vue'));
|
||||
const TeacherNameNo = defineAsyncComponent(() => import('/@/components/TeacherNameNo/index.vue'));
|
||||
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 是否住宿字典
|
||||
const { yes_no_type } = useDict('yes_no_type')
|
||||
const { yes_no_type } = useDict('yes_no_type');
|
||||
|
||||
// 住宿申请状态列表
|
||||
const dormApplyStatusList = DORM_APPLY_STATUS_LIST
|
||||
const dormApplyStatusList = DORM_APPLY_STATUS_LIST;
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 文化程度字典数据
|
||||
const eduList = ref<any[]>([])
|
||||
const eduList = ref<any[]>([]);
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const stuCheckInRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const stuCheckInRef = ref();
|
||||
|
||||
// 导出加载状态
|
||||
const exportLoading = ref(false)
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 数据列表
|
||||
const deptList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const classList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const classList = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
deptCode: '',
|
||||
grade: '',
|
||||
classCode: '',
|
||||
checkInStatus: '',
|
||||
isDormApply: '',
|
||||
searchTotal: ''
|
||||
})
|
||||
deptCode: '',
|
||||
grade: '',
|
||||
classCode: '',
|
||||
checkInStatus: '',
|
||||
isDormApply: '',
|
||||
searchTotal: '',
|
||||
});
|
||||
|
||||
// 报到状态字典数据
|
||||
const checkInStatusData = ref<any[]>([])
|
||||
const checkInStatusData = ref<any[]>([]);
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList({
|
||||
...params,
|
||||
deptCode: queryForm.deptCode,
|
||||
grade: queryForm.grade,
|
||||
classCode: queryForm.classCode,
|
||||
checkInStatus: queryForm.checkInStatus,
|
||||
isDormApply: queryForm.isDormApply,
|
||||
searchTotal: queryForm.searchTotal
|
||||
})
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList({
|
||||
...params,
|
||||
deptCode: queryForm.deptCode,
|
||||
grade: queryForm.grade,
|
||||
classCode: queryForm.classCode,
|
||||
checkInStatus: queryForm.checkInStatus,
|
||||
isDormApply: queryForm.isDormApply,
|
||||
searchTotal: queryForm.searchTotal,
|
||||
});
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 获取报到状态配置(用于 ClickableTag)
|
||||
const getCheckInStatusConfigLocal = (value: string) => {
|
||||
return getCheckInStatusConfig(checkInStatusData.value, value, {
|
||||
CircleCheck,
|
||||
CircleClose,
|
||||
DocumentChecked,
|
||||
Warning,
|
||||
Clock
|
||||
})
|
||||
}
|
||||
return getCheckInStatusConfig(checkInStatusData.value, value, {
|
||||
CircleCheck,
|
||||
CircleClose,
|
||||
DocumentChecked,
|
||||
Warning,
|
||||
Clock,
|
||||
});
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.deptCode = ''
|
||||
queryForm.grade = ''
|
||||
queryForm.classCode = ''
|
||||
queryForm.checkInStatus = ''
|
||||
queryForm.isDormApply = ''
|
||||
queryForm.searchTotal = ''
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.deptCode = '';
|
||||
queryForm.grade = '';
|
||||
queryForm.classCode = '';
|
||||
queryForm.checkInStatus = '';
|
||||
queryForm.isDormApply = '';
|
||||
queryForm.searchTotal = '';
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 刷新回调
|
||||
const refreshChange = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 打开报到窗口
|
||||
const handleCheckIn = (row: any) => {
|
||||
if (stuCheckInRef.value) {
|
||||
stuCheckInRef.value.init(row, {
|
||||
currentPage: state.pagination?.current || 1,
|
||||
pageSize: state.pagination?.size || 10,
|
||||
total: state.pagination?.total || 0
|
||||
})
|
||||
}
|
||||
}
|
||||
if (stuCheckInRef.value) {
|
||||
stuCheckInRef.value.init(row, {
|
||||
currentPage: state.pagination?.current || 1,
|
||||
pageSize: state.pagination?.size || 10,
|
||||
total: state.pagination?.total || 0,
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 导出
|
||||
const handleExportOut = async () => {
|
||||
exportLoading.value = true
|
||||
try {
|
||||
const res = await request({
|
||||
method: 'post',
|
||||
url: '/recruit/newstucheckin/exportData',
|
||||
data: {
|
||||
...queryForm,
|
||||
current: state.pagination?.current || 1,
|
||||
size: state.pagination?.size || 10
|
||||
},
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
|
||||
const blob = new Blob([res.data])
|
||||
const fileName = '新生报到导出表.xls'
|
||||
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)
|
||||
|
||||
message.success('导出成功')
|
||||
} catch (error: any) {
|
||||
// console.log(error)
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
exportLoading.value = true;
|
||||
try {
|
||||
const res = await request({
|
||||
method: 'post',
|
||||
url: '/recruit/newstucheckin/exportData',
|
||||
data: {
|
||||
...queryForm,
|
||||
current: state.pagination?.current || 1,
|
||||
size: state.pagination?.size || 10,
|
||||
},
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
|
||||
const blob = new Blob([res.data]);
|
||||
const fileName = '新生报到导出表.xls';
|
||||
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);
|
||||
|
||||
message.success('导出成功');
|
||||
} catch (error: any) {
|
||||
// console.log(error)
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 查询报到状态字典
|
||||
const getDictsData = async () => {
|
||||
try {
|
||||
const data = await getDictsByTypes(['check_in_status','finance_student_source'])
|
||||
checkInStatusData.value = data.data.check_in_status || []
|
||||
eduList.value = data.data.finance_student_source || []
|
||||
} catch (error) {
|
||||
// 获取报到状态字典失败
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getDictsByTypes(['check_in_status', 'finance_student_source']);
|
||||
checkInStatusData.value = data.data.check_in_status || [];
|
||||
eduList.value = data.data.finance_student_source || [];
|
||||
} catch (error) {
|
||||
// 获取报到状态字典失败
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const init = async () => {
|
||||
try {
|
||||
// 获取学院列表
|
||||
const deptData = await getDeptList()
|
||||
deptList.value = deptData.data || []
|
||||
|
||||
// 获取入学年份列表(招生计划)
|
||||
const planData = await getList()
|
||||
planList.value = planData.data || []
|
||||
|
||||
// 获取班级列表
|
||||
const classData = await getClassListByRole()
|
||||
classList.value = classData.data || []
|
||||
|
||||
// 获取字典数据
|
||||
await getDictsData()
|
||||
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
// 获取学院列表
|
||||
const deptData = await getDeptList();
|
||||
deptList.value = deptData.data || [];
|
||||
|
||||
// 获取入学年份列表(招生计划)
|
||||
const planData = await getList();
|
||||
planList.value = planData.data || [];
|
||||
|
||||
// 获取班级列表
|
||||
const classData = await getClassListByRole();
|
||||
classList.value = classData.data || [];
|
||||
|
||||
// 获取字典数据
|
||||
await getDictsData();
|
||||
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
};
|
||||
|
||||
const handleLeaveSchool = (row: any, force: any) => {
|
||||
var str = force? '强制' : '';
|
||||
useMessageBox()
|
||||
.confirm('是否确认'+str+'办理退档操作?请谨慎操作')
|
||||
.then(() => {
|
||||
return leaveSchool({ 'id':row.id,'force':force });
|
||||
})
|
||||
.then(() => {
|
||||
message.success('操作成功');
|
||||
getDataList();
|
||||
});
|
||||
var str = force ? '强制' : '';
|
||||
useMessageBox()
|
||||
.confirm('是否确认' + str + '办理退档操作?请谨慎操作')
|
||||
.then(() => {
|
||||
return leaveSchool({ id: row.id, force: force });
|
||||
})
|
||||
.then(() => {
|
||||
message.success('操作成功');
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.parent-tel {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
// justify-content: center;
|
||||
gap: 4px;
|
||||
|
||||
.tel-item {
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.tel-separator {
|
||||
color: #909399;
|
||||
margin: 0 2px;
|
||||
}
|
||||
display: flex;
|
||||
align-items: center;
|
||||
// justify-content: center;
|
||||
gap: 4px;
|
||||
|
||||
.tel-item {
|
||||
color: #303133;
|
||||
}
|
||||
|
||||
.tel-separator {
|
||||
color: #909399;
|
||||
margin: 0 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
color: #909399;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
.dorm-tag {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.info-icon {
|
||||
font-size: 12px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
cursor: pointer;
|
||||
transition: all 0.2s ease;
|
||||
|
||||
&:hover {
|
||||
transform: translateY(-1px);
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.info-icon {
|
||||
font-size: 12px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
}
|
||||
|
||||
// 住宿申请状态内容
|
||||
.dorm-apply-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
// 宿舍号内容
|
||||
.dorm-room-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
|
||||
.room-icon {
|
||||
color: var(--el-color-primary);
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.room-text {
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
}
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
|
||||
.room-icon {
|
||||
color: var(--el-color-primary);
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.room-text {
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
|
||||
// 床位号内容
|
||||
.dorm-bed-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
|
||||
.bed-icon {
|
||||
color: var(--el-color-primary);
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.bed-text {
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
}
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
|
||||
.bed-icon {
|
||||
color: var(--el-color-primary);
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.bed-text {
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
font-size: 15px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,247 +16,227 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="入学年份" prop="grade">
|
||||
<el-select v-model="queryForm.grade" filterable clearable placeholder="请选择入学年份">
|
||||
<el-option
|
||||
v-for="item in gradeList"
|
||||
:key="item.year"
|
||||
:label="item.year"
|
||||
:value="item.year"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option
|
||||
v-for="item in deptList"
|
||||
:key="item.deptCode"
|
||||
:label="item.deptName"
|
||||
:value="item.deptCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班级" prop="classCode">
|
||||
<el-select v-model="queryForm.classCode" filterable clearable placeholder="请选择班级">
|
||||
<el-option
|
||||
v-for="item in classData"
|
||||
:key="item.classCode"
|
||||
:label="item.classNo"
|
||||
:value="item.classCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="searchData">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="入学年份" prop="grade">
|
||||
<el-select v-model="queryForm.grade" filterable clearable placeholder="请选择入学年份">
|
||||
<el-option v-for="item in gradeList" :key="item.year" :label="item.year" :value="item.year" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option v-for="item in deptList" :key="item.deptCode" :label="item.deptName" :value="item.deptCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="班级" prop="classCode">
|
||||
<el-select v-model="queryForm.classCode" filterable clearable placeholder="请选择班级">
|
||||
<el-option v-for="item in classData" :key="item.classCode" :label="item.classNo" :value="item.classCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="searchData">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_statistics_output')"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
:loading="exportLoading"
|
||||
@click="handleExportOut"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_newstucheckin_statistics_output')"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
:loading="exportLoading"
|
||||
@click="handleExportOut"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="tableData"
|
||||
height="650"
|
||||
show-summary
|
||||
:summary-method="getSummaries"
|
||||
stripe
|
||||
border
|
||||
v-loading="tableLoading"
|
||||
:header-cell-style="{ 'text-align': 'center' }"
|
||||
:cell-style="{ 'text-align': 'center' }"
|
||||
class="el_table_job_fair_stu"
|
||||
>
|
||||
<el-table-column type="index" width="50" fixed label="序号" />
|
||||
<el-table-column prop="deptName" label="学院" />
|
||||
<el-table-column prop="classNo" label="班级" />
|
||||
<el-table-column prop="classNum" label="预计报到人数" />
|
||||
<el-table-column prop="checkInOk" label="已经报到" />
|
||||
<el-table-column prop="postpone" label="推迟报到" />
|
||||
<el-table-column prop="abandon" label="放弃报到" />
|
||||
<el-table-column prop="missing" label="无法联系" />
|
||||
<el-table-column prop="contact" label="未联系" />
|
||||
<el-table-column prop="checkInRate" label="报到率" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="tableData"
|
||||
height="650"
|
||||
show-summary
|
||||
:summary-method="getSummaries"
|
||||
stripe
|
||||
border
|
||||
v-loading="tableLoading"
|
||||
:header-cell-style="{ 'text-align': 'center' }"
|
||||
:cell-style="{ 'text-align': 'center' }"
|
||||
class="el_table_job_fair_stu"
|
||||
>
|
||||
<el-table-column type="index" width="50" fixed label="序号" />
|
||||
<el-table-column prop="deptName" label="学院" />
|
||||
<el-table-column prop="classNo" label="班级" />
|
||||
<el-table-column prop="classNum" label="预计报到人数" />
|
||||
<el-table-column prop="checkInOk" label="已经报到" />
|
||||
<el-table-column prop="postpone" label="推迟报到" />
|
||||
<el-table-column prop="abandon" label="放弃报到" />
|
||||
<el-table-column prop="missing" label="无法联系" />
|
||||
<el-table-column prop="contact" label="未联系" />
|
||||
<el-table-column prop="checkInRate" label="报到率" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="newstucheckin-statistics">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { getDataStatistics } from '/@/api/recruit/newstucheckin'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getDeptList } from '/@/api/basic/basicclass'
|
||||
import { queryAllClass } from '/@/api/basic/basicclass'
|
||||
import axios from 'axios'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { getDataStatistics } from '/@/api/recruit/newstucheckin';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { getDeptList } from '/@/api/basic/basicclass';
|
||||
import { queryAllClass } from '/@/api/basic/basicclass';
|
||||
import axios from 'axios';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const tableData = ref<any[]>([])
|
||||
const tableLoading = ref(false)
|
||||
const exportLoading = ref(false)
|
||||
const gradeList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const classData = ref<any[]>([])
|
||||
const tableData = ref<any[]>([]);
|
||||
const tableLoading = ref(false);
|
||||
const exportLoading = ref(false);
|
||||
const gradeList = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
const classData = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
grade: '',
|
||||
deptCode: '',
|
||||
classCode: ''
|
||||
})
|
||||
grade: '',
|
||||
deptCode: '',
|
||||
classCode: '',
|
||||
});
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
await Promise.all([
|
||||
getGradeData(),
|
||||
getDeptData(),
|
||||
getClassData()
|
||||
])
|
||||
getList()
|
||||
}
|
||||
await Promise.all([getGradeData(), getDeptData(), getClassData()]);
|
||||
getList();
|
||||
};
|
||||
|
||||
// 查看所有入学年份
|
||||
const getGradeData = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
gradeList.value = data.data || []
|
||||
} catch (error) {
|
||||
console.error('获取入学年份失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
gradeList.value = data.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取入学年份失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 查找所有二级学院
|
||||
const getDeptData = async () => {
|
||||
try {
|
||||
const data = await getDeptList()
|
||||
deptList.value = data.data || []
|
||||
} catch (error) {
|
||||
console.error('获取学院列表失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getDeptList();
|
||||
deptList.value = data.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取学院列表失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 查找所有班级
|
||||
const getClassData = async () => {
|
||||
try {
|
||||
const data = await queryAllClass()
|
||||
classData.value = data.data || []
|
||||
} catch (error) {
|
||||
console.error('获取班级列表失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await queryAllClass();
|
||||
classData.value = data.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取班级列表失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getList = async () => {
|
||||
try {
|
||||
tableLoading.value = true
|
||||
const response = await getDataStatistics(queryForm)
|
||||
tableData.value = response.data || []
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error)
|
||||
} finally {
|
||||
tableLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
tableLoading.value = true;
|
||||
const response = await getDataStatistics(queryForm);
|
||||
tableData.value = response.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error);
|
||||
} finally {
|
||||
tableLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 查询
|
||||
const searchData = () => {
|
||||
getList()
|
||||
}
|
||||
getList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.grade = ''
|
||||
queryForm.deptCode = ''
|
||||
queryForm.classCode = ''
|
||||
getList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.grade = '';
|
||||
queryForm.deptCode = '';
|
||||
queryForm.classCode = '';
|
||||
getList();
|
||||
};
|
||||
|
||||
// 导出
|
||||
const handleExportOut = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
const res = await axios({
|
||||
method: 'post',
|
||||
url: '/recruit/newstucheckin/exportDataStatistics',
|
||||
data: queryForm,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
const blob = new Blob([res.data])
|
||||
const fileName = '新生报到统计.xls'
|
||||
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 (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
const res = await axios({
|
||||
method: 'post',
|
||||
url: '/recruit/newstucheckin/exportDataStatistics',
|
||||
data: queryForm,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
const blob = new Blob([res.data]);
|
||||
const fileName = '新生报到统计.xls';
|
||||
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 (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 合计方法
|
||||
const getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '合计'
|
||||
return
|
||||
}
|
||||
if (index === 1 || index === 2) {
|
||||
sums[index] = ''
|
||||
return
|
||||
}
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: any) => {
|
||||
const value = Number(curr)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
sums[index] += ''
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '合计';
|
||||
return;
|
||||
}
|
||||
if (index === 1 || index === 2) {
|
||||
sums[index] = '';
|
||||
return;
|
||||
}
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: any) => {
|
||||
const value = Number(curr);
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0);
|
||||
sums[index] += '';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,281 +1,255 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-dialog v-model="newStuCheckInDialog" width="600" title="新生报到">
|
||||
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px"
|
||||
class="demo-ruleForm">
|
||||
<el-form-item label="姓名" prop="realName">
|
||||
<el-input v-model="form.name"></el-input>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-dialog v-model="newStuCheckInDialog" width="600" title="新生报到">
|
||||
<el-form :model="form" :rules="rules" ref="formRef" label-width="100px" class="demo-ruleForm">
|
||||
<el-form-item label="姓名" prop="realName">
|
||||
<el-input v-model="form.name"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-radio-group v-model="form.gender">
|
||||
<el-radio v-for="item in genderData" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-radio-group v-model="form.gender">
|
||||
<el-radio v-for="item in genderData" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="身份证号" prop="idCard">
|
||||
<el-input v-model="form.idNumber" v-input-filter="'idcard'"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="身份证号" prop="idCard">
|
||||
<el-input v-model="form.idNumber" v-input-filter="'idcard'"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="报到状态" prop="checkInStatus">
|
||||
<el-select v-model="form.checkInStatus" filterable placeholder="请选择报到状态">
|
||||
<el-option
|
||||
v-for="item in checkInStatusData"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="报到状态" prop="checkInStatus">
|
||||
<el-select v-model="form.checkInStatus" filterable placeholder="请选择报到状态">
|
||||
<el-option v-for="item in checkInStatusData" :key="item.value" :label="item.label" :value="item.value"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="是否住宿" prop="isRoom" v-if="isRoomTab">
|
||||
<el-select v-model="form.isRoom" filterable placeholder="是否住宿">
|
||||
<el-option
|
||||
v-for="item in yesOrNoData"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否住宿" prop="isRoom" v-if="isRoomTab">
|
||||
<el-select v-model="form.isRoom" filterable placeholder="是否住宿">
|
||||
<el-option v-for="item in yesOrNoData" :key="item.value" :label="item.label" :value="item.value"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="宿舍号" prop="roomNo" v-if="isRoomTab && form.isRoom=='1'">
|
||||
<el-select
|
||||
v-model="form.roomNo"
|
||||
filterable
|
||||
remote
|
||||
placeholder="请选择宿舍号"
|
||||
:remote-method="remoteMethod"
|
||||
@change="handleRoomNoChange"
|
||||
:loading="loading"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in roomNoList"
|
||||
:key="item.id"
|
||||
:label="item.roomNo"
|
||||
:value="item.roomNo">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="宿舍号" prop="roomNo" v-if="isRoomTab && form.isRoom == '1'">
|
||||
<el-select
|
||||
v-model="form.roomNo"
|
||||
filterable
|
||||
remote
|
||||
placeholder="请选择宿舍号"
|
||||
:remote-method="remoteMethod"
|
||||
@change="handleRoomNoChange"
|
||||
:loading="loading"
|
||||
>
|
||||
<el-option v-for="item in roomNoList" :key="item.id" :label="item.roomNo" :value="item.roomNo"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="床号" prop="bedNo" v-if="isRoomTab && form.isRoom=='1'">
|
||||
<el-select v-model="form.bedNo" filterable placeholder="请选择床号" :key="bedNoKey">
|
||||
<el-option
|
||||
v-for="item in bedNoData"
|
||||
:key="item.bedNo"
|
||||
:label="item.bedNo"
|
||||
:value="item.bedNo"
|
||||
:disabled="isRoomDisable(item.notBedNo)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="床号" prop="bedNo" v-if="isRoomTab && form.isRoom == '1'">
|
||||
<el-select v-model="form.bedNo" filterable placeholder="请选择床号" :key="bedNoKey">
|
||||
<el-option v-for="item in bedNoData" :key="item.bedNo" :label="item.bedNo" :value="item.bedNo" :disabled="isRoomDisable(item.notBedNo)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
<el-form-item label="备注" prop="remarks">
|
||||
<el-input v-model="form.remarks" type="textarea" :rows="2"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="newStuCheckInDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
<el-form-item label="备注" prop="remarks">
|
||||
<el-input v-model="form.remarks" type="textarea" :rows="2"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<el-button @click="newStuCheckInDialog = false">取消</el-button>
|
||||
<el-button type="primary" @click="checkIn" :loading="submitLoading">确定</el-button>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, watch } from 'vue'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { fearchRoomStuNum } from "/@/api/stuwork/dormroomstudent"
|
||||
import { putObj } from '/@/api/recruit/newstucheckin'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import { getDicts } from '/@/api/admin/dict'
|
||||
import { getDataByRoomNo } from '/@/api/stuwork/dormroom'
|
||||
const { sexy:genderData ,yes_no_type:yesOrNoData} = useDict('sexy','yes_no_type')
|
||||
import { ref, reactive, watch } from 'vue';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { fearchRoomStuNum } from '/@/api/stuwork/dormroomstudent';
|
||||
import { putObj } from '/@/api/recruit/newstucheckin';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
import { getDataByRoomNo } from '/@/api/stuwork/dormroom';
|
||||
const { sexy: genderData, yes_no_type: yesOrNoData } = useDict('sexy', 'yes_no_type');
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'reload', page: any): void
|
||||
}>()
|
||||
(e: 'reload', page: any): void;
|
||||
}>();
|
||||
|
||||
// 消息提示
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 表单引用
|
||||
const formRef = ref()
|
||||
const formRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const page = ref<any>({})
|
||||
const newStuCheckInDialog = ref(false)
|
||||
const bedNoData = ref<any[]>([])
|
||||
const roomNoList = ref<any[]>([])
|
||||
const checkInStatusData = ref<any[]>([])
|
||||
const loading = ref(false)
|
||||
const isRoomTab = ref(false)
|
||||
const bedNoKey = ref(0) // 用于强制更新床号选择器
|
||||
const page = ref<any>({});
|
||||
const newStuCheckInDialog = ref(false);
|
||||
const bedNoData = ref<any[]>([]);
|
||||
const roomNoList = ref<any[]>([]);
|
||||
const checkInStatusData = ref<any[]>([]);
|
||||
const loading = ref(false);
|
||||
const isRoomTab = ref(false);
|
||||
const bedNoKey = ref(0); // 用于强制更新床号选择器
|
||||
|
||||
|
||||
|
||||
const submitLoading = ref(false)
|
||||
const submitLoading = ref(false);
|
||||
|
||||
const form = reactive({
|
||||
name: "",
|
||||
checkInStatus: "",
|
||||
gender: "",
|
||||
idNumber: "",
|
||||
isRoom: "",
|
||||
roomNo: "",
|
||||
bedNo: "",
|
||||
remarks: "",
|
||||
residenceDetail: "",
|
||||
parentName: "",
|
||||
parentTelOne: "",
|
||||
parentTelTwo: ""
|
||||
})
|
||||
name: '',
|
||||
checkInStatus: '',
|
||||
gender: '',
|
||||
idNumber: '',
|
||||
isRoom: '',
|
||||
roomNo: '',
|
||||
bedNo: '',
|
||||
remarks: '',
|
||||
residenceDetail: '',
|
||||
parentName: '',
|
||||
parentTelOne: '',
|
||||
parentTelTwo: '',
|
||||
});
|
||||
|
||||
const rules = {
|
||||
name: [
|
||||
{ required: true, message: '请输入姓名', trigger: ["blur", "change"] }
|
||||
],
|
||||
gender: [
|
||||
{ required: true, message: '请输入性别', trigger: ["blur", "change"] }
|
||||
],
|
||||
idNumber: [
|
||||
{ required: true, message: '请输入身份证号', trigger: ["blur", "change"] }
|
||||
],
|
||||
checkInStatus: [
|
||||
{ required: true, message: '请输入报到状态', trigger: ["blur", "change"] }
|
||||
],
|
||||
isRoom: [
|
||||
{ required: true, message: '请选择是否住宿', trigger: ["blur", "change"] }
|
||||
],
|
||||
roomNo: [
|
||||
{ required: true, message: '请选择宿舍号', trigger: ["blur", "change"] }
|
||||
],
|
||||
bedNo: [
|
||||
{ required: true, message: '请选择床位号', trigger: ["blur", "change"] }
|
||||
],
|
||||
}
|
||||
name: [{ required: true, message: '请输入姓名', trigger: ['blur', 'change'] }],
|
||||
gender: [{ required: true, message: '请输入性别', trigger: ['blur', 'change'] }],
|
||||
idNumber: [{ required: true, message: '请输入身份证号', trigger: ['blur', 'change'] }],
|
||||
checkInStatus: [{ required: true, message: '请输入报到状态', trigger: ['blur', 'change'] }],
|
||||
isRoom: [{ required: true, message: '请选择是否住宿', trigger: ['blur', 'change'] }],
|
||||
roomNo: [{ required: true, message: '请选择宿舍号', trigger: ['blur', 'change'] }],
|
||||
bedNo: [{ required: true, message: '请选择床位号', trigger: ['blur', 'change'] }],
|
||||
};
|
||||
|
||||
// 监听报到状态变化
|
||||
watch(() => form.checkInStatus, (newVal) => {
|
||||
if (newVal === '1') {
|
||||
isRoomTab.value = true
|
||||
} else {
|
||||
isRoomTab.value = false
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => form.checkInStatus,
|
||||
(newVal) => {
|
||||
if (newVal === '1') {
|
||||
isRoomTab.value = true;
|
||||
} else {
|
||||
isRoomTab.value = false;
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 监听宿舍号变化
|
||||
watch(() => form.roomNo, (newVal) => {
|
||||
console.log(newVal)
|
||||
if (newVal) {
|
||||
fearchRoomStuNums(newVal)
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => form.roomNo,
|
||||
(newVal) => {
|
||||
console.log(newVal);
|
||||
if (newVal) {
|
||||
fearchRoomStuNums(newVal);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 监听是否住宿变化
|
||||
watch(() => form.isRoom, (newVal) => {
|
||||
if (newVal === '0') {
|
||||
form.roomNo = ''
|
||||
form.bedNo = ''
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => form.isRoom,
|
||||
(newVal) => {
|
||||
if (newVal === '0') {
|
||||
form.roomNo = '';
|
||||
form.bedNo = '';
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 初始化表单
|
||||
const initForm = () => {
|
||||
form.name = ""
|
||||
form.checkInStatus = ""
|
||||
form.gender = ""
|
||||
form.idNumber = ""
|
||||
form.isRoom = ""
|
||||
form.roomNo = ""
|
||||
form.bedNo = ""
|
||||
form.remarks = ""
|
||||
form.residenceDetail = ""
|
||||
form.parentName = ""
|
||||
form.parentTelOne = ""
|
||||
form.parentTelTwo = ""
|
||||
}
|
||||
form.name = '';
|
||||
form.checkInStatus = '';
|
||||
form.gender = '';
|
||||
form.idNumber = '';
|
||||
form.isRoom = '';
|
||||
form.roomNo = '';
|
||||
form.bedNo = '';
|
||||
form.remarks = '';
|
||||
form.residenceDetail = '';
|
||||
form.parentName = '';
|
||||
form.parentTelOne = '';
|
||||
form.parentTelTwo = '';
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (formData: any, pageData: any) => {
|
||||
initForm()
|
||||
page.value = pageData
|
||||
submitLoading.value = false
|
||||
newStuCheckInDialog.value = true
|
||||
initForm();
|
||||
page.value = pageData;
|
||||
submitLoading.value = false;
|
||||
newStuCheckInDialog.value = true;
|
||||
|
||||
Object.assign(form, formData)
|
||||
if (formData.roomNo) {
|
||||
remoteMethod(formData.roomNo)
|
||||
fearchRoomStuNums(formData.bedNo)
|
||||
}
|
||||
getDicts('check_in_status').then(data => {
|
||||
checkInStatusData.value = data.data
|
||||
})
|
||||
}
|
||||
Object.assign(form, formData);
|
||||
if (formData.roomNo) {
|
||||
remoteMethod(formData.roomNo);
|
||||
fearchRoomStuNums(formData.bedNo);
|
||||
}
|
||||
getDicts('check_in_status').then((data) => {
|
||||
checkInStatusData.value = data.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 报到提交
|
||||
const checkIn = () => {
|
||||
submitLoading.value = true
|
||||
formRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
putObj(form).then(() => {
|
||||
message.success('报到成功')
|
||||
emit('reload', page.value)
|
||||
newStuCheckInDialog.value = false
|
||||
submitLoading.value = false
|
||||
}).catch(() => {
|
||||
submitLoading.value = false
|
||||
})
|
||||
} else {
|
||||
submitLoading.value = false
|
||||
return false
|
||||
}
|
||||
})
|
||||
}
|
||||
submitLoading.value = true;
|
||||
formRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
putObj(form)
|
||||
.then(() => {
|
||||
message.success('报到成功');
|
||||
emit('reload', page.value);
|
||||
newStuCheckInDialog.value = false;
|
||||
submitLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
submitLoading.value = false;
|
||||
});
|
||||
} else {
|
||||
submitLoading.value = false;
|
||||
return false;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 实时检索宿舍号
|
||||
const remoteMethod = (query: string) => {
|
||||
if (query != '' && query.length >= 3) {
|
||||
const data = { 'roomNo': query }
|
||||
loading.value = true
|
||||
getDataByRoomNo(data).then(data => {
|
||||
roomNoList.value = data.data
|
||||
loading.value = false
|
||||
}).catch(() => {
|
||||
loading.value = false
|
||||
})
|
||||
}
|
||||
}
|
||||
if (query != '' && query.length >= 3) {
|
||||
const data = { roomNo: query };
|
||||
loading.value = true;
|
||||
getDataByRoomNo(data)
|
||||
.then((data) => {
|
||||
roomNoList.value = data.data;
|
||||
loading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
loading.value = false;
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 查询此房间为几人间
|
||||
const fearchRoomStuNums = (roomNo: string) => {
|
||||
fearchRoomStuNum(roomNo).then(data => {
|
||||
bedNoData.value = data.data
|
||||
})
|
||||
}
|
||||
fearchRoomStuNum(roomNo).then((data) => {
|
||||
bedNoData.value = data.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 判断床位是否禁用
|
||||
const isRoomDisable = (notBedNo: any) => {
|
||||
if (undefined != notBedNo && "" != notBedNo) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (undefined != notBedNo && '' != notBedNo) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// 宿舍号变化时清空床号
|
||||
const handleRoomNoChange = () => {
|
||||
form.bedNo = ''
|
||||
bedNoKey.value++ // 强制更新床号选择器
|
||||
}
|
||||
form.bedNo = '';
|
||||
bedNoKey.value++; // 强制更新床号选择器
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
<style scoped></style>
|
||||
|
||||
@@ -1,296 +1,283 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="!dataForm.id ? '新增' : '修改'"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
append-to-body
|
||||
width="600px"
|
||||
>
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px">
|
||||
<el-dialog :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" v-model="visible" append-to-body width="600px">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px">
|
||||
<el-form-item label="模拟学生" prop="serialNumber">
|
||||
<el-select
|
||||
v-model="dataForm.serialNumber"
|
||||
@change="changeStu"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
reserve-keyword
|
||||
:disabled="!!dataForm.id"
|
||||
placeholder="请选择唯一号"
|
||||
:remote-method="remoteTeacherByQuery"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in serialNumberList"
|
||||
:key="item.serialNumber"
|
||||
:label="item.name + '(' + item.serialNumber + ')'"
|
||||
:value="item.serialNumber"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="来源" prop="isOut">
|
||||
<el-select v-model="dataForm.isOut" filterable disabled 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="拟报专业1" prop="wishMajorOne">
|
||||
<el-select v-model="dataForm.wishMajorOne" filterable placeholder="请选择拟报专业1">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName + ' | ' + item.learnYear + '年 | ' + item.majorCode"
|
||||
:value="item.majorCode"
|
||||
:disabled="isDisable(item.majorCode)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="拟报专业2" prop="wishMajorTwo">
|
||||
<el-select v-model="dataForm.wishMajorTwo" filterable placeholder="请选择拟报专业2">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName + ' | ' + item.learnYear + '年 | ' + item.majorCode"
|
||||
:value="item.majorCode"
|
||||
:disabled="isDisable(item.majorCode)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="拟报专业3" prop="wishMajorThree">
|
||||
<el-select v-model="dataForm.wishMajorThree" filterable placeholder="请选择拟报专业3">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName + ' | ' + item.learnYear + '年 | ' + item.majorCode"
|
||||
:value="item.majorCode"
|
||||
:disabled="isDisable(item.majorCode)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="录取专业" prop="confirmedMajor">
|
||||
<el-select v-model="dataForm.confirmedMajor" filterable placeholder="请选择录取专业">
|
||||
<el-option
|
||||
v-for="item in planMajorEduList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName + ' | ' + item.learnYear + '年 | ' + item.majorCode"
|
||||
:value="item.majorCode"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-form-item label="模拟学生" prop="serialNumber">
|
||||
<el-select
|
||||
v-model="dataForm.serialNumber"
|
||||
@change="changeStu"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
reserve-keyword
|
||||
:disabled="!!dataForm.id" placeholder="请选择唯一号"
|
||||
:remote-method="remoteTeacherByQuery"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in serialNumberList"
|
||||
:key="item.serialNumber"
|
||||
:label="item.name+'('+item.serialNumber+')'"
|
||||
:value="item.serialNumber">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="来源" prop="isOut">
|
||||
<el-select v-model="dataForm.isOut" filterable disabled 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="拟报专业1" prop="wishMajorOne">
|
||||
<el-select v-model="dataForm.wishMajorOne" filterable placeholder="请选择拟报专业1" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName+' | '+item.learnYear+'年 | '+item.majorCode"
|
||||
:value="item.majorCode"
|
||||
:disabled="isDisable(item.majorCode)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="拟报专业2" prop="wishMajorTwo">
|
||||
<el-select v-model="dataForm.wishMajorTwo" filterable placeholder="请选择拟报专业2" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName+' | '+item.learnYear+'年 | '+item.majorCode"
|
||||
:value="item.majorCode"
|
||||
:disabled="isDisable(item.majorCode)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="拟报专业3" prop="wishMajorThree">
|
||||
<el-select v-model="dataForm.wishMajorThree" filterable placeholder="请选择拟报专业3" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName+' | '+item.learnYear+'年 | '+item.majorCode"
|
||||
:value="item.majorCode"
|
||||
:disabled="isDisable(item.majorCode)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="录取专业" prop="confirmedMajor">
|
||||
<el-select v-model="dataForm.confirmedMajor" filterable placeholder="请选择录取专业" >
|
||||
<el-option
|
||||
v-for="item in planMajorEduList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName+' | '+item.learnYear+'年 | '+item.majorCode"
|
||||
:value="item.majorCode">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { addMNObj, getMNObj, putMNObj } from '/@/api/recruit/recruitImitateAdjustBatch'
|
||||
import { getList } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { listPlanByCondition as planMajor, listByEdu } from '/@/api/recruit/recruitstudentplan'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { addMNObj, getMNObj, putMNObj } from '/@/api/recruit/recruitImitateAdjustBatch';
|
||||
import { getList } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { listPlanByCondition as planMajor, listByEdu } from '/@/api/recruit/recruitstudentplan';
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const disabled = ref(false)
|
||||
const serialNumberList = ref<any[]>([])
|
||||
const planMajorEduList = ref<any[]>([])
|
||||
const planMajorList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const disabled = ref(false);
|
||||
const serialNumberList = ref<any[]>([]);
|
||||
const planMajorEduList = ref<any[]>([]);
|
||||
const planMajorList = ref<any[]>([]);
|
||||
|
||||
const isOutList = [
|
||||
{ label: "学校", value: "0" },
|
||||
{ label: "市平台", value: "1" }
|
||||
]
|
||||
{ label: '学校', value: '0' },
|
||||
{ label: '市平台', value: '1' },
|
||||
];
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
serialNumber: "",
|
||||
groupId: "",
|
||||
batchNo: "",
|
||||
wishMajorOne: '',
|
||||
wishMajorTwo: '',
|
||||
wishMajorThree: '',
|
||||
confirmedMajor: '',
|
||||
isOut: '',
|
||||
degreeOfEducation: "",
|
||||
name: "",
|
||||
gender: "",
|
||||
idNumber: "",
|
||||
oldConfirmedMajor: ""
|
||||
})
|
||||
id: '',
|
||||
serialNumber: '',
|
||||
groupId: '',
|
||||
batchNo: '',
|
||||
wishMajorOne: '',
|
||||
wishMajorTwo: '',
|
||||
wishMajorThree: '',
|
||||
confirmedMajor: '',
|
||||
isOut: '',
|
||||
degreeOfEducation: '',
|
||||
name: '',
|
||||
gender: '',
|
||||
idNumber: '',
|
||||
oldConfirmedMajor: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
serialNumber: [
|
||||
{ required: true, message: '模拟学生不能为空', trigger: 'blur' },
|
||||
],
|
||||
confirmedMajor: [
|
||||
{ required: true, message: '录取专业不能为空', trigger: 'blur' },
|
||||
],
|
||||
}
|
||||
serialNumber: [{ required: true, message: '模拟学生不能为空', trigger: 'blur' }],
|
||||
confirmedMajor: [{ required: true, message: '录取专业不能为空', trigger: 'blur' }],
|
||||
};
|
||||
|
||||
/**
|
||||
* 判断拟报专业是否已经占用,占用不可选
|
||||
*/
|
||||
const isDisable = (majorCode: string) => {
|
||||
if (majorCode == dataForm.wishMajorOne
|
||||
|| majorCode == dataForm.wishMajorTwo
|
||||
|| majorCode == dataForm.wishMajorThree
|
||||
) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (majorCode == dataForm.wishMajorOne || majorCode == dataForm.wishMajorTwo || majorCode == dataForm.wishMajorThree) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
planMajorList.value = []
|
||||
serialNumberList.value = []
|
||||
planMajor({ groupId: dataForm.groupId }).then((data: any) => {
|
||||
planMajorList.value = data.data
|
||||
})
|
||||
}
|
||||
planMajorList.value = [];
|
||||
serialNumberList.value = [];
|
||||
planMajor({ groupId: dataForm.groupId }).then((data: any) => {
|
||||
planMajorList.value = data.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 远程搜索学生
|
||||
const remoteTeacherByQuery = (query: string) => {
|
||||
serialNumberList.value = []
|
||||
if (query !== '') {
|
||||
setTimeout(() => {
|
||||
getList({ groupId: dataForm.groupId, serialNumber: query }).then((response: any) => {
|
||||
serialNumberList.value = response.data
|
||||
})
|
||||
}, 200)
|
||||
}
|
||||
}
|
||||
serialNumberList.value = [];
|
||||
if (query !== '') {
|
||||
setTimeout(() => {
|
||||
getList({ groupId: dataForm.groupId, serialNumber: query }).then((response: any) => {
|
||||
serialNumberList.value = response.data;
|
||||
});
|
||||
}, 200);
|
||||
}
|
||||
};
|
||||
|
||||
// 学生选择变化
|
||||
const changeStu = () => {
|
||||
planMajorEduList.value = []
|
||||
dataForm.wishMajorOne = ''
|
||||
dataForm.wishMajorTwo = ''
|
||||
dataForm.wishMajorThree = ''
|
||||
dataForm.degreeOfEducation = ""
|
||||
dataForm.oldConfirmedMajor = ""
|
||||
dataForm.name = ""
|
||||
dataForm.idNumber = ""
|
||||
dataForm.confirmedMajor = ""
|
||||
dataForm.gender = ""
|
||||
dataForm.isOut = ""
|
||||
serialNumberList.value.forEach(e => {
|
||||
if (e.serialNumber == dataForm.serialNumber) {
|
||||
dataForm.wishMajorOne = e.wishMajorOne
|
||||
dataForm.wishMajorTwo = e.wishMajorTwo
|
||||
dataForm.wishMajorThree = e.wishMajorThree
|
||||
dataForm.degreeOfEducation = e.degreeOfEducation
|
||||
dataForm.name = e.name
|
||||
dataForm.idNumber = e.idNumber
|
||||
dataForm.gender = e.gender
|
||||
dataForm.isOut = e.isOut
|
||||
dataForm.confirmedMajor = e.confirmedMajor
|
||||
dataForm.oldConfirmedMajor = e.confirmedMajor
|
||||
getMajorListByEdu()
|
||||
}
|
||||
})
|
||||
}
|
||||
planMajorEduList.value = [];
|
||||
dataForm.wishMajorOne = '';
|
||||
dataForm.wishMajorTwo = '';
|
||||
dataForm.wishMajorThree = '';
|
||||
dataForm.degreeOfEducation = '';
|
||||
dataForm.oldConfirmedMajor = '';
|
||||
dataForm.name = '';
|
||||
dataForm.idNumber = '';
|
||||
dataForm.confirmedMajor = '';
|
||||
dataForm.gender = '';
|
||||
dataForm.isOut = '';
|
||||
serialNumberList.value.forEach((e) => {
|
||||
if (e.serialNumber == dataForm.serialNumber) {
|
||||
dataForm.wishMajorOne = e.wishMajorOne;
|
||||
dataForm.wishMajorTwo = e.wishMajorTwo;
|
||||
dataForm.wishMajorThree = e.wishMajorThree;
|
||||
dataForm.degreeOfEducation = e.degreeOfEducation;
|
||||
dataForm.name = e.name;
|
||||
dataForm.idNumber = e.idNumber;
|
||||
dataForm.gender = e.gender;
|
||||
dataForm.isOut = e.isOut;
|
||||
dataForm.confirmedMajor = e.confirmedMajor;
|
||||
dataForm.oldConfirmedMajor = e.confirmedMajor;
|
||||
getMajorListByEdu();
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 根据学历获取专业列表
|
||||
const getMajorListByEdu = () => {
|
||||
planMajorEduList.value = []
|
||||
listByEdu({ groupId: dataForm.groupId, degreeOfEducation: dataForm.degreeOfEducation }).then((res: any) => {
|
||||
planMajorEduList.value = res.data
|
||||
})
|
||||
}
|
||||
planMajorEduList.value = [];
|
||||
listByEdu({ groupId: dataForm.groupId, degreeOfEducation: dataForm.degreeOfEducation }).then((res: any) => {
|
||||
planMajorEduList.value = res.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
if (dataForm.oldConfirmedMajor == dataForm.confirmedMajor) {
|
||||
ElNotification.error({
|
||||
title: '错误',
|
||||
message: '模拟调整的专业不能和原录取专业相同,请检查'
|
||||
})
|
||||
return
|
||||
}
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
putMNObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
addMNObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
if (dataForm.oldConfirmedMajor == dataForm.confirmedMajor) {
|
||||
ElNotification.error({
|
||||
title: '错误',
|
||||
message: '模拟调整的专业不能和原录取专业相同,请检查',
|
||||
});
|
||||
return;
|
||||
}
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
putMNObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
addMNObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null, groupId: string, batchNo: string) => {
|
||||
dataForm.id = id || null
|
||||
dataForm.batchNo = batchNo
|
||||
dataForm.groupId = groupId
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
planMajorEduList.value = []
|
||||
initData()
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
if (dataForm.id) {
|
||||
getMNObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
getMajorListByEdu()
|
||||
})
|
||||
} else {
|
||||
disabled.value = true
|
||||
}
|
||||
})
|
||||
}
|
||||
dataForm.id = id || null;
|
||||
dataForm.batchNo = batchNo;
|
||||
dataForm.groupId = groupId;
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
planMajorEduList.value = [];
|
||||
initData();
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
if (dataForm.id) {
|
||||
getMNObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
getMajorListByEdu();
|
||||
});
|
||||
} else {
|
||||
disabled.value = true;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,139 +1,131 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="!dataForm.id ? '新增' : '修改'"
|
||||
:close-on-click-modal="false"
|
||||
width="600px"
|
||||
v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-dialog :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" width="600px" v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
|
||||
<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="batchName">
|
||||
<el-input v-model="dataForm.batchName" placeholder="批次名称"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
|
||||
<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="batchName">
|
||||
<el-input v-model="dataForm.batchName" placeholder="批次名称"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitImitateAdjustBatch'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitImitateAdjustBatch';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const disabled = ref(false)
|
||||
const planList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const disabled = ref(false);
|
||||
const planList = ref<any[]>([]);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
batchName: "",
|
||||
groupId: "",
|
||||
})
|
||||
id: '',
|
||||
batchName: '',
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'blur' },
|
||||
],
|
||||
batchName: [
|
||||
{ required: true, message: '批次名称不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '批次名称长度不大于20个字符', trigger: 'blur' }
|
||||
],
|
||||
}
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'blur' }],
|
||||
batchName: [
|
||||
{ required: true, message: '批次名称不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '批次名称长度不大于20个字符', trigger: 'blur' },
|
||||
],
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
if (!dataForm.id) {
|
||||
dataForm.groupId = planList.value[0].id
|
||||
}
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
if (!dataForm.id) {
|
||||
dataForm.groupId = planList.value[0].id;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
addObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
addObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
dataForm.id = id || null
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
initData()
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
})
|
||||
} else {
|
||||
disabled.value = true
|
||||
}
|
||||
})
|
||||
}
|
||||
dataForm.id = id || null;
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
initData();
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
});
|
||||
} else {
|
||||
disabled.value = true;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,234 +16,213 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="批次名称" prop="batchName">
|
||||
<el-input v-model="queryForm.batchName" clearable placeholder="批次名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="批次代码" prop="batchCode">
|
||||
<el-input v-model="queryForm.batchCode" clearable placeholder="批次代码" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="批次名称" prop="batchName">
|
||||
<el-input v-model="queryForm.batchName" clearable placeholder="批次名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="批次代码" prop="batchCode">
|
||||
<el-input v-model="queryForm.batchCode" clearable placeholder="批次代码" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_add')"
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="addOrUpdateHandle"
|
||||
>
|
||||
新 增
|
||||
</el-button>
|
||||
</div>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruit_recruitImitateAdjustBatch_add')" type="primary" icon="FolderAdd" @click="addOrUpdateHandle">
|
||||
新 增
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="batchName" label="批次名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="batchCode" label="批次代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="peopleNumber" label="人数" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="380" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_show')"
|
||||
type="primary"
|
||||
link
|
||||
icon="Document"
|
||||
@click="showTable(scope.row.batchCode, scope.row.groupId)"
|
||||
>
|
||||
模拟列表
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_show')"
|
||||
type="warning"
|
||||
link
|
||||
icon="Download"
|
||||
:loading="btnLoading"
|
||||
@click="handleExport(scope.row)"
|
||||
>
|
||||
导出模拟结果
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="batchName" label="批次名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="batchCode" label="批次代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="peopleNumber" label="人数" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="380" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_show')"
|
||||
type="primary"
|
||||
link
|
||||
icon="Document"
|
||||
@click="showTable(scope.row.batchCode, scope.row.groupId)"
|
||||
>
|
||||
模拟列表
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_show')"
|
||||
type="warning"
|
||||
link
|
||||
icon="Download"
|
||||
:loading="btnLoading"
|
||||
@click="handleExport(scope.row)"
|
||||
>
|
||||
导出模拟结果
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitImitateAdjustBatch_del')" type="danger" link icon="Delete" @click="deleteHandle(scope.row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
<mn-table ref="mnTableRef" @refreshDataList="getDataList" />
|
||||
</div>
|
||||
</div>
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
<mn-table ref="mnTableRef" @refreshDataList="getDataList" />
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitImitateAdjustBatch">
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { delObj, fetchList } from '/@/api/recruit/recruitImitateAdjustBatch'
|
||||
import {exportAdjustExcel} from "/@/api/recruit/recruitfile"
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { delObj, fetchList } from '/@/api/recruit/recruitImitateAdjustBatch';
|
||||
import { exportAdjustExcel } from '/@/api/recruit/recruitfile';
|
||||
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
|
||||
const MnTable = defineAsyncComponent(() => import('./mnTable.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'));
|
||||
const MnTable = defineAsyncComponent(() => import('./mnTable.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const addOrUpdateRef = ref()
|
||||
const mnTableRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const addOrUpdateRef = ref();
|
||||
const mnTableRef = ref();
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const planList = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
batchName: '',
|
||||
batchCode: ''
|
||||
})
|
||||
groupId: '',
|
||||
batchName: '',
|
||||
batchCode: '',
|
||||
});
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// 初始化失败
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// 初始化失败
|
||||
}
|
||||
};
|
||||
|
||||
// 新增 / 修改
|
||||
const addOrUpdateHandle = (payload?: string | MouseEvent) => {
|
||||
// 新增按钮未传参时会传入 MouseEvent,这里统一转换为 id 或 null
|
||||
const id = typeof payload === 'string' ? payload : null
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id)
|
||||
})
|
||||
}
|
||||
// 新增按钮未传参时会传入 MouseEvent,这里统一转换为 id 或 null
|
||||
const id = typeof payload === 'string' ? payload : null;
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id);
|
||||
});
|
||||
};
|
||||
|
||||
// 显示模拟列表
|
||||
const showTable = (batchNo: string, groupId: string) => {
|
||||
nextTick(() => {
|
||||
mnTableRef.value?.init(batchNo, groupId)
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
mnTableRef.value?.init(batchNo, groupId);
|
||||
});
|
||||
};
|
||||
|
||||
const btnLoading=ref(false)
|
||||
const btnLoading = ref(false);
|
||||
// 导出模拟结果
|
||||
const handleExport = async (data:any) => {
|
||||
btnLoading.value=true
|
||||
exportAdjustExcel(data).then((res:any)=>{
|
||||
messageBox.success('导出后台执行中,请稍后查看下载任务')
|
||||
btnLoading.value=false
|
||||
})
|
||||
}
|
||||
const handleExport = async (data: any) => {
|
||||
btnLoading.value = true;
|
||||
exportAdjustExcel(data).then((res: any) => {
|
||||
messageBox.success('导出后台执行中,请稍后查看下载任务');
|
||||
btnLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delObj(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delObj(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
queryForm.batchName = ''
|
||||
queryForm.batchCode = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
queryForm.batchName = '';
|
||||
queryForm.batchCode = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,225 +1,184 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
title="模拟列表"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="98%"
|
||||
>
|
||||
<el-form :inline="true">
|
||||
<el-form-item>
|
||||
<el-button v-if="hasAuth('recruit_recruitImitateAdjustBatch_add')" icon="FolderAdd" type="primary" @click="addOrUpdateHandle()">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="dataListLoading">
|
||||
<el-table-column
|
||||
prop="serialNumber"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="唯一号">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="name"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="姓名">
|
||||
</el-table-column>
|
||||
<el-dialog title="模拟列表" :close-on-click-modal="false" v-model="visible" width="98%">
|
||||
<el-form :inline="true">
|
||||
<el-form-item>
|
||||
<el-button v-if="hasAuth('recruit_recruitImitateAdjustBatch_add')" icon="FolderAdd" type="primary" @click="addOrUpdateHandle()"
|
||||
>新增</el-button
|
||||
>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table :data="dataList" border stripe v-loading="dataListLoading">
|
||||
<el-table-column prop="serialNumber" header-align="center" align="center" label="唯一号"> </el-table-column>
|
||||
<el-table-column prop="name" header-align="center" align="center" label="姓名"> </el-table-column>
|
||||
|
||||
<el-table-column
|
||||
prop="gender"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="性别">
|
||||
<template #default="scope">
|
||||
<GenderTag :sex="scope.row.gender" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="degreeOfEducation"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="学历">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(eduList, scope.row.degreeOfEducation, { key: 'value', value: 'label' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="wishMajorOne"
|
||||
header-align="center"
|
||||
width="100px"
|
||||
align="center"
|
||||
label="拟报专业1">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.wishMajorOne, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="wishMajorTwo"
|
||||
header-align="center"
|
||||
align="center"
|
||||
width="100px"
|
||||
label="拟报专业2">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.wishMajorTwo, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="gender" header-align="center" align="center" label="性别">
|
||||
<template #default="scope">
|
||||
<GenderTag :sex="scope.row.gender" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="degreeOfEducation" header-align="center" align="center" label="学历">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(eduList, scope.row.degreeOfEducation, { key: 'value', value: 'label' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="wishMajorOne" header-align="center" width="100px" align="center" label="拟报专业1">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.wishMajorOne, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="wishMajorTwo" header-align="center" align="center" width="100px" label="拟报专业2">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.wishMajorTwo, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
prop="wishMajorThree"
|
||||
header-align="center"
|
||||
align="center"
|
||||
width="100px"
|
||||
label="拟报专业3">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.wishMajorThree, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="oldConfirmedMajor"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="原录取专业">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.oldConfirmedMajor, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="confirmedMajor"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="模拟录取专业">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.confirmedMajor, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="isOut"
|
||||
header-align="center"
|
||||
align="center"
|
||||
width="120"
|
||||
label="来源">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.isOut==0">学校</span>
|
||||
<span v-if="scope.row.isOut==1">市平台</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
header-align="center"
|
||||
align="center"
|
||||
min-width="200"
|
||||
label="操作">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_recruitImitateAdjustBatch_edit')" type="text" size="small" :icon="Edit" @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitImitateAdjustBatch_del')" type="danger" link size="small" :icon="Delete" @click="deleteHandle(scope.row.id)">删除</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<el-table-column prop="wishMajorThree" header-align="center" align="center" width="100px" label="拟报专业3">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.wishMajorThree, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="oldConfirmedMajor" header-align="center" align="center" label="原录取专业">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.oldConfirmedMajor, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="confirmedMajor" header-align="center" align="center" label="模拟录取专业">
|
||||
<template #default="scope">
|
||||
{{ getLabelValueByProps(planMajorList, scope.row.confirmedMajor, { key: 'majorCode', value: 'majorName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isOut" header-align="center" align="center" width="120" label="来源">
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.isOut == 0">学校</span>
|
||||
<span v-if="scope.row.isOut == 1">市平台</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column header-align="center" align="center" min-width="200" label="操作">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_edit')"
|
||||
type="text"
|
||||
size="small"
|
||||
:icon="Edit"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>修改</el-button
|
||||
>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitImitateAdjustBatch_del')"
|
||||
type="danger"
|
||||
link
|
||||
size="small"
|
||||
:icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>删除</el-button
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<add-m-n-stu ref="addMnStuRef" @refreshDataList="getDataList"></add-m-n-stu>
|
||||
</el-dialog>
|
||||
<add-m-n-stu ref="addMnStuRef" @refreshDataList="getDataList"></add-m-n-stu>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { Edit, Delete } from '@element-plus/icons-vue'
|
||||
import { getMNStuList, delMNObj } from '/@/api/recruit/recruitImitateAdjustBatch'
|
||||
import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan'
|
||||
import { getDicts } from '/@/api/admin/dict'
|
||||
import { getLabelValueByProps } from '/@/utils/dictLabel'
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { Edit, Delete } from '@element-plus/icons-vue';
|
||||
import { getMNStuList, delMNObj } from '/@/api/recruit/recruitImitateAdjustBatch';
|
||||
import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
import { getLabelValueByProps } from '/@/utils/dictLabel';
|
||||
|
||||
const AddMNStu = defineAsyncComponent(() => import('./addMNStu.vue'))
|
||||
const GenderTag = defineAsyncComponent(() => import('@/components/GenderTag/index.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const AddMNStu = defineAsyncComponent(() => import('./addMNStu.vue'));
|
||||
const GenderTag = defineAsyncComponent(() => import('@/components/GenderTag/index.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 组件引用
|
||||
const addMnStuRef = ref()
|
||||
const addMnStuRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const dataListLoading = ref(false)
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const dataListLoading = ref(false);
|
||||
|
||||
const dataForm = reactive({
|
||||
batchNo: "",
|
||||
groupId: ""
|
||||
})
|
||||
batchNo: '',
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
const dataList = ref<any[]>([])
|
||||
const eduList = ref<any[]>([])
|
||||
const planMajorList = ref<any[]>([])
|
||||
const dataList = ref<any[]>([]);
|
||||
const eduList = ref<any[]>([]);
|
||||
const planMajorList = ref<any[]>([]);
|
||||
|
||||
// 初始化方法
|
||||
const init = (batchNo: string, groupId: string) => {
|
||||
dataForm.batchNo = batchNo
|
||||
dataForm.groupId = groupId
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
initData()
|
||||
}
|
||||
dataForm.batchNo = batchNo;
|
||||
dataForm.groupId = groupId;
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
initData();
|
||||
};
|
||||
|
||||
// 新增 / 修改
|
||||
const addOrUpdateHandle = (id?: string) => {
|
||||
nextTick(() => {
|
||||
addMnStuRef.value?.init(id || null, dataForm.groupId, dataForm.batchNo)
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
addMnStuRef.value?.init(id || null, dataForm.groupId, dataForm.batchNo);
|
||||
});
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delMNObj(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delMNObj(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = () => {
|
||||
dataList.value = []
|
||||
dataListLoading.value = true
|
||||
emit('refreshDataList')
|
||||
getMNStuList(dataForm).then((response: any) => {
|
||||
dataList.value = response.data
|
||||
dataListLoading.value = false
|
||||
}).catch(() => {
|
||||
dataListLoading.value = false
|
||||
})
|
||||
}
|
||||
dataList.value = [];
|
||||
dataListLoading.value = true;
|
||||
emit('refreshDataList');
|
||||
getMNStuList(dataForm)
|
||||
.then((response: any) => {
|
||||
dataList.value = response.data;
|
||||
dataListLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
dataListLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
eduList.value = []
|
||||
getDicts('finance_student_source').then((res: any) => {
|
||||
eduList.value = res.data
|
||||
})
|
||||
planMajorList.value = []
|
||||
planMajor({ groupId: dataForm.groupId }).then((data: any) => {
|
||||
planMajorList.value = data.data
|
||||
getDataList()
|
||||
})
|
||||
}
|
||||
eduList.value = [];
|
||||
getDicts('finance_student_source').then((res: any) => {
|
||||
eduList.value = res.data;
|
||||
});
|
||||
planMajorList.value = [];
|
||||
planMajor({ groupId: dataForm.groupId }).then((data: any) => {
|
||||
planMajorList.value = data.data;
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
</style>
|
||||
<style scoped></style>
|
||||
|
||||
@@ -1,77 +1,56 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'recruit_recruitMajorCategory_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right"
|
||||
@queryTable="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</el-row>
|
||||
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'recruit_recruitMajorCategory_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right;"
|
||||
@queryTable="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</el-row>
|
||||
<!-- 数据表格区域 -->
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="oneCategory" label="一级类目" show-overflow-tooltip />
|
||||
<el-table-column prop="twoCategory" label="二级类目" show-overflow-tooltip />
|
||||
<el-table-column prop="oneTitle" label="一级类目名称" show-overflow-tooltip />
|
||||
<el-table-column prop="twoTitle" label="二级类目" show-overflow-tooltip />
|
||||
</el-table>
|
||||
|
||||
<!-- 数据表格区域 -->
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column
|
||||
prop="oneCategory"
|
||||
label="一级类目"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="twoCategory"
|
||||
label="二级类目"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="oneTitle"
|
||||
label="一级类目名称"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<el-table-column
|
||||
prop="twoTitle"
|
||||
label="二级类目"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||
</div>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination
|
||||
@size-change="sizeChangeHandle"
|
||||
@current-change="currentChangeHandle"
|
||||
v-bind="state.pagination"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<!-- 导入excel弹窗 (需要在 upms-biz/resources/file 下维护模板) -->
|
||||
<upload-excel
|
||||
ref="excelUploadRef"
|
||||
title="导入"
|
||||
url="/recruit/recruitMajorCategory/import"
|
||||
temp-url="/admin/sys-file/local/file/recruitMajorCategory.xlsx"
|
||||
@refreshDataList="getDataList"
|
||||
/>
|
||||
</div>
|
||||
<!-- 导入excel弹窗 (需要在 upms-biz/resources/file 下维护模板) -->
|
||||
<upload-excel
|
||||
ref="excelUploadRef"
|
||||
title="导入"
|
||||
url="/recruit/recruitMajorCategory/import"
|
||||
temp-url="/admin/sys-file/local/file/recruitMajorCategory.xlsx"
|
||||
@refreshDataList="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="systemRecruitMajorCategory">
|
||||
// ========== 导入声明 ==========
|
||||
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||
import { fetchList } from "/@/api/recruit/recruitMajorCategory";
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { fetchList } from '/@/api/recruit/recruitMajorCategory';
|
||||
|
||||
// ========== 组件声明 ==========
|
||||
// 异步加载表单弹窗组件
|
||||
@@ -79,42 +58,35 @@ import { fetchList } from "/@/api/recruit/recruitMajorCategory";
|
||||
// ========== 字典数据 ==========
|
||||
|
||||
// ========== 组件引用 ==========
|
||||
const excelUploadRef = ref(); // Excel上传弹窗引用
|
||||
const queryRef = ref(); // 查询表单引用
|
||||
const excelUploadRef = ref(); // Excel上传弹窗引用
|
||||
const queryRef = ref(); // 查询表单引用
|
||||
|
||||
// ========== 响应式数据 ==========
|
||||
const showSearch = ref(true); // 是否显示搜索区域
|
||||
const selectObjs = ref([]) as any; // 表格多选数据
|
||||
const multiple = ref(true); // 是否多选
|
||||
const showSearch = ref(true); // 是否显示搜索区域
|
||||
const selectObjs = ref([]) as any; // 表格多选数据
|
||||
const multiple = ref(true); // 是否多选
|
||||
|
||||
// ========== 表格状态 ==========
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {}, // 查询参数
|
||||
pageList: fetchList // 分页查询方法
|
||||
queryForm: {}, // 查询参数
|
||||
pageList: fetchList, // 分页查询方法
|
||||
});
|
||||
|
||||
// ========== Hook引用 ==========
|
||||
// 表格相关Hook
|
||||
const {
|
||||
getDataList,
|
||||
currentChangeHandle,
|
||||
sizeChangeHandle,
|
||||
sortChangeHandle,
|
||||
downBlobFile,
|
||||
tableStyle
|
||||
} = useTable(state);
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state);
|
||||
|
||||
// ========== 方法定义 ==========
|
||||
/**
|
||||
* 重置查询条件
|
||||
*/
|
||||
const resetQuery = () => {
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields();
|
||||
// 清空多选
|
||||
selectObjs.value = [];
|
||||
// 重新查询
|
||||
getDataList();
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields();
|
||||
// 清空多选
|
||||
selectObjs.value = [];
|
||||
// 重新查询
|
||||
getDataList();
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -122,8 +94,7 @@ const resetQuery = () => {
|
||||
* @param objs 选中的数据行
|
||||
*/
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id);
|
||||
multiple.value = !objs.length;
|
||||
selectObjs.value = objs.map(({ id }) => id);
|
||||
multiple.value = !objs.length;
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
@@ -1,79 +1,70 @@
|
||||
<template>
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible"
|
||||
:close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input v-model="form.title" placeholder="请输入标题"/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="文件地址" prop="fileUrl">
|
||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
|
||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
||||
<el-row :gutter="24">
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="标题" prop="title">
|
||||
<el-input v-model="form.title" placeholder="请输入标题" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="24" class="mb20">
|
||||
<el-form-item label="文件地址" prop="fileUrl">
|
||||
<el-upload :headers="headers" :limit="1" :action="uploadUrl" :file-list="fileList" :on-success="handleUploadSuccess" :accept="'.pdf'">
|
||||
<el-button size="small" type="primary">点击上传</el-button>
|
||||
<template #tip>
|
||||
<div style="margin-top: 8px">
|
||||
<el-tag>仅支持pdf后缀的文件上传</el-tag>
|
||||
</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
|
||||
<el-upload
|
||||
:headers="headers"
|
||||
:limit="1"
|
||||
:action="uploadUrl"
|
||||
:file-list="fileList"
|
||||
:on-success="handleUploadSuccess"
|
||||
:accept="'.pdf'"
|
||||
>
|
||||
<el-button size="small" type="primary">点击上传</el-button>
|
||||
<template #tip>
|
||||
<div style="margin-top: 8px;">
|
||||
<el-tag>仅支持pdf后缀的文件上传</el-tag>
|
||||
</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
<!-- <el-upload-->
|
||||
<!-- :action="uploadUrl"-->
|
||||
<!-- class="avatar-uploader"-->
|
||||
<!-- name="file"-->
|
||||
<!-- :headers="headers"-->
|
||||
<!-- :data="uploadData"-->
|
||||
<!-- :file-list="fileList"-->
|
||||
<!-- :before-upload="beforeUpload"-->
|
||||
<!-- :http-request="httpRequest"-->
|
||||
<!-- :limit="1"-->
|
||||
<!-- :accept="['.jpg,.jpeg,.png,.pdf']"-->
|
||||
<!-- :on-success="handleUploadSuccess">-->
|
||||
<!-- <el-button size="small" type="primary">点击上传</el-button>-->
|
||||
<!-- <template #tip>-->
|
||||
<!-- <div style="margin-top: 8px;">-->
|
||||
<!-- <el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>-->
|
||||
<!-- </div>-->
|
||||
<!-- </template>-->
|
||||
<!-- </el-upload>-->
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- <el-upload-->
|
||||
<!-- :action="uploadUrl"-->
|
||||
<!-- class="avatar-uploader"-->
|
||||
<!-- name="file"-->
|
||||
<!-- :headers="headers"-->
|
||||
<!-- :data="uploadData"-->
|
||||
<!-- :file-list="fileList"-->
|
||||
<!-- :before-upload="beforeUpload"-->
|
||||
<!-- :http-request="httpRequest"-->
|
||||
<!-- :limit="1"-->
|
||||
<!-- :accept="['.jpg,.jpeg,.png,.pdf']"-->
|
||||
<!-- :on-success="handleUploadSuccess">-->
|
||||
<!-- <el-button size="small" type="primary">点击上传</el-button>-->
|
||||
<!-- <template #tip>-->
|
||||
<!-- <div style="margin-top: 8px;">-->
|
||||
<!-- <el-tag>仅支持jpg,jpeg,png,pdf后缀的文件上传</el-tag>-->
|
||||
<!-- </div>-->
|
||||
<!-- </template>-->
|
||||
<!-- </el-upload>-->
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<!-- <el-col :span="12" class="mb20">-->
|
||||
<!-- <el-form-item label="1 资助政策文件" prop="type">-->
|
||||
<!-- <el-input v-model="form.type" placeholder="请输入1 资助政策文件"/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确 认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<!-- <el-col :span="12" class="mb20">-->
|
||||
<!-- <el-form-item label="1 资助政策文件" prop="type">-->
|
||||
<!-- <el-input v-model="form.type" placeholder="请输入1 资助政策文件"/>-->
|
||||
<!-- </el-form-item>-->
|
||||
<!-- </el-col>-->
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button @click="visible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确 认</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="RecruitPolicyFileDialog">
|
||||
// ========== 1. 导入语句 ==========
|
||||
import { useMessage } from "/@/hooks/message";
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { getObj, addObj, putObj } from '/@/api/recruit/recruitPolicyFile';
|
||||
import {Plus} from "@element-plus/icons-vue";
|
||||
import {reactive, ref} from "vue";
|
||||
import axios from "axios";
|
||||
import { Session } from '/@/utils/storage'
|
||||
const fileList = ref<any[]>([])
|
||||
import { Plus } from '@element-plus/icons-vue';
|
||||
import { reactive, ref } from 'vue';
|
||||
import axios from 'axios';
|
||||
import { Session } from '/@/utils/storage';
|
||||
const fileList = ref<any[]>([]);
|
||||
|
||||
// ========== 2. 组件定义 ==========
|
||||
// 定义组件事件
|
||||
@@ -84,122 +75,118 @@ const emit = defineEmits(['refresh']);
|
||||
const dataFormRef = ref(); // 表单引用
|
||||
const visible = ref(false); // 弹窗显示状态
|
||||
const loading = ref(false); // 加载状态
|
||||
const baseUrl = import.meta.env.VITE_API_URL
|
||||
const baseUrl = import.meta.env.VITE_API_URL;
|
||||
|
||||
// 表单数据对象
|
||||
const form = reactive({
|
||||
id: '', // 主键
|
||||
fileUrl: '', // 文件地址
|
||||
title: '', // 标题
|
||||
type: '', // 1 资助政策文件
|
||||
id: '', // 主键
|
||||
fileUrl: '', // 文件地址
|
||||
title: '', // 标题
|
||||
type: '', // 1 资助政策文件
|
||||
});
|
||||
|
||||
const uploadUrl = baseUrl + '/recruit/file/uploadPdf'
|
||||
const uploadUrl = baseUrl + '/recruit/file/uploadPdf';
|
||||
// 请求头
|
||||
const headers = computed(() => {
|
||||
return {
|
||||
"Authorization": 'Bearer ' + Session.getToken()
|
||||
}
|
||||
})
|
||||
const uploadData = reactive({})
|
||||
const fileReader = ref<FileReader | null>(null)
|
||||
|
||||
|
||||
return {
|
||||
Authorization: 'Bearer ' + Session.getToken(),
|
||||
};
|
||||
});
|
||||
const uploadData = reactive({});
|
||||
const fileReader = ref<FileReader | null>(null);
|
||||
|
||||
// 上传前验证
|
||||
const beforeUpload = (file: File) => {
|
||||
const isLt5M = file.size < 10 * 1024 * 1024
|
||||
if (!isLt5M) {
|
||||
useMessage().error('文件大小不能超过10M')
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
const isLt5M = file.size < 10 * 1024 * 1024;
|
||||
if (!isLt5M) {
|
||||
useMessage().error('文件大小不能超过10M');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
// 通用上传成功回调(单文件 - avatar模式)
|
||||
const handleUploadSuccess = (res:any) => {
|
||||
const fileUrl = res.fileUrl
|
||||
form['fileUrl'] = fileUrl
|
||||
}
|
||||
const handleUploadSuccess = (res: any) => {
|
||||
const fileUrl = res.fileUrl;
|
||||
form['fileUrl'] = fileUrl;
|
||||
};
|
||||
// ========== 4. 字典数据处理 ==========
|
||||
|
||||
// ========== 5. 表单校验规则 ==========
|
||||
const dataRules = ref({
|
||||
title: [
|
||||
{ required: true, message: '请输入标题', trigger: 'blur' },
|
||||
{ min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' },
|
||||
],
|
||||
fileUrl: [
|
||||
{ required: true, message: '请上传文件', trigger: 'blur' },
|
||||
]
|
||||
title: [
|
||||
{ required: true, message: '请输入标题', trigger: 'blur' },
|
||||
{ min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' },
|
||||
],
|
||||
fileUrl: [{ required: true, message: '请上传文件', trigger: 'blur' }],
|
||||
});
|
||||
|
||||
// ========== 6. 方法定义 ==========
|
||||
// 获取详情数据
|
||||
const getRecruitPolicyFileData = async (id: string) => {
|
||||
try {
|
||||
loading.value = true;
|
||||
const { data } = await getObj({ id: id });
|
||||
// 直接将第一条数据赋值给表单
|
||||
Object.assign(form, data[0]);
|
||||
} catch (error) {
|
||||
useMessage().error('获取数据失败');
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
try {
|
||||
loading.value = true;
|
||||
const { data } = await getObj({ id: id });
|
||||
// 直接将第一条数据赋值给表单
|
||||
Object.assign(form, data[0]);
|
||||
} catch (error) {
|
||||
useMessage().error('获取数据失败');
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 打开弹窗方法
|
||||
const openDialog = (id: string) => {
|
||||
visible.value = true;
|
||||
form.id = '';
|
||||
visible.value = true;
|
||||
form.id = '';
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
});
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
});
|
||||
|
||||
// 获取RecruitPolicyFile信息
|
||||
if (id) {
|
||||
form.id = id;
|
||||
getRecruitPolicyFileData(id);
|
||||
}
|
||||
// 获取RecruitPolicyFile信息
|
||||
if (id) {
|
||||
form.id = id;
|
||||
getRecruitPolicyFileData(id);
|
||||
}
|
||||
};
|
||||
|
||||
// 提交表单方法
|
||||
const onSubmit = async () => {
|
||||
loading.value = true; // 防止重复提交
|
||||
|
||||
// 表单校验
|
||||
const valid = await dataFormRef.value.validate().catch(() => {});
|
||||
if (!valid) {
|
||||
loading.value = false;
|
||||
return false;
|
||||
}
|
||||
loading.value = true; // 防止重复提交
|
||||
|
||||
try {
|
||||
// 根据是否有ID判断是新增还是修改
|
||||
form.id ? await putObj(form) : await addObj(form);
|
||||
useMessage().success(form.id ? '修改成功' : '添加成功');
|
||||
visible.value = false;
|
||||
emit('refresh'); // 通知父组件刷新列表
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
// 表单校验
|
||||
const valid = await dataFormRef.value.validate().catch(() => {});
|
||||
if (!valid) {
|
||||
loading.value = false;
|
||||
return false;
|
||||
}
|
||||
|
||||
try {
|
||||
// 根据是否有ID判断是新增还是修改
|
||||
form.id ? await putObj(form) : await addObj(form);
|
||||
useMessage().success(form.id ? '修改成功' : '添加成功');
|
||||
visible.value = false;
|
||||
emit('refresh'); // 通知父组件刷新列表
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
};
|
||||
// 初始化 FileReader
|
||||
onMounted(() => {
|
||||
if (!window.FileReader) {
|
||||
useMessage().error('您的浏览器不支持 FileReader API!')
|
||||
} else {
|
||||
fileReader.value = new FileReader()
|
||||
}
|
||||
})
|
||||
if (!window.FileReader) {
|
||||
useMessage().error('您的浏览器不支持 FileReader API!');
|
||||
} else {
|
||||
fileReader.value = new FileReader();
|
||||
}
|
||||
});
|
||||
// ========== 7. 对外暴露 ==========
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
openDialog
|
||||
openDialog,
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -230,14 +217,14 @@ defineExpose({
|
||||
//}
|
||||
|
||||
.avatar-wrapper {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
.avatar {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
cursor: pointer;
|
||||
}
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
.avatar {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
</style>
|
||||
|
||||
@@ -1,193 +1,144 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<el-button icon="folder-add" type="primary" class="ml10" @click="formDialogRef.openDialog()" v-auth="'recruit_recruitPolicyFile_add'">
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
plain
|
||||
:disabled="multiple"
|
||||
icon="Delete"
|
||||
type="primary"
|
||||
v-auth="'recruit_recruitPolicyFile_del'"
|
||||
@click="handleDelete(selectObjs)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'recruit_recruitPolicyFile_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right"
|
||||
@queryTable="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</el-row>
|
||||
|
||||
<!-- 操作按钮区域 -->
|
||||
<el-row>
|
||||
<div class="mb8" style="width: 100%">
|
||||
<el-button
|
||||
icon="folder-add"
|
||||
type="primary"
|
||||
class="ml10"
|
||||
@click="formDialogRef.openDialog()"
|
||||
v-auth="'recruit_recruitPolicyFile_add'"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
plain
|
||||
:disabled="multiple"
|
||||
icon="Delete"
|
||||
type="primary"
|
||||
v-auth="'recruit_recruitPolicyFile_del'"
|
||||
@click="handleDelete(selectObjs)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<right-toolbar
|
||||
v-model:showSearch="showSearch"
|
||||
:export="'recruit_recruitPolicyFile_export'"
|
||||
@exportExcel="exportExcel"
|
||||
class="ml10 mr20"
|
||||
style="float: right;"
|
||||
@queryTable="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</el-row>
|
||||
<!-- 数据表格区域 -->
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column prop="fileUrl" label="文件" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<el-button type="primary" link icon="Document" @click="handlePreview(scope.row.fileUrl)">查看 </el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<!-- 数据表格区域 -->
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
@selection-change="selectionChangHandle"
|
||||
@sort-change="sortChangeHandle"
|
||||
>
|
||||
<el-table-column type="selection" width="40" align="center" />
|
||||
<el-table-column type="index" label="#" width="40" />
|
||||
<el-table-column
|
||||
prop="fileUrl"
|
||||
label="文件"
|
||||
show-overflow-tooltip
|
||||
>
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Document"
|
||||
@click="handlePreview(scope.row.fileUrl)"
|
||||
>查看
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="title" label="标题" show-overflow-tooltip />
|
||||
<!-- <el-table-column -->
|
||||
<!-- prop="type" -->
|
||||
<!-- label="1 资助政策文件" -->
|
||||
<!-- show-overflow-tooltip-->
|
||||
<!-- />-->
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<el-button icon="edit-pen" text type="primary" v-auth="'recruit_recruitPolicyFile_edit'" @click="formDialogRef.openDialog(scope.row.id)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button icon="delete" text type="primary" v-auth="'recruit_recruitPolicyFile_del'" @click="handleDelete([scope.row.id])">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<el-table-column
|
||||
prop="title"
|
||||
label="标题"
|
||||
show-overflow-tooltip
|
||||
/>
|
||||
<!-- <el-table-column -->
|
||||
<!-- prop="type" -->
|
||||
<!-- label="1 资助政策文件" -->
|
||||
<!-- show-overflow-tooltip-->
|
||||
<!-- />-->
|
||||
<el-table-column label="操作" width="150">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
icon="edit-pen"
|
||||
text
|
||||
type="primary"
|
||||
v-auth="'recruit_recruitPolicyFile_edit'"
|
||||
@click="formDialogRef.openDialog(scope.row.id)"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
icon="delete"
|
||||
text
|
||||
type="primary"
|
||||
v-auth="'recruit_recruitPolicyFile_del'"
|
||||
@click="handleDelete([scope.row.id])"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页组件 -->
|
||||
<pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" v-bind="state.pagination" />
|
||||
</div>
|
||||
|
||||
<!-- 分页组件 -->
|
||||
<pagination
|
||||
@size-change="sizeChangeHandle"
|
||||
@current-change="currentChangeHandle"
|
||||
v-bind="state.pagination"
|
||||
/>
|
||||
</div>
|
||||
<!-- 编辑、新增弹窗 -->
|
||||
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||
|
||||
<!-- 编辑、新增弹窗 -->
|
||||
<form-dialog ref="formDialogRef" @refresh="getDataList(false)" />
|
||||
<!-- 导入excel弹窗 (需要在 upms-biz/resources/file 下维护模板) -->
|
||||
<upload-excel
|
||||
ref="excelUploadRef"
|
||||
title="导入"
|
||||
url="/recruit/recruitPolicyFile/import"
|
||||
temp-url="/admin/sys-file/local/file/recruitPolicyFile.xlsx"
|
||||
@refreshDataList="getDataList"
|
||||
/>
|
||||
|
||||
<!-- 导入excel弹窗 (需要在 upms-biz/resources/file 下维护模板) -->
|
||||
<upload-excel
|
||||
ref="excelUploadRef"
|
||||
title="导入"
|
||||
url="/recruit/recruitPolicyFile/import"
|
||||
temp-url="/admin/sys-file/local/file/recruitPolicyFile.xlsx"
|
||||
@refreshDataList="getDataList"
|
||||
/>
|
||||
|
||||
<preview-file v-for="src in imgUrl" :key="src.title" :authSrc="src.url" dialog-title="职称材料" />
|
||||
|
||||
</div>
|
||||
<preview-file v-for="src in imgUrl" :key="src.title" :authSrc="src.url" dialog-title="职称材料" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="systemRecruitPolicyFile">
|
||||
// ========== 导入声明 ==========
|
||||
import { BasicTableProps, useTable } from "/@/hooks/table";
|
||||
import { fetchList, delObjs } from "/@/api/recruit/recruitPolicyFile";
|
||||
import { useMessage, useMessageBox } from "/@/hooks/message";
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { fetchList, delObjs } from '/@/api/recruit/recruitPolicyFile';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import {defineAsyncComponent, ref} from "vue";
|
||||
import { defineAsyncComponent, ref } from 'vue';
|
||||
const previewFile = defineAsyncComponent(() => import('/@/components/tools/preview-file.vue'));
|
||||
|
||||
// ========== 组件声明 ==========
|
||||
// 异步加载表单弹窗组件
|
||||
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
|
||||
const baseUrl = import.meta.env.VITE_API_URL
|
||||
const baseUrl = import.meta.env.VITE_API_URL;
|
||||
|
||||
// ========== 字典数据 ==========
|
||||
|
||||
// ========== 组件引用 ==========
|
||||
const formDialogRef = ref(); // 表单弹窗引用
|
||||
const excelUploadRef = ref(); // Excel上传弹窗引用
|
||||
const queryRef = ref(); // 查询表单引用
|
||||
const formDialogRef = ref(); // 表单弹窗引用
|
||||
const excelUploadRef = ref(); // Excel上传弹窗引用
|
||||
const queryRef = ref(); // 查询表单引用
|
||||
|
||||
// ========== 响应式数据 ==========
|
||||
const showSearch = ref(true); // 是否显示搜索区域
|
||||
const selectObjs = ref([]) as any; // 表格多选数据
|
||||
const multiple = ref(true); // 是否多选
|
||||
const showSearch = ref(true); // 是否显示搜索区域
|
||||
const selectObjs = ref([]) as any; // 表格多选数据
|
||||
const multiple = ref(true); // 是否多选
|
||||
|
||||
// ========== 表格状态 ==========
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {}, // 查询参数
|
||||
pageList: fetchList // 分页查询方法
|
||||
queryForm: {}, // 查询参数
|
||||
pageList: fetchList, // 分页查询方法
|
||||
});
|
||||
const imgUrl = ref<Array<{ title: string; url: string }>>([]);
|
||||
|
||||
// ========== Hook引用 ==========
|
||||
// 表格相关Hook
|
||||
const {
|
||||
getDataList,
|
||||
currentChangeHandle,
|
||||
sizeChangeHandle,
|
||||
sortChangeHandle,
|
||||
downBlobFile,
|
||||
tableStyle
|
||||
} = useTable(state);
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, sortChangeHandle, downBlobFile, tableStyle } = useTable(state);
|
||||
|
||||
// ========== 方法定义 ==========
|
||||
/**
|
||||
* 重置查询条件
|
||||
*/
|
||||
const resetQuery = () => {
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields();
|
||||
// 清空多选
|
||||
selectObjs.value = [];
|
||||
// 重新查询
|
||||
getDataList();
|
||||
// 清空搜索条件
|
||||
queryRef.value?.resetFields();
|
||||
// 清空多选
|
||||
selectObjs.value = [];
|
||||
// 重新查询
|
||||
getDataList();
|
||||
};
|
||||
|
||||
/**
|
||||
* 导出Excel文件
|
||||
*/
|
||||
const exportExcel = () => {
|
||||
downBlobFile(
|
||||
'/recruit/recruitPolicyFile/export',
|
||||
Object.assign(state.queryForm, { ids: selectObjs }),
|
||||
'recruitPolicyFile.xlsx'
|
||||
);
|
||||
downBlobFile('/recruit/recruitPolicyFile/export', Object.assign(state.queryForm, { ids: selectObjs }), 'recruitPolicyFile.xlsx');
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -195,19 +146,19 @@ const exportExcel = () => {
|
||||
* @param objs 选中的数据行
|
||||
*/
|
||||
const selectionChangHandle = (objs: { id: string }[]) => {
|
||||
selectObjs.value = objs.map(({ id }) => id);
|
||||
multiple.value = !objs.length;
|
||||
selectObjs.value = objs.map(({ id }) => id);
|
||||
multiple.value = !objs.length;
|
||||
};
|
||||
|
||||
// 预览材料
|
||||
const handlePreview = (url: string) => {
|
||||
imgUrl.value = [];
|
||||
nextTick(() => {
|
||||
imgUrl.value.push({
|
||||
title: '',
|
||||
url: baseUrl+url,
|
||||
});
|
||||
});
|
||||
imgUrl.value = [];
|
||||
nextTick(() => {
|
||||
imgUrl.value.push({
|
||||
title: '',
|
||||
url: baseUrl + url,
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -215,18 +166,18 @@ const handlePreview = (url: string) => {
|
||||
* @param ids 要删除的数据ID数组
|
||||
*/
|
||||
const handleDelete = async (ids: string[]) => {
|
||||
try {
|
||||
await useMessageBox().confirm('此操作将永久删除');
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await useMessageBox().confirm('此操作将永久删除');
|
||||
} catch {
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await delObjs(ids);
|
||||
getDataList();
|
||||
useMessage().success('删除成功');
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
}
|
||||
try {
|
||||
await delObjs(ids);
|
||||
getDataList();
|
||||
useMessage().success('删除成功');
|
||||
} catch (err: any) {
|
||||
useMessage().error(err.msg);
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -16,114 +16,111 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<el-dialog v-model="dialogVisible" title="保存审核人员" width="600px" append-to-body @close="handleClose">
|
||||
<el-form :model="{ belongTeacherNos }" label-width="100px">
|
||||
<el-form-item label="选择教师:">
|
||||
<el-select
|
||||
v-model="belongTeacherNos"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
reserve-keyword
|
||||
placeholder="请选择或输入教师姓名"
|
||||
:remote-method="remoteTeacherByQuery"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in teacherList"
|
||||
:key="item.teacherNo"
|
||||
:label="item.realName"
|
||||
:value="item.teacherNo"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="dialogVisible" title="保存审核人员" width="600px" append-to-body @close="handleClose">
|
||||
<el-form :model="{ belongTeacherNos }" label-width="100px">
|
||||
<el-form-item label="选择教师:">
|
||||
<el-select
|
||||
v-model="belongTeacherNos"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
reserve-keyword
|
||||
placeholder="请选择或输入教师姓名"
|
||||
:remote-method="remoteTeacherByQuery"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option v-for="item in teacherList" :key="item.teacherNo" :label="item.realName" :value="item.teacherNo" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="AddExamPeopleForm">
|
||||
import { ref, watch } from 'vue'
|
||||
import {getTeacherInfoCommon} from '/@/api/professional/professionaluser/teacherbase'
|
||||
import { ref, watch } from 'vue';
|
||||
import { getTeacherInfoCommon } from '/@/api/professional/professionaluser/teacherbase';
|
||||
|
||||
// Props
|
||||
const props = defineProps<{
|
||||
visible: boolean
|
||||
timeRange: string[]
|
||||
}>()
|
||||
visible: boolean;
|
||||
timeRange: string[];
|
||||
}>();
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:visible', value: boolean): void
|
||||
(e: 'save', data: { teacherNo: string; startTime: string; endTime: string }): void
|
||||
}>()
|
||||
(e: 'update:visible', value: boolean): void;
|
||||
(e: 'save', data: { teacherNo: string; startTime: string; endTime: string }): void;
|
||||
}>();
|
||||
|
||||
// 弹窗显示状态
|
||||
const dialogVisible = ref(false)
|
||||
const belongTeacherNos = ref('')
|
||||
const teacherList = ref<any[]>([])
|
||||
const dialogVisible = ref(false);
|
||||
const belongTeacherNos = ref('');
|
||||
const teacherList = ref<any[]>([]);
|
||||
|
||||
// 监听 visible 变化
|
||||
watch(() => props.visible, (newVal) => {
|
||||
dialogVisible.value = newVal
|
||||
if (newVal) {
|
||||
belongTeacherNos.value = ''
|
||||
teacherList.value = []
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => props.visible,
|
||||
(newVal) => {
|
||||
dialogVisible.value = newVal;
|
||||
if (newVal) {
|
||||
belongTeacherNos.value = '';
|
||||
teacherList.value = [];
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 监听 dialogVisible 变化,同步到父组件
|
||||
watch(dialogVisible, (newVal) => {
|
||||
emit('update:visible', newVal)
|
||||
})
|
||||
emit('update:visible', newVal);
|
||||
});
|
||||
|
||||
// 检索教师
|
||||
const remoteTeacherByQuery = (query: string) => {
|
||||
teacherList.value = []
|
||||
if (query !== '') {
|
||||
setTimeout(() => {
|
||||
getTeacherInfoCommon({searchKeywords:query,tied:"0"}).then(response => {
|
||||
teacherList.value = response.data
|
||||
})
|
||||
}, 200)
|
||||
}
|
||||
}
|
||||
teacherList.value = [];
|
||||
if (query !== '') {
|
||||
setTimeout(() => {
|
||||
getTeacherInfoCommon({ searchKeywords: query, tied: '0' }).then((response) => {
|
||||
teacherList.value = response.data;
|
||||
});
|
||||
}, 200);
|
||||
}
|
||||
};
|
||||
|
||||
// 关闭窗口
|
||||
const handleClose = () => {
|
||||
belongTeacherNos.value = ''
|
||||
dialogVisible.value = false
|
||||
}
|
||||
belongTeacherNos.value = '';
|
||||
dialogVisible.value = false;
|
||||
};
|
||||
|
||||
// 保存
|
||||
const handleSave = () => {
|
||||
if (props.timeRange.length === 0) {
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: '',
|
||||
endTime: ''
|
||||
})
|
||||
return
|
||||
}
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: props.timeRange[0],
|
||||
endTime: props.timeRange[1]
|
||||
})
|
||||
handleClose()
|
||||
}
|
||||
if (props.timeRange.length === 0) {
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
});
|
||||
return;
|
||||
}
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: props.timeRange[0],
|
||||
endTime: props.timeRange[1],
|
||||
});
|
||||
handleClose();
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dialog-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -16,210 +16,180 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
title="招生审核人员管理"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="800"
|
||||
:append-to-body="true"
|
||||
destroy-on-close
|
||||
>
|
||||
<div class="dialog-content">
|
||||
<!-- 时间选择器和操作按钮 -->
|
||||
<el-form :inline="true" :model="queryForm">
|
||||
<el-form-item label="审核时间范围:">
|
||||
<el-time-picker
|
||||
is-range
|
||||
v-model="form.time1"
|
||||
format="HH:mm:ss"
|
||||
value-format="HH:mm:ss"
|
||||
range-separator="至"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
placeholder="选择时间范围"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="mb15" v-if="hasAuth('recruit_recruitexampeople_add')">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="handleAdd"
|
||||
>
|
||||
新 增
|
||||
</el-button>
|
||||
</div>
|
||||
<el-dialog title="招生审核人员管理" :close-on-click-modal="false" v-model="visible" width="800" :append-to-body="true" destroy-on-close>
|
||||
<div class="dialog-content">
|
||||
<!-- 时间选择器和操作按钮 -->
|
||||
<el-form :inline="true" :model="queryForm">
|
||||
<el-form-item label="审核时间范围:">
|
||||
<el-time-picker
|
||||
is-range
|
||||
v-model="form.time1"
|
||||
format="HH:mm:ss"
|
||||
value-format="HH:mm:ss"
|
||||
range-separator="至"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
placeholder="选择时间范围"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="mb15" v-if="hasAuth('recruit_recruitexampeople_add')">
|
||||
<el-button type="primary" icon="FolderAdd" @click="handleAdd"> 新 增 </el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="table-wrapper">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList || []"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
empty-text="暂无数据"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column label="工号" align="center" prop="teacherNo" show-overflow-tooltip>
|
||||
</el-table-column>
|
||||
<el-table-column label="姓名" align="center" prop="teacherName" show-overflow-tooltip>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" width="150px" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitexampeople_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="table-wrapper">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList || []"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
empty-text="暂无数据"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column label="工号" align="center" prop="teacherNo" show-overflow-tooltip> </el-table-column>
|
||||
<el-table-column label="姓名" align="center" prop="teacherName" show-overflow-tooltip> </el-table-column>
|
||||
<el-table-column label="操作" align="center" width="150px" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_recruitexampeople_del')" type="danger" link icon="Delete" @click="handleDel(scope.row)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<!-- 分页 -->
|
||||
<div class="pagination-wrapper">
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination-wrapper">
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 保存审核人员弹窗 -->
|
||||
<add-form
|
||||
v-model:visible="setTeachNoFormVisible"
|
||||
:time-range="form.time1"
|
||||
@save="handleSave"
|
||||
/>
|
||||
</el-dialog>
|
||||
<!-- 保存审核人员弹窗 -->
|
||||
<add-form v-model:visible="setTeachNoFormVisible" :time-range="form.time1" @save="handleSave" />
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitexampeople">
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { addObj, delObj, fetchList } from '/@/api/recruit/recruitPreexamPeople'
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { addObj, delObj, fetchList } from '/@/api/recruit/recruitPreexamPeople';
|
||||
|
||||
const AddForm = defineAsyncComponent(() => import('./add-form.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const AddForm = defineAsyncComponent(() => import('./add-form.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const tableRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const visible = ref(false)
|
||||
const setTeachNoFormVisible = ref(false)
|
||||
const visible = ref(false);
|
||||
const setTeachNoFormVisible = ref(false);
|
||||
|
||||
// 表单数据
|
||||
const form = reactive({
|
||||
time1: [] as string[]
|
||||
})
|
||||
time1: [] as string[],
|
||||
});
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive<Record<string, any>>({})
|
||||
const queryForm = reactive<Record<string, any>>({});
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records || [],
|
||||
total: response.data.total || 0
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false, // 弹窗组件,不在挂载时自动加载数据
|
||||
dataList: [], // 确保 dataList 初始化为空数组
|
||||
loading: false, // 确保 loading 初始化为 false
|
||||
onLoaded: async (state: any) => {
|
||||
// 如果有数据,设置时间范围
|
||||
if (state.dataList && state.dataList.length > 0) {
|
||||
form.time1 = [state.dataList[0].startTime, state.dataList[0].endTime]
|
||||
}
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records || [],
|
||||
total: response.data.total || 0,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false, // 弹窗组件,不在挂载时自动加载数据
|
||||
dataList: [], // 确保 dataList 初始化为空数组
|
||||
loading: false, // 确保 loading 初始化为 false
|
||||
onLoaded: async (state: any) => {
|
||||
// 如果有数据,设置时间范围
|
||||
if (state.dataList && state.dataList.length > 0) {
|
||||
form.time1 = [state.dataList[0].startTime, state.dataList[0].endTime];
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
// 注意:useTable 会直接修改传入的 state 对象,所以不需要从返回值中获取 state
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
visible.value = true
|
||||
form.time1 = []
|
||||
// 等待弹窗显示后再加载数据
|
||||
nextTick(() => {
|
||||
getDataList()
|
||||
})
|
||||
}
|
||||
visible.value = true;
|
||||
form.time1 = [];
|
||||
// 等待弹窗显示后再加载数据
|
||||
nextTick(() => {
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
// 新增
|
||||
const handleAdd = () => {
|
||||
setTeachNoFormVisible.value = true
|
||||
}
|
||||
setTeachNoFormVisible.value = true;
|
||||
};
|
||||
|
||||
// 保存审核人员
|
||||
const handleSave = async (data: { teacherNo: string; startTime: string; endTime: string }) => {
|
||||
if (form.time1.length === 0) {
|
||||
message.error('审核时间不能为空')
|
||||
return
|
||||
}
|
||||
try {
|
||||
await addObj({
|
||||
teacherNo: data.teacherNo,
|
||||
startTime: data.startTime,
|
||||
endTime: data.endTime
|
||||
})
|
||||
message.success('添加成功')
|
||||
getDataList()
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '添加失败')
|
||||
}
|
||||
}
|
||||
if (form.time1.length === 0) {
|
||||
message.error('审核时间不能为空');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await addObj({
|
||||
teacherNo: data.teacherNo,
|
||||
startTime: data.startTime,
|
||||
endTime: data.endTime,
|
||||
});
|
||||
message.success('添加成功');
|
||||
getDataList();
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '添加失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 删除
|
||||
const handleDel = async (row: any) => {
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除工号为${row.teacherNo}的记录?`)
|
||||
await delObj(row.id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除工号为${row.teacherNo}的记录?`);
|
||||
await delObj(row.id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
Object.keys(queryForm).forEach(key => {
|
||||
queryForm[key] = ''
|
||||
})
|
||||
getDataList()
|
||||
}
|
||||
Object.keys(queryForm).forEach((key) => {
|
||||
queryForm[key] = '';
|
||||
});
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 暴露方法
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -16,114 +16,111 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<el-dialog v-model="dialogVisible" title="保存审核人员" width="600px" append-to-body @close="handleClose">
|
||||
<el-form :model="{ belongTeacherNos }" label-width="100px">
|
||||
<el-form-item label="选择教师:">
|
||||
<el-select
|
||||
v-model="belongTeacherNos"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
reserve-keyword
|
||||
placeholder="请选择或输入教师姓名"
|
||||
:remote-method="remoteTeacherByQuery"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in teacherList"
|
||||
:key="item.teacherNo"
|
||||
:label="item.realName"
|
||||
:value="item.teacherNo"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="dialogVisible" title="保存审核人员" width="600px" append-to-body @close="handleClose">
|
||||
<el-form :model="{ belongTeacherNos }" label-width="100px">
|
||||
<el-form-item label="选择教师:">
|
||||
<el-select
|
||||
v-model="belongTeacherNos"
|
||||
filterable
|
||||
remote
|
||||
clearable
|
||||
reserve-keyword
|
||||
placeholder="请选择或输入教师姓名"
|
||||
:remote-method="remoteTeacherByQuery"
|
||||
style="width: 100%"
|
||||
>
|
||||
<el-option v-for="item in teacherList" :key="item.teacherNo" :label="item.realName" :value="item.teacherNo" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">取消</el-button>
|
||||
<el-button type="primary" @click="handleSave">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="AddExamPeopleForm">
|
||||
import { ref, watch } from 'vue'
|
||||
import {getTeacherInfoCommon} from '/@/api/professional/professionaluser/teacherbase'
|
||||
import { ref, watch } from 'vue';
|
||||
import { getTeacherInfoCommon } from '/@/api/professional/professionaluser/teacherbase';
|
||||
|
||||
// Props
|
||||
const props = defineProps<{
|
||||
visible: boolean
|
||||
timeRange: string[]
|
||||
}>()
|
||||
visible: boolean;
|
||||
timeRange: string[];
|
||||
}>();
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:visible', value: boolean): void
|
||||
(e: 'save', data: { teacherNo: string; startTime: string; endTime: string }): void
|
||||
}>()
|
||||
(e: 'update:visible', value: boolean): void;
|
||||
(e: 'save', data: { teacherNo: string; startTime: string; endTime: string }): void;
|
||||
}>();
|
||||
|
||||
// 弹窗显示状态
|
||||
const dialogVisible = ref(false)
|
||||
const belongTeacherNos = ref('')
|
||||
const teacherList = ref<any[]>([])
|
||||
const dialogVisible = ref(false);
|
||||
const belongTeacherNos = ref('');
|
||||
const teacherList = ref<any[]>([]);
|
||||
|
||||
// 监听 visible 变化
|
||||
watch(() => props.visible, (newVal) => {
|
||||
dialogVisible.value = newVal
|
||||
if (newVal) {
|
||||
belongTeacherNos.value = ''
|
||||
teacherList.value = []
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => props.visible,
|
||||
(newVal) => {
|
||||
dialogVisible.value = newVal;
|
||||
if (newVal) {
|
||||
belongTeacherNos.value = '';
|
||||
teacherList.value = [];
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 监听 dialogVisible 变化,同步到父组件
|
||||
watch(dialogVisible, (newVal) => {
|
||||
emit('update:visible', newVal)
|
||||
})
|
||||
emit('update:visible', newVal);
|
||||
});
|
||||
|
||||
// 检索教师
|
||||
const remoteTeacherByQuery = (query: string) => {
|
||||
teacherList.value = []
|
||||
if (query !== '') {
|
||||
setTimeout(() => {
|
||||
getTeacherInfoCommon({searchKeywords:query,tied:"0"}).then(response => {
|
||||
teacherList.value = response.data
|
||||
})
|
||||
}, 200)
|
||||
}
|
||||
}
|
||||
teacherList.value = [];
|
||||
if (query !== '') {
|
||||
setTimeout(() => {
|
||||
getTeacherInfoCommon({ searchKeywords: query, tied: '0' }).then((response) => {
|
||||
teacherList.value = response.data;
|
||||
});
|
||||
}, 200);
|
||||
}
|
||||
};
|
||||
|
||||
// 关闭窗口
|
||||
const handleClose = () => {
|
||||
belongTeacherNos.value = ''
|
||||
dialogVisible.value = false
|
||||
}
|
||||
belongTeacherNos.value = '';
|
||||
dialogVisible.value = false;
|
||||
};
|
||||
|
||||
// 保存
|
||||
const handleSave = () => {
|
||||
if (props.timeRange.length === 0) {
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: '',
|
||||
endTime: ''
|
||||
})
|
||||
return
|
||||
}
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: props.timeRange[0],
|
||||
endTime: props.timeRange[1]
|
||||
})
|
||||
handleClose()
|
||||
}
|
||||
if (props.timeRange.length === 0) {
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: '',
|
||||
endTime: '',
|
||||
});
|
||||
return;
|
||||
}
|
||||
emit('save', {
|
||||
teacherNo: belongTeacherNos.value,
|
||||
startTime: props.timeRange[0],
|
||||
endTime: props.timeRange[1],
|
||||
});
|
||||
handleClose();
|
||||
};
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dialog-footer {
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
gap: 10px;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -16,210 +16,180 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<el-dialog
|
||||
title="招生审核人员管理"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="800"
|
||||
:append-to-body="true"
|
||||
destroy-on-close
|
||||
>
|
||||
<div class="dialog-content">
|
||||
<!-- 时间选择器和操作按钮 -->
|
||||
<el-form :inline="true" :model="queryForm">
|
||||
<el-form-item label="审核时间范围:">
|
||||
<el-time-picker
|
||||
is-range
|
||||
v-model="form.time1"
|
||||
format="HH:mm:ss"
|
||||
value-format="HH:mm:ss"
|
||||
range-separator="至"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
placeholder="选择时间范围"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="mb15" v-if="hasAuth('recruit_recruitexampeople_add')">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="handleAdd"
|
||||
>
|
||||
新 增
|
||||
</el-button>
|
||||
</div>
|
||||
<el-dialog title="招生审核人员管理" :close-on-click-modal="false" v-model="visible" width="800" :append-to-body="true" destroy-on-close>
|
||||
<div class="dialog-content">
|
||||
<!-- 时间选择器和操作按钮 -->
|
||||
<el-form :inline="true" :model="queryForm">
|
||||
<el-form-item label="审核时间范围:">
|
||||
<el-time-picker
|
||||
is-range
|
||||
v-model="form.time1"
|
||||
format="HH:mm:ss"
|
||||
value-format="HH:mm:ss"
|
||||
range-separator="至"
|
||||
start-placeholder="开始时间"
|
||||
end-placeholder="结束时间"
|
||||
placeholder="选择时间范围"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="mb15" v-if="hasAuth('recruit_recruitexampeople_add')">
|
||||
<el-button type="primary" icon="FolderAdd" @click="handleAdd"> 新 增 </el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<div class="table-wrapper">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList || []"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
empty-text="暂无数据"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column label="工号" align="center" prop="teacherNo" show-overflow-tooltip>
|
||||
</el-table-column>
|
||||
<el-table-column label="姓名" align="center" prop="teacherName" show-overflow-tooltip>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" align="center" width="150px" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitexampeople_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
<!-- 表格 -->
|
||||
<div class="table-wrapper">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList || []"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
empty-text="暂无数据"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column label="工号" align="center" prop="teacherNo" show-overflow-tooltip> </el-table-column>
|
||||
<el-table-column label="姓名" align="center" prop="teacherName" show-overflow-tooltip> </el-table-column>
|
||||
<el-table-column label="操作" align="center" width="150px" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_recruitexampeople_del')" type="danger" link icon="Delete" @click="handleDel(scope.row)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
|
||||
<!-- 分页 -->
|
||||
<div class="pagination-wrapper">
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 分页 -->
|
||||
<div class="pagination-wrapper">
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 保存审核人员弹窗 -->
|
||||
<add-form
|
||||
v-model:visible="setTeachNoFormVisible"
|
||||
:time-range="form.time1"
|
||||
@save="handleSave"
|
||||
/>
|
||||
</el-dialog>
|
||||
<!-- 保存审核人员弹窗 -->
|
||||
<add-form v-model:visible="setTeachNoFormVisible" :time-range="form.time1" @save="handleSave" />
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitexampeople">
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { addObj, delObj, fetchList } from '/@/api/recruit/recruitexampeople'
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { addObj, delObj, fetchList } from '/@/api/recruit/recruitexampeople';
|
||||
|
||||
const AddForm = defineAsyncComponent(() => import('./add-form.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const AddForm = defineAsyncComponent(() => import('./add-form.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const tableRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const visible = ref(false)
|
||||
const setTeachNoFormVisible = ref(false)
|
||||
const visible = ref(false);
|
||||
const setTeachNoFormVisible = ref(false);
|
||||
|
||||
// 表单数据
|
||||
const form = reactive({
|
||||
time1: [] as string[]
|
||||
})
|
||||
time1: [] as string[],
|
||||
});
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive<Record<string, any>>({})
|
||||
const queryForm = reactive<Record<string, any>>({});
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records || [],
|
||||
total: response.data.total || 0
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false, // 弹窗组件,不在挂载时自动加载数据
|
||||
dataList: [], // 确保 dataList 初始化为空数组
|
||||
loading: false, // 确保 loading 初始化为 false
|
||||
onLoaded: async (state: any) => {
|
||||
// 如果有数据,设置时间范围
|
||||
if (state.dataList && state.dataList.length > 0) {
|
||||
form.time1 = [state.dataList[0].startTime, state.dataList[0].endTime]
|
||||
}
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records || [],
|
||||
total: response.data.total || 0,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false, // 弹窗组件,不在挂载时自动加载数据
|
||||
dataList: [], // 确保 dataList 初始化为空数组
|
||||
loading: false, // 确保 loading 初始化为 false
|
||||
onLoaded: async (state: any) => {
|
||||
// 如果有数据,设置时间范围
|
||||
if (state.dataList && state.dataList.length > 0) {
|
||||
form.time1 = [state.dataList[0].startTime, state.dataList[0].endTime];
|
||||
}
|
||||
},
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
// 注意:useTable 会直接修改传入的 state 对象,所以不需要从返回值中获取 state
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
visible.value = true
|
||||
form.time1 = []
|
||||
// 等待弹窗显示后再加载数据
|
||||
nextTick(() => {
|
||||
getDataList()
|
||||
})
|
||||
}
|
||||
visible.value = true;
|
||||
form.time1 = [];
|
||||
// 等待弹窗显示后再加载数据
|
||||
nextTick(() => {
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
// 新增
|
||||
const handleAdd = () => {
|
||||
setTeachNoFormVisible.value = true
|
||||
}
|
||||
setTeachNoFormVisible.value = true;
|
||||
};
|
||||
|
||||
// 保存审核人员
|
||||
const handleSave = async (data: { teacherNo: string; startTime: string; endTime: string }) => {
|
||||
if (form.time1.length === 0) {
|
||||
message.error('审核时间不能为空')
|
||||
return
|
||||
}
|
||||
try {
|
||||
await addObj({
|
||||
teacherNo: data.teacherNo,
|
||||
startTime: data.startTime,
|
||||
endTime: data.endTime
|
||||
})
|
||||
message.success('添加成功')
|
||||
getDataList()
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '添加失败')
|
||||
}
|
||||
}
|
||||
if (form.time1.length === 0) {
|
||||
message.error('审核时间不能为空');
|
||||
return;
|
||||
}
|
||||
try {
|
||||
await addObj({
|
||||
teacherNo: data.teacherNo,
|
||||
startTime: data.startTime,
|
||||
endTime: data.endTime,
|
||||
});
|
||||
message.success('添加成功');
|
||||
getDataList();
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '添加失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 删除
|
||||
const handleDel = async (row: any) => {
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除工号为${row.teacherNo}的记录?`)
|
||||
await delObj(row.id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除工号为${row.teacherNo}的记录?`);
|
||||
await delObj(row.id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
Object.keys(queryForm).forEach(key => {
|
||||
queryForm[key] = ''
|
||||
})
|
||||
getDataList()
|
||||
}
|
||||
Object.keys(queryForm).forEach((key) => {
|
||||
queryForm[key] = '';
|
||||
});
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 暴露方法
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -326,10 +326,10 @@ const init = (id: string | null) => {
|
||||
if (response && response.data) {
|
||||
Object.assign(dataForm, response.data);
|
||||
if (dataForm.standardMajorCode && dataForm.standardMajorTwoCode) {
|
||||
chooseMajorCate.value = [dataForm.standardMajorCode, dataForm.standardMajorTwoCode];
|
||||
}else{
|
||||
chooseMajorCate.value = [];
|
||||
}
|
||||
chooseMajorCate.value = [dataForm.standardMajorCode, dataForm.standardMajorTwoCode];
|
||||
} else {
|
||||
chooseMajorCate.value = [];
|
||||
}
|
||||
// 获取市平台对应年份下的招生计划
|
||||
// getCityPlan({ id: dataForm.id }).then((data: any) => {
|
||||
// cityPlanIdList.value = data.data
|
||||
|
||||
@@ -49,13 +49,7 @@
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruit_recruitplanmajor_add')" type="primary" icon="FolderAdd" @click="addOrUpdateHandle"> 新 增 </el-button>
|
||||
|
||||
<el-button
|
||||
v-auth="'recruit_major_import'"
|
||||
type="primary"
|
||||
plain
|
||||
icon="UploadFilled"
|
||||
:loading="exportLoading"
|
||||
@click="handleImportDialog"
|
||||
<el-button v-auth="'recruit_major_import'" type="primary" plain icon="UploadFilled" :loading="exportLoading" @click="handleImportDialog"
|
||||
>导入信息
|
||||
</el-button>
|
||||
</div>
|
||||
@@ -79,15 +73,14 @@
|
||||
</el-table-column>
|
||||
<el-table-column prop="majorCode" label="专业序号" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="majorName" label="专业名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="majorName" label="规范专业名称" align="center" show-overflow-tooltip >
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.standardMajorName">
|
||||
{{ scope.row.standardMajorName+"-"+scope.row.standardMajorTwoName }}
|
||||
</span>
|
||||
<span v-else>
|
||||
</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="majorName" label="规范专业名称" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="scope.row.standardMajorName">
|
||||
{{ scope.row.standardMajorName + '-' + scope.row.standardMajorTwoName }}
|
||||
</span>
|
||||
<span v-else> </span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="deptCode" label="学院" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getDeptName(scope.row.deptCode) }}
|
||||
@@ -133,7 +126,7 @@
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
|
||||
<import-recruit-info ref="ImportRecruitInfoRef" @refreshDataList="getDataList"></import-recruit-info>
|
||||
<import-recruit-info ref="ImportRecruitInfoRef" @refreshDataList="getDataList"></import-recruit-info>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
@@ -151,7 +144,7 @@ import { getMajorNameList } from '/@/api/basic/major';
|
||||
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'));
|
||||
const ImportRecruitInfo = defineAsyncComponent(() => import('/@/views/recruit/common/import-recruit-info.vue'));
|
||||
const ImportRecruitInfoRef=ref<any>();
|
||||
const ImportRecruitInfoRef = ref<any>();
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage();
|
||||
@@ -292,7 +285,7 @@ const resetQuery = () => {
|
||||
const exportLoading = ref(false);
|
||||
|
||||
const handleImportDialog = () => {
|
||||
ImportRecruitInfoRef.value?.init("R10001");
|
||||
ImportRecruitInfoRef.value?.init('R10001');
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
<el-select
|
||||
v-model="scope.row.degreeOfEducation"
|
||||
placeholder="请选择生源"
|
||||
multiple
|
||||
@change="updateMajor(scope.row,'degreeOfEducation')"
|
||||
multiple
|
||||
@change="updateMajor(scope.row, 'degreeOfEducation')"
|
||||
>
|
||||
<el-option v-for="item in degreeOfEducationList" :key="item.value" :label="item.label" :value="item.value"> </el-option>
|
||||
</el-select>
|
||||
@@ -127,14 +127,14 @@ const updateMajor = (row: any, type: any) => {
|
||||
let params = {} as any;
|
||||
params.id = row.id;
|
||||
if (type == 'planStudentNum') {
|
||||
params.planStudentNum=row.planStudentNum
|
||||
params.planStudentNum = row.planStudentNum;
|
||||
}
|
||||
if (type == 'scoreLine') {
|
||||
params.scoreLine = row.scoreLine;
|
||||
}
|
||||
if (type == 'degreeOfEducation') {
|
||||
params.degreeOfEducation = row.degreeOfEducations;
|
||||
}
|
||||
if (type == 'scoreLine') {
|
||||
params.scoreLine=row.scoreLine
|
||||
}
|
||||
if (type == 'degreeOfEducation') {
|
||||
params.degreeOfEducation=row.degreeOfEducations
|
||||
}
|
||||
|
||||
editQuickField(params)
|
||||
.then(() => {
|
||||
|
||||
@@ -1,521 +1,411 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="!dataForm.id ? '新增' : '修改'"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="800px"
|
||||
>
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" :disabled="!!dataForm.id">
|
||||
<el-option
|
||||
v-for="item in planListLocal"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input v-model="dataForm.name" placeholder="姓名"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input
|
||||
v-model="dataForm.phone"
|
||||
placeholder="电话"
|
||||
type="tel"
|
||||
maxlength="11"
|
||||
v-input-filter="'number'">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-radio-group v-model="dataForm.gender">
|
||||
<el-radio v-for="item in sexyList" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="身份证" prop="idCard">
|
||||
<el-input
|
||||
v-model="dataForm.idCard"
|
||||
placeholder="身份证号"
|
||||
maxlength="20"
|
||||
v-input-filter="'idcard'">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="准考证" prop="admission">
|
||||
<el-input
|
||||
v-model="dataForm.admission"
|
||||
placeholder="准考证"
|
||||
maxlength="20"
|
||||
v-input-filter="'alphanumeric'">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="中考成绩" prop="achievement">
|
||||
<el-input-number v-model="dataForm.achievement" :min="0" :max="700" placeholder="中考成绩" ></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="对接人" prop="djUser" v-if="hasAuth('recruit_recruitprestudent_dj_sure')">
|
||||
<el-select v-model="dataForm.djUser" filterable clearable placeholder="" >
|
||||
<el-option
|
||||
v-for="item in contactNameList"
|
||||
:key="item.teacherNo"
|
||||
:label="item.realName+'-'+item.deptCode"
|
||||
:value="item.teacherNo">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="学校" prop="schoolId">
|
||||
<el-select v-model="dataForm.schoolId" filterable placeholder="请选择学校" >
|
||||
<el-option
|
||||
v-for="item in schoolList"
|
||||
:key="item.id"
|
||||
:label="item.schoolName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-dialog :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" v-model="visible" width="800px">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="24">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" :disabled="!!dataForm.id">
|
||||
<el-option v-for="item in planListLocal" :key="item.id" :label="item.groupName" :value="item.id"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input v-model="dataForm.name" placeholder="姓名"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="电话" prop="phone">
|
||||
<el-input v-model="dataForm.phone" placeholder="电话" type="tel" maxlength="11" v-input-filter="'number'"> </el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-radio-group v-model="dataForm.gender">
|
||||
<el-radio v-for="item in sexyList" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="身份证" prop="idCard">
|
||||
<el-input v-model="dataForm.idCard" placeholder="身份证号" maxlength="20" v-input-filter="'idcard'"> </el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="准考证" prop="admission">
|
||||
<el-input v-model="dataForm.admission" placeholder="准考证" maxlength="20" v-input-filter="'alphanumeric'"> </el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="中考成绩" prop="achievement">
|
||||
<el-input-number v-model="dataForm.achievement" :min="0" :max="700" placeholder="中考成绩"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="对接人" prop="djUser" v-if="hasAuth('recruit_recruitprestudent_dj_sure')">
|
||||
<el-select v-model="dataForm.djUser" filterable clearable placeholder="">
|
||||
<el-option v-for="item in contactNameList" :key="item.teacherNo" :label="item.realName + '-' + item.deptCode" :value="item.teacherNo">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="学校" prop="schoolId">
|
||||
<el-select v-model="dataForm.schoolId" filterable placeholder="请选择学校">
|
||||
<el-option v-for="item in schoolList" :key="item.id" :label="item.schoolName" :value="item.id"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业1" prop="planMajorOne">
|
||||
<el-select v-model="dataForm.planMajorOne" filterable placeholder="请选择拟报专业1" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业2" prop="planMajorTwo">
|
||||
<el-select v-model="dataForm.planMajorTwo" filterable clearable placeholder="请选择拟报专业2" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业3" prop="planMajorThree">
|
||||
<el-select v-model="dataForm.planMajorThree" filterable clearable placeholder="请选择拟报专业3" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业4" prop="planMajorFour">
|
||||
<el-select v-model="dataForm.planMajorFour" filterable clearable placeholder="请选择拟报专业4" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业5" prop="planMajorFive">
|
||||
<el-select v-model="dataForm.planMajorFive" filterable clearable placeholder="请选择拟报专业5" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业6" prop="planMajorSix">
|
||||
<el-select v-model="dataForm.planMajorSix" filterable clearable placeholder="请选择拟报专业6" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业7" prop="planMajorSeven">
|
||||
<el-select v-model="dataForm.planMajorSeven" filterable clearable placeholder="请选择拟报专业7" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业8" prop="planMajorEight">
|
||||
<el-select v-model="dataForm.planMajorEight" filterable clearable placeholder="请选择拟报专业8" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业9" prop="planMajorNine">
|
||||
<el-select v-model="dataForm.planMajorNine" filterable clearable placeholder="请选择拟报专业9" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业10" prop="planMajorTen">
|
||||
<el-select v-model="dataForm.planMajorTen" filterable clearable placeholder="请选择拟报专业10" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业11" prop="planMajorEleven">
|
||||
<el-select v-model="dataForm.planMajorEleven" filterable clearable placeholder="请选择拟报专业11" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业12" prop="planMajorTwelve">
|
||||
<el-select v-model="dataForm.planMajorTwelve" filterable clearable placeholder="请选择拟报专业12" >
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName"
|
||||
:value="item.id"
|
||||
:disabled="isDisable(item.id)"
|
||||
>
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业1" prop="planMajorOne">
|
||||
<el-select v-model="dataForm.planMajorOne" filterable placeholder="请选择拟报专业1">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业2" prop="planMajorTwo">
|
||||
<el-select v-model="dataForm.planMajorTwo" filterable clearable placeholder="请选择拟报专业2">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业3" prop="planMajorThree">
|
||||
<el-select v-model="dataForm.planMajorThree" filterable clearable placeholder="请选择拟报专业3">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业4" prop="planMajorFour">
|
||||
<el-select v-model="dataForm.planMajorFour" filterable clearable placeholder="请选择拟报专业4">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业5" prop="planMajorFive">
|
||||
<el-select v-model="dataForm.planMajorFive" filterable clearable placeholder="请选择拟报专业5">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业6" prop="planMajorSix">
|
||||
<el-select v-model="dataForm.planMajorSix" filterable clearable placeholder="请选择拟报专业6">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业7" prop="planMajorSeven">
|
||||
<el-select v-model="dataForm.planMajorSeven" filterable clearable placeholder="请选择拟报专业7">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业8" prop="planMajorEight">
|
||||
<el-select v-model="dataForm.planMajorEight" filterable clearable placeholder="请选择拟报专业8">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业9" prop="planMajorNine">
|
||||
<el-select v-model="dataForm.planMajorNine" filterable clearable placeholder="请选择拟报专业9">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业10" prop="planMajorTen">
|
||||
<el-select v-model="dataForm.planMajorTen" filterable clearable placeholder="请选择拟报专业10">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业11" prop="planMajorEleven">
|
||||
<el-select v-model="dataForm.planMajorEleven" filterable clearable placeholder="请选择拟报专业11">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="拟报专业12" prop="planMajorTwelve">
|
||||
<el-select v-model="dataForm.planMajorTwelve" filterable clearable placeholder="请选择拟报专业12">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName" :value="item.id" :disabled="isDisable(item.id)">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { getObj, addObjStu, putObj } from '/@/api/recruit/recruitprestudent'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getDicts } from '/@/api/admin/dict'
|
||||
import { queryAllTeacherByRecruit } from '/@/api/professional/professionaluser/teacherbase'
|
||||
import { verifyPhone, verifyAdmissionNumber } from '/@/utils/toolsValidate'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { getObj, addObjStu, putObj } from '/@/api/recruit/recruitprestudent';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
import { queryAllTeacherByRecruit } from '/@/api/professional/professionaluser/teacherbase';
|
||||
import { verifyPhone, verifyAdmissionNumber } from '/@/utils/toolsValidate';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// Props
|
||||
const props = defineProps<{
|
||||
planList?: any[]
|
||||
planMajorList?: any[]
|
||||
schoolList?: any[]
|
||||
}>()
|
||||
planList?: any[];
|
||||
planMajorList?: any[];
|
||||
schoolList?: any[];
|
||||
}>();
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const contactNameList = ref<any[]>([])
|
||||
const planListLocal = ref<any[]>([])
|
||||
const sexyList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const contactNameList = ref<any[]>([]);
|
||||
const planListLocal = ref<any[]>([]);
|
||||
const sexyList = ref<any[]>([]);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
groupId: "",
|
||||
name: "",
|
||||
gender: "",
|
||||
phone: "",
|
||||
idCard: "",
|
||||
schoolId: "",
|
||||
planMajorOne: "",
|
||||
planMajorTwo: "",
|
||||
planMajorThree: "",
|
||||
planMajorFour: "",
|
||||
planMajorFive: "",
|
||||
planMajorSix: "",
|
||||
planMajorSeven: "",
|
||||
planMajorEight: "",
|
||||
planMajorNine: "",
|
||||
planMajorTen: "",
|
||||
planMajorEleven: "",
|
||||
planMajorTwelve: "",
|
||||
admission: "",
|
||||
achievement: null as number | null,
|
||||
contactsNo: "",
|
||||
djUser: null as string | null,
|
||||
djTime: null as string | null,
|
||||
djName: null as string | null,
|
||||
djDept: null as string | null,
|
||||
isDj: "0",
|
||||
year: ""
|
||||
})
|
||||
id: '',
|
||||
groupId: '',
|
||||
name: '',
|
||||
gender: '',
|
||||
phone: '',
|
||||
idCard: '',
|
||||
schoolId: '',
|
||||
planMajorOne: '',
|
||||
planMajorTwo: '',
|
||||
planMajorThree: '',
|
||||
planMajorFour: '',
|
||||
planMajorFive: '',
|
||||
planMajorSix: '',
|
||||
planMajorSeven: '',
|
||||
planMajorEight: '',
|
||||
planMajorNine: '',
|
||||
planMajorTen: '',
|
||||
planMajorEleven: '',
|
||||
planMajorTwelve: '',
|
||||
admission: '',
|
||||
achievement: null as number | null,
|
||||
contactsNo: '',
|
||||
djUser: null as string | null,
|
||||
djTime: null as string | null,
|
||||
djName: null as string | null,
|
||||
djDept: null as string | null,
|
||||
isDj: '0',
|
||||
year: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
planMajorOne: [
|
||||
{ required: true, message: '拟报专业1不能为空', trigger: 'blur' }
|
||||
],
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'blur' }
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: '姓名不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: "姓名长度最多20位", trigger: "blur" }
|
||||
],
|
||||
phone: [
|
||||
{ required: true, message: '电话不能为空', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule: any, value: any, callback: any) => {
|
||||
if (value && !verifyPhone(value)) {
|
||||
callback(new Error('请输入正确的手机号码'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
idCard: [
|
||||
{ required: true, message: '身份证不能为空', trigger: 'blur' }
|
||||
],
|
||||
admission: [
|
||||
{ required: true, message: '准考证不能为空', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule: any, value: any, callback: any) => {
|
||||
if (value && !verifyAdmissionNumber(value)) {
|
||||
callback(new Error('请输入正确的准考证号'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur'
|
||||
}
|
||||
],
|
||||
gender: [
|
||||
{ required: true, message: '性别不能为空', trigger: 'blur' }
|
||||
],
|
||||
schoolId: [
|
||||
{ required: true, message: '学校不能为空', trigger: 'blur' }
|
||||
],
|
||||
}
|
||||
planMajorOne: [{ required: true, message: '拟报专业1不能为空', trigger: 'blur' }],
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'blur' }],
|
||||
name: [
|
||||
{ required: true, message: '姓名不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '姓名长度最多20位', trigger: 'blur' },
|
||||
],
|
||||
phone: [
|
||||
{ required: true, message: '电话不能为空', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule: any, value: any, callback: any) => {
|
||||
if (value && !verifyPhone(value)) {
|
||||
callback(new Error('请输入正确的手机号码'));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
idCard: [{ required: true, message: '身份证不能为空', trigger: 'blur' }],
|
||||
admission: [
|
||||
{ required: true, message: '准考证不能为空', trigger: 'blur' },
|
||||
{
|
||||
validator: (rule: any, value: any, callback: any) => {
|
||||
if (value && !verifyAdmissionNumber(value)) {
|
||||
callback(new Error('请输入正确的准考证号'));
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
gender: [{ required: true, message: '性别不能为空', trigger: 'blur' }],
|
||||
schoolId: [{ required: true, message: '学校不能为空', trigger: 'blur' }],
|
||||
};
|
||||
|
||||
/**
|
||||
* 判断拟报专业是否已经占用,占用不可选
|
||||
*/
|
||||
const isDisable = (id: string) => {
|
||||
if (id == dataForm.planMajorOne
|
||||
|| id == dataForm.planMajorTwo
|
||||
|| id == dataForm.planMajorThree
|
||||
|| id == dataForm.planMajorFour
|
||||
|| id == dataForm.planMajorFive
|
||||
|| id == dataForm.planMajorSix
|
||||
|| id == dataForm.planMajorSeven
|
||||
|| id == dataForm.planMajorEight
|
||||
|| id == dataForm.planMajorNine
|
||||
|| id == dataForm.planMajorTen
|
||||
|| id == dataForm.planMajorEleven
|
||||
|| id == dataForm.planMajorTwelve
|
||||
) {
|
||||
return true
|
||||
} else {
|
||||
return false
|
||||
}
|
||||
}
|
||||
if (
|
||||
id == dataForm.planMajorOne ||
|
||||
id == dataForm.planMajorTwo ||
|
||||
id == dataForm.planMajorThree ||
|
||||
id == dataForm.planMajorFour ||
|
||||
id == dataForm.planMajorFive ||
|
||||
id == dataForm.planMajorSix ||
|
||||
id == dataForm.planMajorSeven ||
|
||||
id == dataForm.planMajorEight ||
|
||||
id == dataForm.planMajorNine ||
|
||||
id == dataForm.planMajorTen ||
|
||||
id == dataForm.planMajorEleven ||
|
||||
id == dataForm.planMajorTwelve
|
||||
) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
dataForm.djUser = null
|
||||
dataForm.djTime = null
|
||||
dataForm.djName = null
|
||||
dataForm.djDept = null
|
||||
dataForm.isDj = "0"
|
||||
addObjStu(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
dataForm.djUser = null;
|
||||
dataForm.djTime = null;
|
||||
dataForm.djName = null;
|
||||
dataForm.djDept = null;
|
||||
dataForm.isDj = '0';
|
||||
addObjStu(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
dataForm.id = id || ""
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
|
||||
// 初始化 planListLocal,优先使用 props,如果没有则使用空数组
|
||||
planListLocal.value = props.planList ? [...props.planList] : []
|
||||
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
// 获取性别字典
|
||||
getDicts('sexy').then((res: any) => {
|
||||
sexyList.value = res.data || []
|
||||
})
|
||||
// 获取教师列表(对接人)
|
||||
queryAllTeacherByRecruit().then((res: any) => {
|
||||
contactNameList.value = res.data || []
|
||||
}).catch(() => {
|
||||
contactNameList.value = []
|
||||
})
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
if (dataForm.year) {
|
||||
dataForm.year = String(dataForm.year)
|
||||
}
|
||||
})
|
||||
} else {
|
||||
getList().then((data: any) => {
|
||||
planListLocal.value = data.data
|
||||
if (planListLocal.value.length > 0) {
|
||||
dataForm.groupId = planListLocal.value[0].id
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
dataForm.id = id || '';
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
|
||||
// 初始化 planListLocal,优先使用 props,如果没有则使用空数组
|
||||
planListLocal.value = props.planList ? [...props.planList] : [];
|
||||
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
// 获取性别字典
|
||||
getDicts('sexy').then((res: any) => {
|
||||
sexyList.value = res.data || [];
|
||||
});
|
||||
// 获取教师列表(对接人)
|
||||
queryAllTeacherByRecruit()
|
||||
.then((res: any) => {
|
||||
contactNameList.value = res.data || [];
|
||||
})
|
||||
.catch(() => {
|
||||
contactNameList.value = [];
|
||||
});
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
if (dataForm.year) {
|
||||
dataForm.year = String(dataForm.year);
|
||||
}
|
||||
});
|
||||
} else {
|
||||
getList().then((data: any) => {
|
||||
planListLocal.value = data.data;
|
||||
if (planListLocal.value.length > 0) {
|
||||
dataForm.groupId = planListLocal.value[0].id;
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.el-form {
|
||||
.el-form-item:last-of-type {
|
||||
margin-bottom: 18px!important;
|
||||
}
|
||||
.el-form-item:last-of-type {
|
||||
margin-bottom: 18px !important;
|
||||
}
|
||||
}
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,430 +16,374 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="changeG">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="对接部门" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择对接部门">
|
||||
<el-option
|
||||
v-for="item in deptList"
|
||||
:key="item.deptCode"
|
||||
:label="item.deptName"
|
||||
:value="item.deptCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否对接" prop="isDj">
|
||||
<el-select v-model="queryForm.isDj" filterable clearable placeholder="请选择是否对接">
|
||||
<el-option
|
||||
v-for="item in isDjList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="对接人" prop="djUser">
|
||||
<el-input v-model="queryForm.djName" type="text" placeholder="请输入对接人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="姓名/身份证/电话" prop="name">
|
||||
<el-input v-model="queryForm.name" clearable placeholder="请填写学生姓名/身份证/电话" />
|
||||
</el-form-item>
|
||||
<el-form-item label="学校" prop="schoolId">
|
||||
<el-select v-model="queryForm.schoolId" filterable clearable placeholder="请选择学校">
|
||||
<el-option
|
||||
v-for="item in schoolList"
|
||||
:key="item.id"
|
||||
:label="item.schoolName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="拟报专业" prop="planMajorOne">
|
||||
<el-select v-model="queryForm.planMajorOne" filterable clearable placeholder="请选择拟报专业">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.id"
|
||||
:label="item.majorName + ' || ' + item.majorCode"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="changeG">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="对接部门" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择对接部门">
|
||||
<el-option v-for="item in deptList" :key="item.deptCode" :label="item.deptName" :value="item.deptCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否对接" prop="isDj">
|
||||
<el-select v-model="queryForm.isDj" filterable clearable placeholder="请选择是否对接">
|
||||
<el-option v-for="item in isDjList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="对接人" prop="djUser">
|
||||
<el-input v-model="queryForm.djName" type="text" placeholder="请输入对接人" />
|
||||
</el-form-item>
|
||||
<el-form-item label="姓名/身份证/电话" prop="name">
|
||||
<el-input v-model="queryForm.name" clearable placeholder="请填写学生姓名/身份证/电话" />
|
||||
</el-form-item>
|
||||
<el-form-item label="学校" prop="schoolId">
|
||||
<el-select v-model="queryForm.schoolId" filterable clearable placeholder="请选择学校">
|
||||
<el-option v-for="item in schoolList" :key="item.id" :label="item.schoolName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="拟报专业" prop="planMajorOne">
|
||||
<el-select v-model="queryForm.planMajorOne" filterable clearable placeholder="请选择拟报专业">
|
||||
<el-option v-for="item in planMajorList" :key="item.id" :label="item.majorName + ' || ' + item.majorCode" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitprestudent_add')"
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="addOrUpdateHandle(null)"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-auth="'pre_stu_success_export'"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
class="ml10"
|
||||
:loading="exportLoading"
|
||||
@click="dataExportHandle"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruit_recruitprestudent_add')" type="primary" icon="FolderAdd" @click="addOrUpdateHandle(null)"> 新增 </el-button>
|
||||
<el-button
|
||||
v-auth="'pre_stu_success_export'"
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
class="ml10"
|
||||
:loading="exportLoading"
|
||||
@click="dataExportHandle"
|
||||
>
|
||||
导出
|
||||
</el-button>
|
||||
|
||||
<el-button v-if="hasAuth('recruit_preexamPeople_add')" type="primary" plain icon="UserFilled" class="ml10" @click="editExam">
|
||||
审核人员管理
|
||||
</el-button>
|
||||
</div>
|
||||
<el-button v-if="hasAuth('recruit_preexamPeople_add')" type="primary" plain icon="UserFilled" class="ml10" @click="editExam">
|
||||
审核人员管理
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
|
||||
<el-table-column prop="djName" label="对接人" width="230" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.djName || scope.row.djTime" class="contact-cell">
|
||||
<div v-if="scope.row.djName" class="contact-name">
|
||||
<el-icon class="contact-icon"><User /></el-icon>
|
||||
<span class="contact-text">{{ scope.row.djName }}</span>
|
||||
</div>
|
||||
<span v-if="scope.row.djTime" class="time-text">{{ scope.row.djTime }}</span>
|
||||
</div>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="学生姓名" width="120" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="phone" label="电话" width="120" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="achievement" label="中考分数" width="90" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="admission" label="准考证号" width="130" align="left" show-overflow-tooltip />
|
||||
<el-table-column prop="planMajorOne" label="拟报专业1" align="left" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getMajorName(scope.row.planMajorOne) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="schoolId" label="学校" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getSchoolName(scope.row.schoolId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="250" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitprestudent_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitprestudent_dj') && scope.row.isDj == '0'"
|
||||
type="primary"
|
||||
link
|
||||
icon="Connection"
|
||||
@click="handllSureDj(scope.row.id)"
|
||||
>
|
||||
确认对接
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitprestudent_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<el-table-column prop="djName" label="对接人" width="230" align="center">
|
||||
<template #default="scope">
|
||||
<div v-if="scope.row.djName || scope.row.djTime" class="contact-cell">
|
||||
<div v-if="scope.row.djName" class="contact-name">
|
||||
<el-icon class="contact-icon"><User /></el-icon>
|
||||
<span class="contact-text">{{ scope.row.djName }}</span>
|
||||
</div>
|
||||
<span v-if="scope.row.djTime" class="time-text">{{ scope.row.djTime }}</span>
|
||||
</div>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="学生姓名" width="120" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="phone" label="电话" width="120" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="achievement" label="中考分数" width="90" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="admission" label="准考证号" width="130" align="left" show-overflow-tooltip />
|
||||
<el-table-column prop="planMajorOne" label="拟报专业1" align="left" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getMajorName(scope.row.planMajorOne) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="schoolId" label="学校" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getSchoolName(scope.row.schoolId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="250" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_recruitprestudent_edit')" type="primary" link icon="EditPen" @click="addOrUpdateHandle(scope.row.id)">
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitprestudent_dj') && scope.row.isDj == '0'"
|
||||
type="primary"
|
||||
link
|
||||
icon="Connection"
|
||||
@click="handllSureDj(scope.row.id)"
|
||||
>
|
||||
确认对接
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitprestudent_del')" type="danger" link icon="Delete" @click="deleteHandle(scope.row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form
|
||||
ref="addOrUpdateRef"
|
||||
@refreshDataList="getDataList"
|
||||
:planList="planList"
|
||||
:planMajorList="planMajorList"
|
||||
:schoolList="schoolList"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<pre-exam-people-index ref="PreExamPeopleIndexRef"></pre-exam-people-index>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" :planList="planList" :planMajorList="planMajorList" :schoolList="schoolList" />
|
||||
|
||||
<pre-exam-people-index ref="PreExamPeopleIndexRef"></pre-exam-people-index>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitprestudent">
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { User } from '@element-plus/icons-vue'
|
||||
import { delObj, fetchList, sureDJ } from '/@/api/recruit/recruitprestudent'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { listcz } from '/@/api/recruit/recruitstudentplan'
|
||||
import { queryByGroupId as schoolListApi} from '/@/api/recruit/recruitstudentschool'
|
||||
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
|
||||
import {exportPreStuSuccess} from '/@/api/recruit/recruitfile'
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { User } from '@element-plus/icons-vue';
|
||||
import { delObj, fetchList, sureDJ } from '/@/api/recruit/recruitprestudent';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { listcz } from '/@/api/recruit/recruitstudentplan';
|
||||
import { queryByGroupId as schoolListApi } from '/@/api/recruit/recruitstudentschool';
|
||||
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept';
|
||||
import { exportPreStuSuccess } from '/@/api/recruit/recruitfile';
|
||||
|
||||
const PreExamPeopleIndex = defineAsyncComponent(() => import('@/views/recruit/recruitPreexamPeople/index.vue'));
|
||||
|
||||
const PreExamPeopleIndexRef=ref()
|
||||
const TableForm = defineAsyncComponent(() => import('./enrolplantemplate-form.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const PreExamPeopleIndexRef = ref();
|
||||
const TableForm = defineAsyncComponent(() => import('./enrolplantemplate-form.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const addOrUpdateRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const addOrUpdateRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const exportLoading = ref(false)
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 字典数据
|
||||
const { yes_no_type: isDjList } = useDict('yes_no_type')
|
||||
const { yes_no_type: isDjList } = useDict('yes_no_type');
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const schoolList = ref<any[]>([])
|
||||
const planMajorList = ref<any[]>([])
|
||||
const planList = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
const schoolList = ref<any[]>([]);
|
||||
const planMajorList = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
deptCode: '',
|
||||
isDj: '',
|
||||
djName: '',
|
||||
name: '',
|
||||
schoolId: '',
|
||||
planMajorOne: ''
|
||||
})
|
||||
groupId: '',
|
||||
deptCode: '',
|
||||
isDj: '',
|
||||
djName: '',
|
||||
name: '',
|
||||
schoolId: '',
|
||||
planMajorOne: '',
|
||||
});
|
||||
|
||||
// 获取专业名称
|
||||
const getMajorName = (majorId: string) => {
|
||||
const item = planMajorList.value.find(item => item.id === majorId)
|
||||
return item ? item.majorName : ''
|
||||
}
|
||||
const item = planMajorList.value.find((item) => item.id === majorId);
|
||||
return item ? item.majorName : '';
|
||||
};
|
||||
|
||||
// 获取学校名称
|
||||
const getSchoolName = (schoolId: string) => {
|
||||
const item = schoolList.value.find(item => item.id === schoolId)
|
||||
return item ? item.schoolName : ''
|
||||
}
|
||||
const item = schoolList.value.find((item) => item.id === schoolId);
|
||||
return item ? item.schoolName : '';
|
||||
};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
// 获取部门列表
|
||||
const deptData = await getDeptListByLevelTwo()
|
||||
deptList.value = deptData.data || []
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList()
|
||||
planList.value = planData.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
await getMajor(queryForm.groupId)
|
||||
|
||||
// 获取学校列表
|
||||
const schoolData = await schoolListApi({ groupId: queryForm.groupId })
|
||||
schoolList.value = schoolData.data || []
|
||||
}
|
||||
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
message.error('初始化失败')
|
||||
}
|
||||
}
|
||||
try {
|
||||
// 获取部门列表
|
||||
const deptData = await getDeptListByLevelTwo();
|
||||
deptList.value = deptData.data || [];
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList();
|
||||
planList.value = planData.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
await getMajor(queryForm.groupId);
|
||||
|
||||
// 获取学校列表
|
||||
const schoolData = await schoolListApi({ groupId: queryForm.groupId });
|
||||
schoolList.value = schoolData.data || [];
|
||||
}
|
||||
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
message.error('初始化失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 招生计划改变
|
||||
const changeG = async () => {
|
||||
if (queryForm.groupId) {
|
||||
await getMajor(queryForm.groupId)
|
||||
const schoolData = await schoolListApi({ groupId: queryForm.groupId })
|
||||
schoolList.value = schoolData.data || []
|
||||
}
|
||||
}
|
||||
if (queryForm.groupId) {
|
||||
await getMajor(queryForm.groupId);
|
||||
const schoolData = await schoolListApi({ groupId: queryForm.groupId });
|
||||
schoolList.value = schoolData.data || [];
|
||||
}
|
||||
};
|
||||
|
||||
// 获取专业列表
|
||||
const getMajor = async (groupId: string) => {
|
||||
try {
|
||||
const data = await listcz({ groupId })
|
||||
planMajorList.value = data.data || []
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
message.error('获取专业列表失败')
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await listcz({ groupId });
|
||||
planMajorList.value = data.data || [];
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
message.error('获取专业列表失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 新增 / 修改
|
||||
const addOrUpdateHandle = (id?: string | null) => {
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id ?? null)
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id ?? null);
|
||||
});
|
||||
};
|
||||
|
||||
// 确认对接
|
||||
const handllSureDj = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认已对接?请谨慎操作')
|
||||
await sureDJ({ id, isDj: '1' })
|
||||
message.success('确认成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认已对接?请谨慎操作');
|
||||
await sureDJ({ id, isDj: '1' });
|
||||
message.success('确认成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delObj(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delObj(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
queryForm.deptCode = ''
|
||||
queryForm.isDj = ''
|
||||
queryForm.djName = ''
|
||||
queryForm.name = ''
|
||||
queryForm.schoolId = ''
|
||||
queryForm.planMajorOne = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
queryForm.deptCode = '';
|
||||
queryForm.isDj = '';
|
||||
queryForm.djName = '';
|
||||
queryForm.name = '';
|
||||
queryForm.schoolId = '';
|
||||
queryForm.planMajorOne = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 导出
|
||||
const dataExportHandle = async () => {
|
||||
exportLoading.value = true
|
||||
exportPreStuSuccess(queryForm).then((res:any)=>{
|
||||
message.success('导出后台执行中,请稍后查看下载任务')
|
||||
exportLoading.value = false
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
exportLoading.value = true;
|
||||
exportPreStuSuccess(queryForm).then((res: any) => {
|
||||
message.success('导出后台执行中,请稍后查看下载任务');
|
||||
exportLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 编辑审核人员
|
||||
const editExam = () => {
|
||||
// 如果组件已经加载,立即初始化
|
||||
if (PreExamPeopleIndexRef.value && typeof PreExamPeopleIndexRef.value.init === 'function') {
|
||||
nextTick(() => {
|
||||
try {
|
||||
PreExamPeopleIndexRef.value.init();
|
||||
} catch (error: any) {
|
||||
message.error('初始化预登记人员弹窗失败:' + (error.message || '未知错误'));
|
||||
}
|
||||
});
|
||||
}
|
||||
// 否则等待 watch 监听器处理
|
||||
// 如果组件已经加载,立即初始化
|
||||
if (PreExamPeopleIndexRef.value && typeof PreExamPeopleIndexRef.value.init === 'function') {
|
||||
nextTick(() => {
|
||||
try {
|
||||
PreExamPeopleIndexRef.value.init();
|
||||
} catch (error: any) {
|
||||
message.error('初始化预登记人员弹窗失败:' + (error.message || '未知错误'));
|
||||
}
|
||||
});
|
||||
}
|
||||
// 否则等待 watch 监听器处理
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.contact-cell {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
justify-content: center;
|
||||
white-space: nowrap;
|
||||
|
||||
.contact-name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
white-space: nowrap;
|
||||
|
||||
.contact-icon {
|
||||
color: #909399;
|
||||
font-size: 14px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.contact-text {
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.time-text {
|
||||
font-size: 12px;
|
||||
color: var(--el-color-primary);
|
||||
white-space: nowrap;
|
||||
}
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
justify-content: center;
|
||||
white-space: nowrap;
|
||||
|
||||
.contact-name {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 6px;
|
||||
white-space: nowrap;
|
||||
|
||||
.contact-icon {
|
||||
color: #909399;
|
||||
font-size: 14px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.contact-text {
|
||||
font-weight: 500;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.time-text {
|
||||
font-size: 12px;
|
||||
color: var(--el-color-primary);
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
color: #c0c4cc;
|
||||
color: #c0c4cc;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,145 +1,136 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="handleFilter">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="handleFilter">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="state.loading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="majorName" header-align="center" align="center" label="专业" />
|
||||
<el-table-column prop="number" header-align="center" align="center" label="人数" />
|
||||
<el-table-column prop="rate" header-align="center" align="center" label="占比" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="state.loading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="majorName" header-align="center" align="center" label="专业" />
|
||||
<el-table-column prop="number" header-align="center" align="center" label="人数" />
|
||||
<el-table-column prop="rate" header-align="center" align="center" label="占比" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitprestudent-static">
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { useUserInfo } from '/@/stores/userInfo'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { fetchListStatic } from '/@/api/recruit/recruitprestudent'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, computed, onMounted } from 'vue';
|
||||
import { storeToRefs } from 'pinia';
|
||||
import { useUserInfo } from '/@/stores/userInfo';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { fetchListStatic } from '/@/api/recruit/recruitprestudent';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
// @ts-ignore
|
||||
import global from '/@/components/tools/commondict.vue'
|
||||
import global from '/@/components/tools/commondict.vue';
|
||||
|
||||
// 使用 Pinia store
|
||||
const userInfoStore = useUserInfo()
|
||||
const { userInfos } = storeToRefs(userInfoStore)
|
||||
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
|
||||
})
|
||||
const perms: Record<string, boolean> = {};
|
||||
userInfos.value.authBtnList.forEach((perm: string) => {
|
||||
perms[perm] = true;
|
||||
});
|
||||
return perms;
|
||||
});
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const planList = ref<any[]>([])
|
||||
const exportLoading = ref(false)
|
||||
const planList = ref<any[]>([]);
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchListStatic(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data || [],
|
||||
total: response.data?.length || 0
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchListStatic(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data || [],
|
||||
total: response.data?.length || 0,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, tableStyle, downBlobFile } = useTable(state)
|
||||
const { getDataList, tableStyle, downBlobFile } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
getDataList()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
getDataList();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 导出
|
||||
const dataExportHandle = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
await downBlobFile(
|
||||
'/recruit/recruitprestudent/staticExport',
|
||||
queryForm,
|
||||
'预登记统计.xls'
|
||||
)
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
await downBlobFile('/recruit/recruitprestudent/staticExport', queryForm, '预登记统计.xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,147 +1,140 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="!dataForm.id ? '新增' : '修改'"
|
||||
:close-on-click-modal="false"
|
||||
width="600px"
|
||||
v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true" placeholder="请选择招生计划">
|
||||
<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="schoolName">
|
||||
<el-input v-model="dataForm.schoolName" placeholder="学校名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校代码" prop="schoolCode">
|
||||
<el-input v-model="dataForm.schoolCode" placeholder="学校代码"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-dialog :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" width="600px" v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!dataForm.id ? false : true" placeholder="请选择招生计划">
|
||||
<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="schoolName">
|
||||
<el-input v-model="dataForm.schoolName" placeholder="学校名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校代码" prop="schoolCode">
|
||||
<el-input v-model="dataForm.schoolCode" placeholder="学校代码"></el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitschoolcode.ts'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitschoolcode.ts';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const planList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const planList = ref<any[]>([]);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
groupId: "",
|
||||
schoolName: "",
|
||||
schoolCode: "",
|
||||
area: ""
|
||||
})
|
||||
id: '',
|
||||
groupId: '',
|
||||
schoolName: '',
|
||||
schoolCode: '',
|
||||
area: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'blur' },
|
||||
],
|
||||
schoolName: [
|
||||
{ required: true, message: '学校名称不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '学校名称长度不大于20个字符', trigger: 'blur' }
|
||||
],
|
||||
schoolCode: [
|
||||
{ required: true, message: '学校代码不能为空', trigger: 'blur' },
|
||||
{ min: 4, max: 4, message: '学校代码长度为4个字符', trigger: 'blur' }
|
||||
],
|
||||
}
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'blur' }],
|
||||
schoolName: [
|
||||
{ required: true, message: '学校名称不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '学校名称长度不大于20个字符', trigger: 'blur' },
|
||||
],
|
||||
schoolCode: [
|
||||
{ required: true, message: '学校代码不能为空', trigger: 'blur' },
|
||||
{ min: 4, max: 4, message: '学校代码长度为4个字符', trigger: 'blur' },
|
||||
],
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
if (!dataForm.id) {
|
||||
dataForm.groupId = planList.value[0]?.id || null
|
||||
}
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
if (!dataForm.id) {
|
||||
dataForm.groupId = planList.value[0]?.id || null;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
addObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
addObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
dataForm.id = id || null
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
initData()
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
if (dataForm.area) {
|
||||
dataForm.area = String(dataForm.area)
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
dataForm.id = id || null;
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
initData();
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
if (dataForm.area) {
|
||||
dataForm.area = String(dataForm.area);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,341 +16,299 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校名称" prop="schoolName">
|
||||
<el-input v-model="queryForm.schoolName" clearable placeholder="学校名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="学校代码" prop="schoolCode">
|
||||
<el-input v-model="queryForm.schoolCode" clearable placeholder="学校代码" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校名称" prop="schoolName">
|
||||
<el-input v-model="queryForm.schoolName" clearable placeholder="学校名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="学校代码" prop="schoolCode">
|
||||
<el-input v-model="queryForm.schoolCode" clearable placeholder="学校代码" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitschoolcode_add')"
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="addOrUpdateHandle()"
|
||||
>
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitschoolcode_add')"
|
||||
type="primary"
|
||||
plain
|
||||
icon="UploadFilled"
|
||||
class="ml10"
|
||||
@click="handleExportIn"
|
||||
>
|
||||
导入
|
||||
</el-button>
|
||||
</div>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruit_recruitschoolcode_add')" type="primary" icon="FolderAdd" @click="addOrUpdateHandle()"> 新增 </el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitschoolcode_add')" type="primary" plain icon="UploadFilled" class="ml10" @click="handleExportIn">
|
||||
导入
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="groupId" label="招生计划名称" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getPlanName(scope.row.groupId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="schoolCode" label="学校代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="schoolName" label="学校名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitschoolcode_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitschoolcode_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="groupId" label="招生计划名称" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getPlanName(scope.row.groupId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="schoolCode" label="学校代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="schoolName" label="学校名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_recruitschoolcode_edit')" type="primary" link icon="EditPen" @click="addOrUpdateHandle(scope.row.id)">
|
||||
修改
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitschoolcode_del')" type="danger" link icon="Delete" @click="deleteHandle(scope.row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
|
||||
<!-- 导入弹窗 -->
|
||||
<el-dialog v-model="dialogViewVisible" title="导入学校代码" append-to-body width="600px">
|
||||
<el-form :model="exportForm" inline>
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="exportForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<!-- 导入弹窗 -->
|
||||
<el-dialog v-model="dialogViewVisible" title="导入学校代码" append-to-body width="600px">
|
||||
<el-form :model="exportForm" inline>
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="exportForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-upload
|
||||
class="upload-container"
|
||||
ref="uploadFormRef"
|
||||
action="doUpload"
|
||||
:limit="1"
|
||||
:file-list="fileList"
|
||||
:before-upload="beforeUpload"
|
||||
>
|
||||
<template #trigger>
|
||||
<el-button type="primary">选取文件</el-button>
|
||||
</template>
|
||||
<a href="schoolCode.xlsx" rel="external nofollow" download="常州中学代码模版">
|
||||
<el-button type="success" class="ml10">下载模板</el-button>
|
||||
</a>
|
||||
<template #tip>
|
||||
<div class="el-upload__tip">只能上传excel文件,且不超过5MB</div>
|
||||
<div class="el-upload-list__item-name">{{ fileName }}</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
<el-upload class="upload-container" ref="uploadFormRef" action="doUpload" :limit="1" :file-list="fileList" :before-upload="beforeUpload">
|
||||
<template #trigger>
|
||||
<el-button type="primary">选取文件</el-button>
|
||||
</template>
|
||||
<a href="schoolCode.xlsx" rel="external nofollow" download="常州中学代码模版">
|
||||
<el-button type="success" class="ml10">下载模板</el-button>
|
||||
</a>
|
||||
<template #tip>
|
||||
<div class="el-upload__tip">只能上传excel文件,且不超过5MB</div>
|
||||
<div class="el-upload-list__item-name">{{ fileName }}</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogViewVisible = false; impoerLoadinBtn = false">取消</el-button>
|
||||
<el-button type="primary" @click="submitUpload" :loading="impoerLoadinBtn">导入</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button
|
||||
@click="
|
||||
dialogViewVisible = false;
|
||||
impoerLoadinBtn = false;
|
||||
"
|
||||
>取消</el-button
|
||||
>
|
||||
<el-button type="primary" @click="submitUpload" :loading="impoerLoadinBtn">导入</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitschoolcode">
|
||||
import { ref, reactive, onMounted, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { delObj, fetchList } from '/@/api/recruit/recruitschoolcode'
|
||||
import request from '/@/utils/request'
|
||||
import { ref, reactive, onMounted, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { delObj, fetchList } from '/@/api/recruit/recruitschoolcode';
|
||||
import request from '/@/utils/request';
|
||||
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const addOrUpdateRef = ref()
|
||||
const uploadFormRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const addOrUpdateRef = ref();
|
||||
const uploadFormRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const dialogViewVisible = ref(false)
|
||||
const impoerLoadinBtn = ref(false)
|
||||
const dialogViewVisible = ref(false);
|
||||
const impoerLoadinBtn = ref(false);
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const fileList = ref<any[]>([])
|
||||
const fileName = ref('')
|
||||
const files = ref<File | null>(null)
|
||||
const planList = ref<any[]>([]);
|
||||
const fileList = ref<any[]>([]);
|
||||
const fileName = ref('');
|
||||
const files = ref<File | null>(null);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
schoolName: '',
|
||||
schoolCode: ''
|
||||
})
|
||||
groupId: '',
|
||||
schoolName: '',
|
||||
schoolCode: '',
|
||||
});
|
||||
|
||||
// 导出表单
|
||||
const exportForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 获取计划名称
|
||||
const getPlanName = (groupId: string) => {
|
||||
const item = planList.value.find(item => item.id === groupId)
|
||||
return item ? item.groupName : ''
|
||||
}
|
||||
const item = planList.value.find((item) => item.id === groupId);
|
||||
return item ? item.groupName : '';
|
||||
};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
};
|
||||
|
||||
// 上传验证
|
||||
const beforeUpload = (file: File) => {
|
||||
const fileLast = file.name.split('.')
|
||||
const extension = fileLast[fileLast.length - 1] === 'xls'
|
||||
const extension2 = fileLast[fileLast.length - 1] === 'xlsx'
|
||||
const isLt2M = file.size / 1024 / 1024 < 5
|
||||
|
||||
if (!extension && !extension2) {
|
||||
message.warning('上传模板只能是 xls、xlsx格式!')
|
||||
return false
|
||||
}
|
||||
if (!isLt2M) {
|
||||
message.warning('上传模板大小不能超过 5MB!')
|
||||
return false
|
||||
}
|
||||
fileName.value = file.name
|
||||
files.value = file
|
||||
return false // 返回false不会自动上传
|
||||
}
|
||||
const fileLast = file.name.split('.');
|
||||
const extension = fileLast[fileLast.length - 1] === 'xls';
|
||||
const extension2 = fileLast[fileLast.length - 1] === 'xlsx';
|
||||
const isLt2M = file.size / 1024 / 1024 < 5;
|
||||
|
||||
if (!extension && !extension2) {
|
||||
message.warning('上传模板只能是 xls、xlsx格式!');
|
||||
return false;
|
||||
}
|
||||
if (!isLt2M) {
|
||||
message.warning('上传模板大小不能超过 5MB!');
|
||||
return false;
|
||||
}
|
||||
fileName.value = file.name;
|
||||
files.value = file;
|
||||
return false; // 返回false不会自动上传
|
||||
};
|
||||
|
||||
// 提交上传
|
||||
const submitUpload = async () => {
|
||||
if (fileName.value === '') {
|
||||
message.warning('请选择要上传的文件!')
|
||||
return
|
||||
}
|
||||
if (exportForm.groupId === '') {
|
||||
message.warning('请选择招生计划!')
|
||||
return
|
||||
}
|
||||
|
||||
impoerLoadinBtn.value = true
|
||||
try {
|
||||
const fileFormData = new FormData()
|
||||
fileFormData.append('file', files.value!, fileName.value)
|
||||
|
||||
const res = await request({
|
||||
method: 'post',
|
||||
url: `/recruit/recruitschoolcode/exportSchoolCode?groupId=${exportForm.groupId}`,
|
||||
data: fileFormData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
|
||||
if (res.data === 'fail') {
|
||||
message.error('请上传正确的学校代码模板')
|
||||
return
|
||||
}
|
||||
if (res.data && res.data === 0) {
|
||||
message.error(res.data.msg)
|
||||
} else if (res.data && res.data === 10) {
|
||||
message.error(res.data.msg)
|
||||
} else {
|
||||
message.success('操作成功')
|
||||
dialogViewVisible.value = false
|
||||
state.pagination!.current = 1
|
||||
getDataList()
|
||||
}
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导入失败')
|
||||
} finally {
|
||||
impoerLoadinBtn.value = false
|
||||
}
|
||||
}
|
||||
if (fileName.value === '') {
|
||||
message.warning('请选择要上传的文件!');
|
||||
return;
|
||||
}
|
||||
if (exportForm.groupId === '') {
|
||||
message.warning('请选择招生计划!');
|
||||
return;
|
||||
}
|
||||
|
||||
impoerLoadinBtn.value = true;
|
||||
try {
|
||||
const fileFormData = new FormData();
|
||||
fileFormData.append('file', files.value!, fileName.value);
|
||||
|
||||
const res = await request({
|
||||
method: 'post',
|
||||
url: `/recruit/recruitschoolcode/exportSchoolCode?groupId=${exportForm.groupId}`,
|
||||
data: fileFormData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data',
|
||||
},
|
||||
});
|
||||
|
||||
if (res.data === 'fail') {
|
||||
message.error('请上传正确的学校代码模板');
|
||||
return;
|
||||
}
|
||||
if (res.data && res.data === 0) {
|
||||
message.error(res.data.msg);
|
||||
} else if (res.data && res.data === 10) {
|
||||
message.error(res.data.msg);
|
||||
} else {
|
||||
message.success('操作成功');
|
||||
dialogViewVisible.value = false;
|
||||
state.pagination!.current = 1;
|
||||
getDataList();
|
||||
}
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导入失败');
|
||||
} finally {
|
||||
impoerLoadinBtn.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 导入
|
||||
const handleExportIn = () => {
|
||||
fileName.value = ''
|
||||
exportForm.groupId = ''
|
||||
dialogViewVisible.value = true
|
||||
}
|
||||
fileName.value = '';
|
||||
exportForm.groupId = '';
|
||||
dialogViewVisible.value = true;
|
||||
};
|
||||
|
||||
// 新增 / 修改
|
||||
const addOrUpdateHandle = (id: string | null = null) => {
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id)
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id);
|
||||
});
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delObj(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delObj(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
queryForm.schoolName = ''
|
||||
queryForm.schoolCode = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
queryForm.schoolName = '';
|
||||
queryForm.schoolCode = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -16,292 +16,264 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline class="mb-4">
|
||||
<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-form-item>
|
||||
<el-form-item v-if="hasAuth('recruit_recruitstudentplan_add')">
|
||||
<el-button type="primary" icon="FolderAdd" class="ml10" @click="handleAdd">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline class="mb-4">
|
||||
<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-form-item>
|
||||
<el-form-item v-if="hasAuth('recruit_recruitstudentplan_add')">
|
||||
<el-button type="primary" icon="FolderAdd" class="ml10" @click="handleAdd">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="majorCode" label="专业代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="deptCode" label="系部" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentNum" label="拟招人数(不限男女)和拟招男女生数互斥" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentBoyNum" label="拟招男生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentGirlNum" label="拟招女生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentOverNum" label="拟招过载人数(不限男女) 和拟招过载男女生数互斥" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentOverBoyNum" label="拟招过载男生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentOverGirlNum" label="拟招过载女生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="scoreLine" label="录取分数线" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="scoreMinLine" label="最低录取分数线" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="planStudentNum" label="计划招生人数(不限男女)" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="planStudentBoyNum" label="计划招生男生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="planStudentGirlNum" label="计划招生女生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="degreeOfEducation" label="生源" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="scoreFeeConf" label="捐资助学费配置" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="tuition" label="学费配置,和生源对应" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="remarks" label="备注信息" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplan_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleEdit(scope.row)"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplan_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="majorCode" label="专业代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="deptCode" label="系部" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentNum" label="拟招人数(不限男女)和拟招男女生数互斥" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentBoyNum" label="拟招男生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentGirlNum" label="拟招女生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentOverNum" label="拟招过载人数(不限男女) 和拟招过载男女生数互斥" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentOverBoyNum" label="拟招过载男生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="needStudentOverGirlNum" label="拟招过载女生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="scoreLine" label="录取分数线" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="scoreMinLine" label="最低录取分数线" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="planStudentNum" label="计划招生人数(不限男女)" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="planStudentBoyNum" label="计划招生男生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="planStudentGirlNum" label="计划招生女生数" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="degreeOfEducation" label="生源" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="scoreFeeConf" label="捐资助学费配置" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="tuition" label="学费配置,和生源对应" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="remarks" label="备注信息" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button v-if="hasAuth('recruit_recruitstudentplan_edit')" type="primary" link icon="EditPen" @click="handleEdit(scope.row)">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitstudentplan_del')" type="danger" link icon="Delete" @click="handleDel(scope.row)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 新增/编辑弹窗 -->
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="form.id ? '编辑' : '新增'"
|
||||
width="600px"
|
||||
:close-on-click-modal="false"
|
||||
destroy-on-close
|
||||
>
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
:rules="formRules"
|
||||
label-width="180px"
|
||||
>
|
||||
<el-form-item label="专业代码" prop="majorCode">
|
||||
<el-input v-model="form.majorCode" placeholder="请输入专业代码" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="系部" prop="deptCode">
|
||||
<el-input v-model="form.deptCode" placeholder="请输入系部" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招人数(不限男女)" prop="needStudentNum">
|
||||
<el-input-number v-model="form.needStudentNum" :min="0" placeholder="请输入拟招人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招男生数" prop="needStudentBoyNum">
|
||||
<el-input-number v-model="form.needStudentBoyNum" :min="0" placeholder="请输入拟招男生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招女生数" prop="needStudentGirlNum">
|
||||
<el-input-number v-model="form.needStudentGirlNum" :min="0" placeholder="请输入拟招女生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招过载人数(不限男女)" prop="needStudentOverNum">
|
||||
<el-input-number v-model="form.needStudentOverNum" :min="0" placeholder="请输入拟招过载人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招过载男生数" prop="needStudentOverBoyNum">
|
||||
<el-input-number v-model="form.needStudentOverBoyNum" :min="0" placeholder="请输入拟招过载男生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招过载女生数" prop="needStudentOverGirlNum">
|
||||
<el-input-number v-model="form.needStudentOverGirlNum" :min="0" placeholder="请输入拟招过载女生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="录取分数线" prop="scoreLine">
|
||||
<el-input-number v-model="form.scoreLine" :min="0" placeholder="请输入录取分数线" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="最低录取分数线" prop="scoreMinLine">
|
||||
<el-input-number v-model="form.scoreMinLine" :min="0" placeholder="请输入最低录取分数线" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划招生人数(不限男女)" prop="planStudentNum">
|
||||
<el-input-number v-model="form.planStudentNum" :min="0" placeholder="请输入计划招生人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划招生男生数" prop="planStudentBoyNum">
|
||||
<el-input-number v-model="form.planStudentBoyNum" :min="0" placeholder="请输入计划招生男生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划招生女生数" prop="planStudentGirlNum">
|
||||
<el-input-number v-model="form.planStudentGirlNum" :min="0" placeholder="请输入计划招生女生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="生源" prop="degreeOfEducation">
|
||||
<el-input v-model="form.degreeOfEducation" placeholder="请输入生源" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="捐资助学费配置" prop="scoreFeeConf">
|
||||
<el-input v-model="form.scoreFeeConf" placeholder="请输入捐资助学费配置" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="学费配置,和生源对应" prop="tuition">
|
||||
<el-input v-model="form.tuition" placeholder="请输入学费配置" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注信息" prop="remarks">
|
||||
<el-input v-model="form.remarks" type="textarea" :rows="3" placeholder="请输入备注信息" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 新增/编辑弹窗 -->
|
||||
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑' : '新增'" width="600px" :close-on-click-modal="false" destroy-on-close>
|
||||
<el-form ref="formRef" :model="form" :rules="formRules" label-width="180px">
|
||||
<el-form-item label="专业代码" prop="majorCode">
|
||||
<el-input v-model="form.majorCode" placeholder="请输入专业代码" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="系部" prop="deptCode">
|
||||
<el-input v-model="form.deptCode" placeholder="请输入系部" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招人数(不限男女)" prop="needStudentNum">
|
||||
<el-input-number v-model="form.needStudentNum" :min="0" placeholder="请输入拟招人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招男生数" prop="needStudentBoyNum">
|
||||
<el-input-number v-model="form.needStudentBoyNum" :min="0" placeholder="请输入拟招男生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招女生数" prop="needStudentGirlNum">
|
||||
<el-input-number v-model="form.needStudentGirlNum" :min="0" placeholder="请输入拟招女生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招过载人数(不限男女)" prop="needStudentOverNum">
|
||||
<el-input-number v-model="form.needStudentOverNum" :min="0" placeholder="请输入拟招过载人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招过载男生数" prop="needStudentOverBoyNum">
|
||||
<el-input-number v-model="form.needStudentOverBoyNum" :min="0" placeholder="请输入拟招过载男生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="拟招过载女生数" prop="needStudentOverGirlNum">
|
||||
<el-input-number v-model="form.needStudentOverGirlNum" :min="0" placeholder="请输入拟招过载女生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="录取分数线" prop="scoreLine">
|
||||
<el-input-number v-model="form.scoreLine" :min="0" placeholder="请输入录取分数线" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="最低录取分数线" prop="scoreMinLine">
|
||||
<el-input-number v-model="form.scoreMinLine" :min="0" placeholder="请输入最低录取分数线" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划招生人数(不限男女)" prop="planStudentNum">
|
||||
<el-input-number v-model="form.planStudentNum" :min="0" placeholder="请输入计划招生人数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划招生男生数" prop="planStudentBoyNum">
|
||||
<el-input-number v-model="form.planStudentBoyNum" :min="0" placeholder="请输入计划招生男生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="计划招生女生数" prop="planStudentGirlNum">
|
||||
<el-input-number v-model="form.planStudentGirlNum" :min="0" placeholder="请输入计划招生女生数" style="width: 100%" />
|
||||
</el-form-item>
|
||||
<el-form-item label="生源" prop="degreeOfEducation">
|
||||
<el-input v-model="form.degreeOfEducation" placeholder="请输入生源" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="捐资助学费配置" prop="scoreFeeConf">
|
||||
<el-input v-model="form.scoreFeeConf" placeholder="请输入捐资助学费配置" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="学费配置,和生源对应" prop="tuition">
|
||||
<el-input v-model="form.tuition" placeholder="请输入学费配置" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注信息" prop="remarks">
|
||||
<el-input v-model="form.remarks" type="textarea" :rows="3" placeholder="请输入备注信息" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentplan">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { addObj, delObj, fetchList, putObj } from '/@/api/recruit/recruitstudentplan'
|
||||
import { ref, reactive } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { addObj, delObj, fetchList, putObj } from '/@/api/recruit/recruitstudentplan';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const formRef = ref()
|
||||
const tableRef = ref();
|
||||
const formRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const dialogVisible = ref(false)
|
||||
const submitLoading = ref(false)
|
||||
const dialogVisible = ref(false);
|
||||
const submitLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({})
|
||||
const queryForm = reactive({});
|
||||
|
||||
// 表单数据
|
||||
const form = reactive({
|
||||
id: '',
|
||||
majorCode: '',
|
||||
deptCode: '',
|
||||
needStudentNum: undefined,
|
||||
needStudentBoyNum: undefined,
|
||||
needStudentGirlNum: undefined,
|
||||
needStudentOverNum: undefined,
|
||||
needStudentOverBoyNum: undefined,
|
||||
needStudentOverGirlNum: undefined,
|
||||
scoreLine: undefined,
|
||||
scoreMinLine: undefined,
|
||||
planStudentNum: undefined,
|
||||
planStudentBoyNum: undefined,
|
||||
planStudentGirlNum: undefined,
|
||||
degreeOfEducation: '',
|
||||
scoreFeeConf: '',
|
||||
tuition: '',
|
||||
remarks: ''
|
||||
})
|
||||
id: '',
|
||||
majorCode: '',
|
||||
deptCode: '',
|
||||
needStudentNum: undefined,
|
||||
needStudentBoyNum: undefined,
|
||||
needStudentGirlNum: undefined,
|
||||
needStudentOverNum: undefined,
|
||||
needStudentOverBoyNum: undefined,
|
||||
needStudentOverGirlNum: undefined,
|
||||
scoreLine: undefined,
|
||||
scoreMinLine: undefined,
|
||||
planStudentNum: undefined,
|
||||
planStudentBoyNum: undefined,
|
||||
planStudentGirlNum: undefined,
|
||||
degreeOfEducation: '',
|
||||
scoreFeeConf: '',
|
||||
tuition: '',
|
||||
remarks: '',
|
||||
});
|
||||
|
||||
// 表单验证规则
|
||||
const formRules = {}
|
||||
const formRules = {};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
Object.keys(queryForm).forEach(key => {
|
||||
queryForm[key] = ''
|
||||
})
|
||||
getDataList()
|
||||
}
|
||||
Object.keys(queryForm).forEach((key) => {
|
||||
queryForm[key] = '';
|
||||
});
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 新增
|
||||
const handleAdd = () => {
|
||||
Object.keys(form).forEach(key => {
|
||||
if (key === 'id') {
|
||||
form[key] = ''
|
||||
} else if (typeof form[key] === 'number') {
|
||||
form[key] = undefined
|
||||
} else {
|
||||
form[key] = ''
|
||||
}
|
||||
})
|
||||
dialogVisible.value = true
|
||||
}
|
||||
Object.keys(form).forEach((key) => {
|
||||
if (key === 'id') {
|
||||
form[key] = '';
|
||||
} else if (typeof form[key] === 'number') {
|
||||
form[key] = undefined;
|
||||
} else {
|
||||
form[key] = '';
|
||||
}
|
||||
});
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (row: any) => {
|
||||
Object.keys(form).forEach(key => {
|
||||
form[key] = row[key]
|
||||
})
|
||||
dialogVisible.value = true
|
||||
}
|
||||
Object.keys(form).forEach((key) => {
|
||||
form[key] = row[key];
|
||||
});
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
// 删除
|
||||
const handleDel = async (row: any) => {
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除ID为${row.id}的记录?`)
|
||||
await delObj(row.id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除ID为${row.id}的记录?`);
|
||||
await delObj(row.id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 提交表单
|
||||
const handleSubmit = async () => {
|
||||
if (!formRef.value) return
|
||||
|
||||
await formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true
|
||||
try {
|
||||
if (form.id) {
|
||||
await putObj(form)
|
||||
message.success('修改成功')
|
||||
} else {
|
||||
await addObj(form)
|
||||
message.success('添加成功')
|
||||
}
|
||||
dialogVisible.value = false
|
||||
getDataList()
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '操作失败')
|
||||
} finally {
|
||||
submitLoading.value = false
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
if (!formRef.value) return;
|
||||
|
||||
await formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true;
|
||||
try {
|
||||
if (form.id) {
|
||||
await putObj(form);
|
||||
message.success('修改成功');
|
||||
} else {
|
||||
await addObj(form);
|
||||
message.success('添加成功');
|
||||
}
|
||||
dialogVisible.value = false;
|
||||
getDataList();
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '操作失败');
|
||||
} finally {
|
||||
submitLoading.value = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 表格数据由 useTable(createdIsNeed 默认 true)在挂载时自动请求
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,158 +1,140 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="!dataForm.id ? '新增' : '修改'"
|
||||
:close-on-click-modal="false"
|
||||
width="600px"
|
||||
v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit"
|
||||
label-width="100px">
|
||||
<el-dialog :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" width="600px" v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" :disabled="!!dataForm.id">
|
||||
<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="regionId">
|
||||
<el-select v-model="dataForm.regionId" filterable placeholder="请选择地区">
|
||||
<el-option v-for="item in regionList" :key="item.code" :label="item.name" :value="item.code"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分数线" prop="fullScore">
|
||||
<el-input-number v-model="dataForm.fullScore" :min="0" :max="999"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" :disabled="!!dataForm.id">
|
||||
<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="regionId">
|
||||
<el-select v-model="dataForm.regionId" filterable placeholder="请选择地区">
|
||||
<el-option
|
||||
v-for="item in regionList"
|
||||
:key="item.code"
|
||||
:label="item.name"
|
||||
:value="item.code">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分数线" prop="fullScore">
|
||||
<el-input-number v-model="dataForm.fullScore" :min="0" :max="999"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" :disabled="!canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" :disabled="!canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitstudentplancorrectscoreconfig'
|
||||
import { areaList } from '/@/api/recruit/recruitstudentschool'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitstudentplancorrectscoreconfig';
|
||||
import { areaList } from '/@/api/recruit/recruitstudentschool';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const regionList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const regionList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "" as string | null,
|
||||
groupId: "",
|
||||
regionId: "",
|
||||
fullScore: null as number | null,
|
||||
regionName: ""
|
||||
})
|
||||
id: '' as string | null,
|
||||
groupId: '',
|
||||
regionId: '',
|
||||
fullScore: null as number | null,
|
||||
regionName: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'blur' }
|
||||
],
|
||||
regionId: [
|
||||
{ required: true, message: '地区不能为空', trigger: 'blur' }
|
||||
],
|
||||
fullScore: [
|
||||
{ required: true, message: '分数线不能为空', trigger: 'blur' }
|
||||
],
|
||||
}
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'blur' }],
|
||||
regionId: [{ required: true, message: '地区不能为空', trigger: 'blur' }],
|
||||
fullScore: [{ required: true, message: '分数线不能为空', trigger: 'blur' }],
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
})
|
||||
areaList({ type: "0", parentId: "11" }).then((data: any) => {
|
||||
regionList.value = data.data
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
});
|
||||
areaList({ type: '0', parentId: '11' }).then((data: any) => {
|
||||
regionList.value = data.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
regionList.value.forEach(e => {
|
||||
if (e.code == dataForm.regionId) {
|
||||
dataForm.regionName = e.name
|
||||
}
|
||||
})
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
addObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
regionList.value.forEach((e) => {
|
||||
if (e.code == dataForm.regionId) {
|
||||
dataForm.regionName = e.name;
|
||||
}
|
||||
});
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
addObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
dataForm.id = id || ""
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
nextTick(() => {
|
||||
initData()
|
||||
dataFormRef.value?.resetFields()
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
dataForm.id = id || '';
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
nextTick(() => {
|
||||
initData();
|
||||
dataFormRef.value?.resetFields();
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,212 +1,190 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplancorrectscoreconfig_add')"
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="addOrUpdateHandle"
|
||||
>
|
||||
新 增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-auth="'recruit_areascore_import'"
|
||||
type="primary"
|
||||
plain
|
||||
icon="UploadFilled"
|
||||
:loading="exportLoading"
|
||||
@click="handleImportDialog"
|
||||
>导入信息
|
||||
</el-button>
|
||||
</div>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruit_recruitstudentplancorrectscoreconfig_add')" type="primary" icon="FolderAdd" @click="addOrUpdateHandle">
|
||||
新 增
|
||||
</el-button>
|
||||
<el-button v-auth="'recruit_areascore_import'" type="primary" plain icon="UploadFilled" :loading="exportLoading" @click="handleImportDialog"
|
||||
>导入信息
|
||||
</el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="groupId" label="招生计划名称" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getPlanName(scope.row.groupId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="regionName" label="地区" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fullScore" label="分数线" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplancorrectscoreconfig_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplancorrectscoreconfig_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="groupId" label="招生计划名称" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getPlanName(scope.row.groupId) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="regionName" label="地区" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fullScore" label="分数线" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplancorrectscoreconfig_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplancorrectscoreconfig_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
|
||||
<import-recruit-info ref="ImportRecruitInfoRef" @refreshDataList="getDataList"></import-recruit-info>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<import-recruit-info ref="ImportRecruitInfoRef" @refreshDataList="getDataList"></import-recruit-info>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentplancorrectscoreconfig">
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { fetchList, delObj } from '/@/api/recruit/recruitstudentplancorrectscoreconfig'
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { fetchList, delObj } from '/@/api/recruit/recruitstudentplancorrectscoreconfig';
|
||||
const ImportRecruitInfo = defineAsyncComponent(() => import('/@/views/recruit/common/import-recruit-info.vue'));
|
||||
const ImportRecruitInfoRef=ref<any>();
|
||||
const ImportRecruitInfoRef = ref<any>();
|
||||
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const addOrUpdateRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const addOrUpdateRef = ref();
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const planList = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 获取计划名称
|
||||
const getPlanName = (groupId: string) => {
|
||||
const item = planList.value.find(item => item.id === groupId)
|
||||
return item ? item.groupName : ''
|
||||
}
|
||||
const item = planList.value.find((item) => item.id === groupId);
|
||||
return item ? item.groupName : '';
|
||||
};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
};
|
||||
|
||||
// 新增 / 修改
|
||||
const addOrUpdateHandle = (payload?: string | MouseEvent) => {
|
||||
// 新增按钮未传参时会传入 MouseEvent,这里统一转换为 id 或 null
|
||||
const id = typeof payload === 'string' ? payload : null
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id)
|
||||
})
|
||||
}
|
||||
// 新增按钮未传参时会传入 MouseEvent,这里统一转换为 id 或 null
|
||||
const id = typeof payload === 'string' ? payload : null;
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id);
|
||||
});
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delObj(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delObj(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
const exportLoading = ref(false);
|
||||
|
||||
const handleImportDialog = () => {
|
||||
ImportRecruitInfoRef.value?.init("R10002");
|
||||
ImportRecruitInfoRef.value?.init('R10002');
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -16,222 +16,206 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline class="mb-4">
|
||||
<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-form-item>
|
||||
<el-form-item v-if="hasAuth('recruit_recruitstudentplandegreeofeducation_add')">
|
||||
<el-button type="primary" icon="FolderAdd" class="ml10" @click="handleAdd">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline class="mb-4">
|
||||
<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-form-item>
|
||||
<el-form-item v-if="hasAuth('recruit_recruitstudentplandegreeofeducation_add')">
|
||||
<el-button type="primary" icon="FolderAdd" class="ml10" @click="handleAdd">新增</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="planId" label="计划明细ID" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="degreeOfEducation" label="生源" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="remarks" label="备注信息" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createBy" label="创建者" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createDate" label="创建时间" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplandegreeofeducation_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleEdit(scope.row)"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplandegreeofeducation_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="planId" label="计划明细ID" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="degreeOfEducation" label="生源" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="remarks" label="备注信息" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createBy" label="创建者" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createDate" label="创建时间" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplandegreeofeducation_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleEdit(scope.row)"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentplandegreeofeducation_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 新增/编辑弹窗 -->
|
||||
<el-dialog
|
||||
v-model="dialogVisible"
|
||||
:title="form.id ? '编辑' : '新增'"
|
||||
width="600px"
|
||||
:close-on-click-modal="false"
|
||||
destroy-on-close
|
||||
>
|
||||
<el-form
|
||||
ref="formRef"
|
||||
:model="form"
|
||||
:rules="formRules"
|
||||
label-width="120px"
|
||||
>
|
||||
<el-form-item label="计划明细ID" prop="planId">
|
||||
<el-input v-model="form.planId" placeholder="请输入计划明细ID" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="生源" prop="degreeOfEducation">
|
||||
<el-input v-model="form.degreeOfEducation" placeholder="请输入生源" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注信息" prop="remarks">
|
||||
<el-input v-model="form.remarks" type="textarea" :rows="3" placeholder="请输入备注信息" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 新增/编辑弹窗 -->
|
||||
<el-dialog v-model="dialogVisible" :title="form.id ? '编辑' : '新增'" width="600px" :close-on-click-modal="false" destroy-on-close>
|
||||
<el-form ref="formRef" :model="form" :rules="formRules" label-width="120px">
|
||||
<el-form-item label="计划明细ID" prop="planId">
|
||||
<el-input v-model="form.planId" placeholder="请输入计划明细ID" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="生源" prop="degreeOfEducation">
|
||||
<el-input v-model="form.degreeOfEducation" placeholder="请输入生源" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="备注信息" prop="remarks">
|
||||
<el-input v-model="form.remarks" type="textarea" :rows="3" placeholder="请输入备注信息" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取消</el-button>
|
||||
<el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentplandegreeofeducation">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { addObj, delObj, fetchList, putObj } from '/@/api/recruit/recruitstudentplandegreeofeducation'
|
||||
import { ref, reactive } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { addObj, delObj, fetchList, putObj } from '/@/api/recruit/recruitstudentplandegreeofeducation';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const formRef = ref()
|
||||
const tableRef = ref();
|
||||
const formRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const dialogVisible = ref(false)
|
||||
const submitLoading = ref(false)
|
||||
const dialogVisible = ref(false);
|
||||
const submitLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({})
|
||||
const queryForm = reactive({});
|
||||
|
||||
// 表单数据
|
||||
const form = reactive({
|
||||
id: '',
|
||||
planId: '',
|
||||
degreeOfEducation: '',
|
||||
remarks: ''
|
||||
})
|
||||
id: '',
|
||||
planId: '',
|
||||
degreeOfEducation: '',
|
||||
remarks: '',
|
||||
});
|
||||
|
||||
// 表单验证规则
|
||||
const formRules = {}
|
||||
const formRules = {};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
Object.keys(queryForm).forEach(key => {
|
||||
queryForm[key] = ''
|
||||
})
|
||||
getDataList()
|
||||
}
|
||||
Object.keys(queryForm).forEach((key) => {
|
||||
queryForm[key] = '';
|
||||
});
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 新增
|
||||
const handleAdd = () => {
|
||||
Object.keys(form).forEach(key => {
|
||||
if (key === 'id') {
|
||||
form[key] = ''
|
||||
} else {
|
||||
form[key] = ''
|
||||
}
|
||||
})
|
||||
dialogVisible.value = true
|
||||
}
|
||||
Object.keys(form).forEach((key) => {
|
||||
if (key === 'id') {
|
||||
form[key] = '';
|
||||
} else {
|
||||
form[key] = '';
|
||||
}
|
||||
});
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
// 编辑
|
||||
const handleEdit = async (row: any) => {
|
||||
Object.keys(form).forEach(key => {
|
||||
form[key] = row[key]
|
||||
})
|
||||
dialogVisible.value = true
|
||||
}
|
||||
Object.keys(form).forEach((key) => {
|
||||
form[key] = row[key];
|
||||
});
|
||||
dialogVisible.value = true;
|
||||
};
|
||||
|
||||
// 删除
|
||||
const handleDel = async (row: any) => {
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除ID为${row.id}的记录?`)
|
||||
await delObj(row.id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除ID为${row.id}的记录?`);
|
||||
await delObj(row.id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 提交表单
|
||||
const handleSubmit = async () => {
|
||||
if (!formRef.value) return
|
||||
|
||||
await formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true
|
||||
try {
|
||||
if (form.id) {
|
||||
await putObj(form)
|
||||
message.success('修改成功')
|
||||
} else {
|
||||
await addObj(form)
|
||||
message.success('添加成功')
|
||||
}
|
||||
dialogVisible.value = false
|
||||
getDataList()
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '操作失败')
|
||||
} finally {
|
||||
submitLoading.value = false
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
if (!formRef.value) return;
|
||||
|
||||
await formRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true;
|
||||
try {
|
||||
if (form.id) {
|
||||
await putObj(form);
|
||||
message.success('修改成功');
|
||||
} else {
|
||||
await addObj(form);
|
||||
message.success('添加成功');
|
||||
}
|
||||
dialogVisible.value = false;
|
||||
getDataList();
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '操作失败');
|
||||
} finally {
|
||||
submitLoading.value = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 表格数据由 useTable(createdIsNeed 默认 true)在挂载时自动请求
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,322 +1,285 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="dataForm.id ? '修改' : '新增'"
|
||||
:close-on-click-modal="false"
|
||||
width="600px"
|
||||
v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px">
|
||||
<el-form-item label="年份" prop="year">
|
||||
<el-date-picker
|
||||
v-model="dataForm.year"
|
||||
type="year"
|
||||
format="YYYY"
|
||||
value-format="YYYY"
|
||||
placeholder="请选择年份"
|
||||
></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="招生计划名称" prop="groupName">
|
||||
<el-input v-model="dataForm.groupName" placeholder="招生计划名称"></el-input>
|
||||
</el-form-item>
|
||||
<el-dialog :title="dataForm.id ? '修改' : '新增'" :close-on-click-modal="false" width="600px" v-model="visible">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="120px">
|
||||
<el-form-item label="年份" prop="year">
|
||||
<el-date-picker v-model="dataForm.year" type="year" format="YYYY" value-format="YYYY" placeholder="请选择年份"></el-date-picker>
|
||||
</el-form-item>
|
||||
<el-form-item label="招生计划名称" prop="groupName">
|
||||
<el-input v-model="dataForm.groupName" placeholder="招生计划名称"></el-input>
|
||||
</el-form-item>
|
||||
|
||||
<date-range-picker
|
||||
label="报名时间"
|
||||
start-prop="startDate"
|
||||
end-prop="endDate"
|
||||
v-model:start-value="dataForm.startDate"
|
||||
v-model:end-value="dataForm.endDate"
|
||||
required
|
||||
>
|
||||
<template #startDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.startDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="startDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择开始时间"
|
||||
@change="handleStartDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<template #endDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.endDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="endDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择结束时间"
|
||||
@change="handleEndDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
</date-range-picker>
|
||||
<date-range-picker
|
||||
label="维护时间"
|
||||
start-prop="maintenanceStartDate"
|
||||
end-prop="maintenanceEndDate"
|
||||
v-model:start-value="dataForm.maintenanceStartDate"
|
||||
v-model:end-value="dataForm.maintenanceEndDate"
|
||||
required
|
||||
>
|
||||
<template #startDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.maintenanceStartDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="maintenanceStartDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择开始时间"
|
||||
@change="handleMaintenanceStartDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<template #endDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.maintenanceEndDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="maintenanceEndDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择结束时间"
|
||||
@change="handleMaintenanceEndDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
</date-range-picker>
|
||||
<date-range-picker
|
||||
label="报名时间"
|
||||
start-prop="startDate"
|
||||
end-prop="endDate"
|
||||
v-model:start-value="dataForm.startDate"
|
||||
v-model:end-value="dataForm.endDate"
|
||||
required
|
||||
>
|
||||
<template #startDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.startDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="startDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择开始时间"
|
||||
@change="handleStartDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<template #endDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.endDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="endDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择结束时间"
|
||||
@change="handleEndDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
</date-range-picker>
|
||||
<date-range-picker
|
||||
label="维护时间"
|
||||
start-prop="maintenanceStartDate"
|
||||
end-prop="maintenanceEndDate"
|
||||
v-model:start-value="dataForm.maintenanceStartDate"
|
||||
v-model:end-value="dataForm.maintenanceEndDate"
|
||||
required
|
||||
>
|
||||
<template #startDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.maintenanceStartDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="maintenanceStartDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择开始时间"
|
||||
@change="handleMaintenanceStartDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
<template #endDatePicker>
|
||||
<el-date-picker
|
||||
v-model="dataForm.maintenanceEndDate"
|
||||
format="YYYY-MM-DD"
|
||||
value-format="YYYY-MM-DD HH:mm:ss"
|
||||
clearable
|
||||
:disabled-date="maintenanceEndDateDisabledDate"
|
||||
type="datetime"
|
||||
placeholder="请选择结束时间"
|
||||
@change="handleMaintenanceEndDateChange"
|
||||
></el-date-picker>
|
||||
</template>
|
||||
</date-range-picker>
|
||||
|
||||
<el-form-item label="初中生报名" prop="czSignStart">
|
||||
<el-select v-model="dataForm.czSignStart" placeholder="请选择" clearable>
|
||||
<el-option
|
||||
v-for="item in yes_no_type"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="高中生报名" prop="gzSignStart">
|
||||
<el-select v-model="dataForm.gzSignStart" placeholder="请选择" clearable>
|
||||
<el-option
|
||||
v-for="item in yes_no_type"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="技职校报名" prop="jzxSignStart">
|
||||
<el-select v-model="dataForm.jzxSignStart" placeholder="请选择" clearable>
|
||||
<el-option
|
||||
v-for="item in yes_no_type"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form-item label="初中生报名" prop="czSignStart">
|
||||
<el-select v-model="dataForm.czSignStart" placeholder="请选择" clearable>
|
||||
<el-option v-for="item in yes_no_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="高中生报名" prop="gzSignStart">
|
||||
<el-select v-model="dataForm.gzSignStart" placeholder="请选择" clearable>
|
||||
<el-option v-for="item in yes_no_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="技职校报名" prop="jzxSignStart">
|
||||
<el-select v-model="dataForm.jzxSignStart" placeholder="请选择" clearable>
|
||||
<el-option v-for="item in yes_no_type" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import { ref, reactive, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { addObj, getObj, putObj } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
|
||||
const DateRangePicker = defineAsyncComponent(() => import('/@/components/DateRangePicker/index.vue'))
|
||||
const DateRangePicker = defineAsyncComponent(() => import('/@/components/DateRangePicker/index.vue'));
|
||||
|
||||
// 使用字典
|
||||
const { yes_no_type } = useDict('yes_no_type')
|
||||
const { yes_no_type } = useDict('yes_no_type');
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
year: "",
|
||||
groupName: "",
|
||||
startDate: "",
|
||||
endDate: "",
|
||||
maintenanceStartDate: "",
|
||||
maintenanceEndDate: "",
|
||||
feeAgency: 0,
|
||||
czSignStart: "",
|
||||
gzSignStart: "",
|
||||
jzxSignStart: ""
|
||||
})
|
||||
id: '',
|
||||
year: '',
|
||||
groupName: '',
|
||||
startDate: '',
|
||||
endDate: '',
|
||||
maintenanceStartDate: '',
|
||||
maintenanceEndDate: '',
|
||||
feeAgency: 0,
|
||||
czSignStart: '',
|
||||
gzSignStart: '',
|
||||
jzxSignStart: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
year: [
|
||||
{ required: true, message: '年份不能为空', trigger: 'blur' }
|
||||
],
|
||||
groupName: [
|
||||
{ required: true, message: '招生计划名称不能为空', trigger: 'blur' },
|
||||
{ min: 0, max: 30, message: '长度在 0 到 30 个字符', trigger: 'blur' }
|
||||
],
|
||||
startDate: [
|
||||
{ required: true, message: '报名开始时间不能为空', trigger: 'blur' }
|
||||
],
|
||||
endDate: [
|
||||
{ required: true, message: '报名截止时间不能为空', trigger: 'blur' }
|
||||
],
|
||||
maintenanceStartDate: [
|
||||
{ required: true, message: '维护开始时间不能为空', trigger: 'blur' }
|
||||
],
|
||||
maintenanceEndDate: [
|
||||
{ required: true, message: '维护截止时间不能为空', trigger: 'blur' }
|
||||
],
|
||||
feeAgency: [
|
||||
{ required: true, message: '代办费不能为空', trigger: 'blur' }
|
||||
],
|
||||
czSignStart: [
|
||||
{ required: true, message: '初中生报名不能为空', trigger: 'blur' }
|
||||
],
|
||||
gzSignStart: [
|
||||
{ required: true, message: '高中生报名不能为空', trigger: 'blur' }
|
||||
],
|
||||
jzxSignStart: [
|
||||
{ required: true, message: '技职校报名不能为空', trigger: 'blur' }
|
||||
],
|
||||
}
|
||||
year: [{ required: true, message: '年份不能为空', trigger: 'blur' }],
|
||||
groupName: [
|
||||
{ required: true, message: '招生计划名称不能为空', trigger: 'blur' },
|
||||
{ min: 0, max: 30, message: '长度在 0 到 30 个字符', trigger: 'blur' },
|
||||
],
|
||||
startDate: [{ required: true, message: '报名开始时间不能为空', trigger: 'blur' }],
|
||||
endDate: [{ required: true, message: '报名截止时间不能为空', trigger: 'blur' }],
|
||||
maintenanceStartDate: [{ required: true, message: '维护开始时间不能为空', trigger: 'blur' }],
|
||||
maintenanceEndDate: [{ required: true, message: '维护截止时间不能为空', trigger: 'blur' }],
|
||||
feeAgency: [{ required: true, message: '代办费不能为空', trigger: 'blur' }],
|
||||
czSignStart: [{ required: true, message: '初中生报名不能为空', trigger: 'blur' }],
|
||||
gzSignStart: [{ required: true, message: '高中生报名不能为空', trigger: 'blur' }],
|
||||
jzxSignStart: [{ required: true, message: '技职校报名不能为空', trigger: 'blur' }],
|
||||
};
|
||||
|
||||
// 日期选择器的禁用日期函数
|
||||
const startDateDisabledDate = (time: Date) => {
|
||||
if (dataForm.endDate) {
|
||||
return new Date(dataForm.endDate).getTime() < time.getTime()
|
||||
}
|
||||
return false
|
||||
}
|
||||
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
|
||||
}
|
||||
if (dataForm.startDate) {
|
||||
return new Date(dataForm.startDate).getTime() > time.getTime();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const maintenanceStartDateDisabledDate = (time: Date) => {
|
||||
if (dataForm.maintenanceEndDate) {
|
||||
return new Date(dataForm.maintenanceEndDate).getTime() < time.getTime()
|
||||
}
|
||||
return false
|
||||
}
|
||||
if (dataForm.maintenanceEndDate) {
|
||||
return new Date(dataForm.maintenanceEndDate).getTime() < time.getTime();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
const maintenanceEndDateDisabledDate = (time: Date) => {
|
||||
if (dataForm.maintenanceStartDate) {
|
||||
return new Date(dataForm.maintenanceStartDate).getTime() > time.getTime()
|
||||
}
|
||||
return false
|
||||
}
|
||||
if (dataForm.maintenanceStartDate) {
|
||||
return new Date(dataForm.maintenanceStartDate).getTime() > time.getTime();
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
// 处理日期变化事件
|
||||
const handleStartDateChange = (val: string) => {
|
||||
dataForm.startDate = val
|
||||
}
|
||||
dataForm.startDate = val;
|
||||
};
|
||||
|
||||
const handleEndDateChange = (val: string) => {
|
||||
dataForm.endDate = val
|
||||
}
|
||||
dataForm.endDate = val;
|
||||
};
|
||||
|
||||
const handleMaintenanceStartDateChange = (val: string) => {
|
||||
dataForm.maintenanceStartDate = val
|
||||
}
|
||||
dataForm.maintenanceStartDate = val;
|
||||
};
|
||||
|
||||
const handleMaintenanceEndDateChange = (val: string) => {
|
||||
dataForm.maintenanceEndDate = val
|
||||
}
|
||||
dataForm.maintenanceEndDate = val;
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
addObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
addObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id?: string | null) => {
|
||||
// 重置表单数据
|
||||
dataForm.id = ""
|
||||
dataForm.year = ""
|
||||
dataForm.groupName = ""
|
||||
dataForm.startDate = ""
|
||||
dataForm.endDate = ""
|
||||
dataForm.maintenanceStartDate = ""
|
||||
dataForm.maintenanceEndDate = ""
|
||||
dataForm.feeAgency = 0
|
||||
dataForm.czSignStart = ""
|
||||
dataForm.gzSignStart = ""
|
||||
dataForm.jzxSignStart = ""
|
||||
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
// 只有当 id 是有效的字符串时才加载数据
|
||||
if (id && typeof id === 'string' && id.trim() !== '') {
|
||||
dataForm.id = id
|
||||
getObj(id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
if (dataForm.year) {
|
||||
dataForm.year = String(dataForm.year)
|
||||
}
|
||||
}).catch(() => {
|
||||
// 错误处理
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
// 重置表单数据
|
||||
dataForm.id = '';
|
||||
dataForm.year = '';
|
||||
dataForm.groupName = '';
|
||||
dataForm.startDate = '';
|
||||
dataForm.endDate = '';
|
||||
dataForm.maintenanceStartDate = '';
|
||||
dataForm.maintenanceEndDate = '';
|
||||
dataForm.feeAgency = 0;
|
||||
dataForm.czSignStart = '';
|
||||
dataForm.gzSignStart = '';
|
||||
dataForm.jzxSignStart = '';
|
||||
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
// 只有当 id 是有效的字符串时才加载数据
|
||||
if (id && typeof id === 'string' && id.trim() !== '') {
|
||||
dataForm.id = id;
|
||||
getObj(id)
|
||||
.then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
if (dataForm.year) {
|
||||
dataForm.year = String(dataForm.year);
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 错误处理
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,4 +1,3 @@
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
@@ -222,11 +221,11 @@ const changeSm = async (row: any, type: any) => {
|
||||
params['gzSignStart'] = row.gzSignStart;
|
||||
}
|
||||
if (type == 'jzxSignStart') {
|
||||
params['jzxSignStart'] = row.jzxSignStart;
|
||||
}
|
||||
if (type == 'isPreStart') {
|
||||
params['isPreStart'] = row.isPreStart;
|
||||
}
|
||||
params['jzxSignStart'] = row.jzxSignStart;
|
||||
}
|
||||
if (type == 'isPreStart') {
|
||||
params['isPreStart'] = row.isPreStart;
|
||||
}
|
||||
await editQuickField(params);
|
||||
message.success('修改成功');
|
||||
} catch (error: any) {
|
||||
|
||||
@@ -1,201 +1,183 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="!dataForm.id ? '新增' : '修改'"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="600px"
|
||||
>
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
|
||||
<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="schoolCode">
|
||||
<el-input v-model="dataForm.schoolCode" placeholder="学校代码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校名称" prop="schoolName">
|
||||
<el-input v-model="dataForm.schoolName" placeholder="学校名称"></el-input>
|
||||
</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="area">
|
||||
<el-select v-model="dataForm.area" filterable placeholder="请选择地区">
|
||||
<el-option
|
||||
v-for="item in areaListData"
|
||||
:key="item.code"
|
||||
:label="item.name"
|
||||
:value="item.code">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-dialog :title="!dataForm.id ? '新增' : '修改'" :close-on-click-modal="false" v-model="visible" width="600px">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
|
||||
<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="schoolCode">
|
||||
<el-input v-model="dataForm.schoolCode" placeholder="学校代码"></el-input>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校名称" prop="schoolName">
|
||||
<el-input v-model="dataForm.schoolName" placeholder="学校名称"></el-input>
|
||||
</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="area">
|
||||
<el-select v-model="dataForm.area" filterable placeholder="请选择地区">
|
||||
<el-option v-for="item in areaListData" :key="item.code" :label="item.name" :value="item.code"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" v-if="canSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { addObj, areaList, getObj, putObj } from '/@/api/recruit/recruitstudentschool'
|
||||
import { getDeptList } from '/@/api/basic/basicclass'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { addObj, areaList, getObj, putObj } from '/@/api/recruit/recruitstudentschool';
|
||||
import { getDeptList } from '/@/api/basic/basicclass';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const planList = ref<any[]>([])
|
||||
const areaListData = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const planList = ref<any[]>([]);
|
||||
const areaListData = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
groupId: "",
|
||||
area: "",
|
||||
deptCode: "",
|
||||
schoolName: ""
|
||||
})
|
||||
id: '',
|
||||
groupId: '',
|
||||
area: '',
|
||||
deptCode: '',
|
||||
schoolName: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'blur' },
|
||||
],
|
||||
schoolName: [
|
||||
{ required: true, message: '学校名称不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '学校名称长度不大于20个字符', trigger: 'blur' }
|
||||
],
|
||||
schoolCode:[
|
||||
{ required: true, message: '学校代码不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '学校代码长度不大于20个字符', trigger: 'blur' }
|
||||
],
|
||||
area: [
|
||||
{ required: true, message: '地区不能为空', trigger: 'blur' },
|
||||
],
|
||||
}
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'blur' }],
|
||||
schoolName: [
|
||||
{ required: true, message: '学校名称不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '学校名称长度不大于20个字符', trigger: 'blur' },
|
||||
],
|
||||
schoolCode: [
|
||||
{ required: true, message: '学校代码不能为空', trigger: 'blur' },
|
||||
{ min: 1, max: 20, message: '学校代码长度不大于20个字符', trigger: 'blur' },
|
||||
],
|
||||
area: [{ required: true, message: '地区不能为空', trigger: 'blur' }],
|
||||
};
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
// 查询二级学院信息
|
||||
getDeptList().then((data: any) => {
|
||||
deptList.value = data.data
|
||||
deptList.value.push({ deptCode: "190", deptName: "招生就业处" })
|
||||
})
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
})
|
||||
// 获取所有省
|
||||
areaList({ type: "0", parentId: 112 }).then((res: any) => {
|
||||
areaListData.value = res.data
|
||||
})
|
||||
}
|
||||
// 查询二级学院信息
|
||||
getDeptList().then((data: any) => {
|
||||
deptList.value = data.data;
|
||||
deptList.value.push({ deptCode: '190', deptName: '招生就业处' });
|
||||
});
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
});
|
||||
// 获取所有省
|
||||
areaList({ type: '0', parentId: 112 }).then((res: any) => {
|
||||
areaListData.value = res.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
} else {
|
||||
addObj(dataForm).then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功'
|
||||
})
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
putObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '修改成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
} else {
|
||||
addObj(dataForm)
|
||||
.then(() => {
|
||||
ElNotification.success({
|
||||
title: '成功',
|
||||
message: '添加成功',
|
||||
});
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
dataForm.id = ""
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
})
|
||||
|
||||
initData()
|
||||
|
||||
// 获取详情数据
|
||||
if (id) {
|
||||
dataForm.id = id
|
||||
getObj(id).then((response: any) => {
|
||||
if (response && response.data) {
|
||||
Object.assign(dataForm, response.data)
|
||||
if (dataForm.area) {
|
||||
dataForm.area = String(dataForm.area)
|
||||
}
|
||||
// 确保 deptCode 正确映射(如果 API 返回的是 xy 字段)
|
||||
if (response.data.xy && !response.data.deptCode) {
|
||||
dataForm.deptCode = response.data.xy
|
||||
}
|
||||
}
|
||||
}).catch(() => {
|
||||
// 错误处理
|
||||
})
|
||||
} else {
|
||||
// 新增模式:设置默认招生计划
|
||||
getList().then((data: any) => {
|
||||
if (data.data && data.data.length > 0) {
|
||||
dataForm.groupId = data.data[0]?.id || ""
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
dataForm.id = '';
|
||||
|
||||
// 重置表单数据
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
});
|
||||
|
||||
initData();
|
||||
|
||||
// 获取详情数据
|
||||
if (id) {
|
||||
dataForm.id = id;
|
||||
getObj(id)
|
||||
.then((response: any) => {
|
||||
if (response && response.data) {
|
||||
Object.assign(dataForm, response.data);
|
||||
if (dataForm.area) {
|
||||
dataForm.area = String(dataForm.area);
|
||||
}
|
||||
// 确保 deptCode 正确映射(如果 API 返回的是 xy 字段)
|
||||
if (response.data.xy && !response.data.deptCode) {
|
||||
dataForm.deptCode = response.data.xy;
|
||||
}
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
// 错误处理
|
||||
});
|
||||
} else {
|
||||
// 新增模式:设置默认招生计划
|
||||
getList().then((data: any) => {
|
||||
if (data.data && data.data.length > 0) {
|
||||
dataForm.groupId = data.data[0]?.id || '';
|
||||
}
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -16,264 +16,226 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校名称" prop="schoolName">
|
||||
<el-input v-model="queryForm.schoolName" clearable placeholder="学校名称" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学校名称" prop="schoolName">
|
||||
<el-input v-model="queryForm.schoolName" clearable placeholder="学校名称" />
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentschool_add')"
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="addOrUpdateHandle"
|
||||
>
|
||||
新 增
|
||||
</el-button>
|
||||
<el-button
|
||||
v-auth="'recruit_studentschool_import'"
|
||||
type="primary"
|
||||
plain
|
||||
icon="UploadFilled"
|
||||
@click="handleImportDialog"
|
||||
>导入信息
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_schoolhistory_view')"
|
||||
type="plain"
|
||||
icon="View"
|
||||
@click="handleShowHistory"
|
||||
>
|
||||
变更历史
|
||||
</el-button>
|
||||
</div>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruit_recruitstudentschool_add')" type="primary" icon="FolderAdd" @click="addOrUpdateHandle"> 新 增 </el-button>
|
||||
<el-button v-auth="'recruit_studentschool_import'" type="primary" plain icon="UploadFilled" @click="handleImportDialog">导入信息 </el-button>
|
||||
<el-button v-if="hasAuth('recruit_schoolhistory_view')" type="plain" icon="View" @click="handleShowHistory"> 变更历史 </el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="schoolCode" label="学校代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="schoolName" label="学校名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="deptCode" label="对接学院" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getDeptName(scope.row.deptCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="area" label="所在区" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getAreaName(scope.row.area) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentschool_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentschool_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="schoolCode" label="学校代码" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="schoolName" label="学校名称" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="deptCode" label="对接学院" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getDeptName(scope.row.deptCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="area" label="所在区" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getAreaName(scope.row.area) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentschool_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="addOrUpdateHandle(scope.row.id)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruit_recruitstudentschool_del')" type="danger" link icon="Delete" @click="deleteHandle(scope.row.id)">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
<major-group-by-dept-form v-if="majorGroupByDeptVisible" ref="majorGroupByDeptRef" />
|
||||
<!-- 弹窗, 新增 / 修改 -->
|
||||
<table-form ref="addOrUpdateRef" @refreshDataList="getDataList" />
|
||||
<major-group-by-dept-form v-if="majorGroupByDeptVisible" ref="majorGroupByDeptRef" />
|
||||
|
||||
<school-history ref="SchoolHistoryRef"></school-history>
|
||||
<school-history ref="SchoolHistoryRef"></school-history>
|
||||
|
||||
<import-recruit-info ref="ImportRecruitInfoRef" @refreshDataList="getDataList"></import-recruit-info>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<import-recruit-info ref="ImportRecruitInfoRef" @refreshDataList="getDataList"></import-recruit-info>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentschool">
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { delObj, fetchList, areaList } from '/@/api/recruit/recruitstudentschool'
|
||||
import { getDeptList } from '/@/api/basic/basicclass'
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { delObj, fetchList, areaList } from '/@/api/recruit/recruitstudentschool';
|
||||
import { getDeptList } from '/@/api/basic/basicclass';
|
||||
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'))
|
||||
const MajorGroupByDeptForm = defineAsyncComponent(() => import('/@/views/recruit/recruitplanmajor/majorGroupByDept.vue'))
|
||||
const TableForm = defineAsyncComponent(() => import('./detaiform.vue'));
|
||||
const MajorGroupByDeptForm = defineAsyncComponent(() => import('/@/views/recruit/recruitplanmajor/majorGroupByDept.vue'));
|
||||
const ImportRecruitInfo = defineAsyncComponent(() => import('/@/views/recruit/common/import-recruit-info.vue'));
|
||||
const SchoolHistory = defineAsyncComponent(() => import('/@/views/recruit/recruitstudentschool/school-history.vue'))
|
||||
const SchoolHistory = defineAsyncComponent(() => import('/@/views/recruit/recruitstudentschool/school-history.vue'));
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const ImportRecruitInfoRef=ref<any>();
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
const ImportRecruitInfoRef = ref<any>();
|
||||
|
||||
const SchoolHistoryRef=ref()
|
||||
const SchoolHistoryRef = ref();
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const addOrUpdateRef = ref()
|
||||
const majorGroupByDeptRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const addOrUpdateRef = ref();
|
||||
const majorGroupByDeptRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const majorGroupByDeptVisible = ref(false)
|
||||
const majorGroupByDeptVisible = ref(false);
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const provinceList = ref<any[]>([])
|
||||
const planList = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
const provinceList = ref<any[]>([]);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
schoolName: ''
|
||||
})
|
||||
groupId: '',
|
||||
schoolName: '',
|
||||
});
|
||||
|
||||
// 获取学院名称
|
||||
const getDeptName = (deptCode: string) => {
|
||||
const item = deptList.value.find(item => item.deptCode === deptCode)
|
||||
return item ? item.deptName : ''
|
||||
}
|
||||
const item = deptList.value.find((item) => item.deptCode === deptCode);
|
||||
return item ? item.deptName : '';
|
||||
};
|
||||
|
||||
// 获取地区名称
|
||||
const getAreaName = (areaCode: string) => {
|
||||
const item = provinceList.value.find(item => item.code === areaCode)
|
||||
return item ? item.name : ''
|
||||
}
|
||||
const item = provinceList.value.find((item) => item.code === areaCode);
|
||||
return item ? item.name : '';
|
||||
};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
// 查询二级学院信息
|
||||
const deptData = await getDeptList()
|
||||
deptList.value = deptData.data || []
|
||||
deptList.value.push({ deptCode: '190', deptName: '招生就业处' })
|
||||
|
||||
// 获取所有省
|
||||
const areaData = await areaList({ type: '0', parentId: 112 })
|
||||
provinceList.value = areaData.data || []
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList()
|
||||
planList.value = planData.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
// 查询二级学院信息
|
||||
const deptData = await getDeptList();
|
||||
deptList.value = deptData.data || [];
|
||||
deptList.value.push({ deptCode: '190', deptName: '招生就业处' });
|
||||
|
||||
// 获取所有省
|
||||
const areaData = await areaList({ type: '0', parentId: 112 });
|
||||
provinceList.value = areaData.data || [];
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList();
|
||||
planList.value = planData.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 新增 / 修改
|
||||
const addOrUpdateHandle = (payload?: any) => {
|
||||
// 兼容新增按钮未传参时自动传入的 MouseEvent
|
||||
const id = payload && typeof payload === 'object' ? null : payload
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id)
|
||||
})
|
||||
}
|
||||
// 兼容新增按钮未传参时自动传入的 MouseEvent
|
||||
const id = payload && typeof payload === 'object' ? null : payload;
|
||||
nextTick(() => {
|
||||
addOrUpdateRef.value?.init(id);
|
||||
});
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delObj(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delObj(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
Object.keys(queryForm).forEach(key => {
|
||||
queryForm[key] = ''
|
||||
})
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
Object.keys(queryForm).forEach((key) => {
|
||||
queryForm[key] = '';
|
||||
});
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
const handleShowHistory=()=>{
|
||||
SchoolHistoryRef.value?.init()
|
||||
}
|
||||
const handleShowHistory = () => {
|
||||
SchoolHistoryRef.value?.init();
|
||||
};
|
||||
|
||||
const handleImportDialog = () => {
|
||||
ImportRecruitInfoRef.value?.init("R10004");
|
||||
ImportRecruitInfoRef.value?.init('R10004');
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,63 +1,56 @@
|
||||
<template>
|
||||
<el-dialog v-model="visible" width="80%" title="学校变更历史">
|
||||
<el-table ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle">
|
||||
<el-table-column label="学校代码" prop="schoolCode"></el-table-column>
|
||||
<el-table-column label="旧名称" prop="oldName"></el-table-column>
|
||||
<el-table-column label="新名称" prop="newName"></el-table-column>
|
||||
<el-table-column label="变动时间" prop="createTime"></el-table-column>
|
||||
</el-table>
|
||||
<el-dialog v-model="visible" width="80%" title="学校变更历史">
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column label="学校代码" prop="schoolCode"></el-table-column>
|
||||
<el-table-column label="旧名称" prop="oldName"></el-table-column>
|
||||
<el-table-column label="新名称" prop="newName"></el-table-column>
|
||||
<el-table-column label="变动时间" prop="createTime"></el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
|
||||
</el-dialog>
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
|
||||
<script setup lang="ts">
|
||||
import {useTable,BasicTableProps} from "/@/hooks/table";
|
||||
import {fetchList} from "/@/api/recruit/recruitSchoolHistory";
|
||||
import { useTable, BasicTableProps } from '/@/hooks/table';
|
||||
import { fetchList } from '/@/api/recruit/recruitSchoolHistory';
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: {},
|
||||
createdIsNeed: false,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
const visible = ref(false)
|
||||
queryForm: {},
|
||||
createdIsNeed: false,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
const visible = ref(false);
|
||||
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
|
||||
const init=()=>{
|
||||
visible.value = true
|
||||
getDataList()
|
||||
}
|
||||
const init = () => {
|
||||
visible.value = true;
|
||||
getDataList();
|
||||
};
|
||||
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
|
||||
</style>
|
||||
<style scoped lang="scss"></style>
|
||||
|
||||
@@ -1,83 +1,85 @@
|
||||
<template>
|
||||
<el-dialog title="录取通知书" v-model="visible" width="80%" height="50%" @close="handleClose">
|
||||
<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="handleClose">关 闭</el-button>
|
||||
<el-button @click="handleConfirm" v-if="hasAuth('recruit_recruitstudentsignup_sureLQTZ') && canConfirm" type="primary">确认已发放</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog title="录取通知书" v-model="visible" width="80%" height="50%" @close="handleClose">
|
||||
<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="handleClose">关 闭</el-button>
|
||||
<el-button @click="handleConfirm" v-if="hasAuth('recruit_recruitstudentsignup_sureLQTZ') && canConfirm" type="primary">确认已发放</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { toWord, sureLQTZ } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { ref } from 'vue';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { toWord, sureLQTZ } from '/@/api/recruit/recruitstudentsignup';
|
||||
|
||||
export default {
|
||||
name: 'AdmissionNoticeDialog',
|
||||
emits: ['refresh'],
|
||||
setup(props, { emit }) {
|
||||
const { hasAuth } = useAuth()
|
||||
const visible = ref(false)
|
||||
const pdfPath = ref('')
|
||||
const currentId = ref('')
|
||||
const canConfirm = ref(false)
|
||||
name: 'AdmissionNoticeDialog',
|
||||
emits: ['refresh'],
|
||||
setup(props, { emit }) {
|
||||
const { hasAuth } = useAuth();
|
||||
const visible = ref(false);
|
||||
const pdfPath = ref('');
|
||||
const currentId = ref('');
|
||||
const canConfirm = ref(false);
|
||||
|
||||
const init = async (row) => {
|
||||
currentId.value = row.id
|
||||
pdfPath.value = ''
|
||||
canConfirm.value = row.isBackTz == '0'
|
||||
|
||||
try {
|
||||
const res = await toWord(row)
|
||||
pdfPath.value = "/recruit/file/previewPdf?filePath=" + encodeURIComponent(res.data)
|
||||
visible.value = true
|
||||
} catch (error) {
|
||||
ElMessage.error('加载录取通知书失败')
|
||||
}
|
||||
}
|
||||
const init = async (row) => {
|
||||
currentId.value = row.id;
|
||||
pdfPath.value = '';
|
||||
canConfirm.value = row.isBackTz == '0';
|
||||
|
||||
const handleConfirm = () => {
|
||||
ElMessageBox.confirm('是否确认已打印并发放本通知书?请谨慎操作', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then(() => {
|
||||
return sureLQTZ({ id: currentId.value })
|
||||
}).then(() => {
|
||||
ElMessage.success('保存成功')
|
||||
visible.value = false
|
||||
emit('refresh')
|
||||
}).catch(() => {
|
||||
// 用户取消操作
|
||||
})
|
||||
}
|
||||
try {
|
||||
const res = await toWord(row);
|
||||
pdfPath.value = '/recruit/file/previewPdf?filePath=' + encodeURIComponent(res.data);
|
||||
visible.value = true;
|
||||
} catch (error) {
|
||||
ElMessage.error('加载录取通知书失败');
|
||||
}
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
visible.value = false
|
||||
}
|
||||
const handleConfirm = () => {
|
||||
ElMessageBox.confirm('是否确认已打印并发放本通知书?请谨慎操作', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning',
|
||||
})
|
||||
.then(() => {
|
||||
return sureLQTZ({ id: currentId.value });
|
||||
})
|
||||
.then(() => {
|
||||
ElMessage.success('保存成功');
|
||||
visible.value = false;
|
||||
emit('refresh');
|
||||
})
|
||||
.catch(() => {
|
||||
// 用户取消操作
|
||||
});
|
||||
};
|
||||
|
||||
return {
|
||||
hasAuth,
|
||||
visible,
|
||||
pdfPath,
|
||||
canConfirm,
|
||||
init,
|
||||
handleConfirm,
|
||||
handleClose
|
||||
}
|
||||
}
|
||||
}
|
||||
const handleClose = () => {
|
||||
visible.value = false;
|
||||
};
|
||||
|
||||
return {
|
||||
hasAuth,
|
||||
visible,
|
||||
pdfPath,
|
||||
canConfirm,
|
||||
init,
|
||||
handleConfirm,
|
||||
handleClose,
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -1,79 +1,78 @@
|
||||
<template>
|
||||
<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"
|
||||
filterable
|
||||
clearable
|
||||
type="datetime"
|
||||
style="width: 100%"
|
||||
></el-date-picker>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">关 闭</el-button>
|
||||
<el-button @click="handleSave" type="primary">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<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"
|
||||
filterable
|
||||
clearable
|
||||
type="datetime"
|
||||
style="width: 100%"
|
||||
></el-date-picker>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="handleClose">关 闭</el-button>
|
||||
<el-button @click="handleSave" type="primary">保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref } from 'vue'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { ref } from 'vue';
|
||||
import { ElMessage, ElMessageBox } from 'element-plus';
|
||||
// import { updateInfo } from '/@/api/recruit/recruitstudentsignup'
|
||||
|
||||
export default {
|
||||
name: 'DelayPayTimeDialog',
|
||||
emits: ['refresh'],
|
||||
setup(props, { emit }) {
|
||||
const visible = ref(false)
|
||||
const delayPayTime = ref('')
|
||||
const currentId = ref('')
|
||||
name: 'DelayPayTimeDialog',
|
||||
emits: ['refresh'],
|
||||
setup(props, { emit }) {
|
||||
const visible = ref(false);
|
||||
const delayPayTime = ref('');
|
||||
const currentId = ref('');
|
||||
|
||||
const init = (row) => {
|
||||
delayPayTime.value = ''
|
||||
currentId.value = row.id
|
||||
if (row.delayPaymentTime) {
|
||||
delayPayTime.value = row.delayPaymentTime
|
||||
}
|
||||
visible.value = true
|
||||
}
|
||||
const init = (row) => {
|
||||
delayPayTime.value = '';
|
||||
currentId.value = row.id;
|
||||
if (row.delayPaymentTime) {
|
||||
delayPayTime.value = row.delayPaymentTime;
|
||||
}
|
||||
visible.value = true;
|
||||
};
|
||||
|
||||
const handleSave = () => {
|
||||
// ElMessageBox.confirm('是否确认进度延迟收费操作?请谨慎操作', '提示', {
|
||||
// confirmButtonText: '确定',
|
||||
// cancelButtonText: '取消',
|
||||
// type: 'warning'
|
||||
// }).then(() => {
|
||||
// return updateInfo({ delayPaymentTime: delayPayTime.value, id: currentId.value })
|
||||
// }).then(() => {
|
||||
// visible.value = false
|
||||
// ElMessage.success('延迟收费修改成功')
|
||||
// emit('refresh')
|
||||
// }).catch(() => {
|
||||
// // 用户取消操作
|
||||
// })
|
||||
}
|
||||
const handleSave = () => {
|
||||
// ElMessageBox.confirm('是否确认进度延迟收费操作?请谨慎操作', '提示', {
|
||||
// confirmButtonText: '确定',
|
||||
// cancelButtonText: '取消',
|
||||
// type: 'warning'
|
||||
// }).then(() => {
|
||||
// return updateInfo({ delayPaymentTime: delayPayTime.value, id: currentId.value })
|
||||
// }).then(() => {
|
||||
// visible.value = false
|
||||
// ElMessage.success('延迟收费修改成功')
|
||||
// emit('refresh')
|
||||
// }).catch(() => {
|
||||
// // 用户取消操作
|
||||
// })
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
visible.value = false
|
||||
}
|
||||
const handleClose = () => {
|
||||
visible.value = false;
|
||||
};
|
||||
|
||||
return {
|
||||
visible,
|
||||
delayPayTime,
|
||||
init,
|
||||
handleSave,
|
||||
handleClose
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
visible,
|
||||
delayPayTime,
|
||||
init,
|
||||
handleSave,
|
||||
handleClose,
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -1,131 +1,133 @@
|
||||
<template>
|
||||
<el-dialog title="支付二维码" v-model="visible" width="800px" height="80%" @close="handleClose">
|
||||
<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="handleUpdateFS" icon="el-icon-search" type="danger" size="small">立即查询</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>
|
||||
<el-dialog title="支付二维码" v-model="visible" width="800px" height="80%" @close="handleClose">
|
||||
<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="handleUpdateFS" icon="el-icon-search" type="danger" size="small">立即查询</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="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>
|
||||
<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>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ref } from 'vue'
|
||||
import { ElNotification } from 'element-plus'
|
||||
import { updateFs } from '/@/api/purchase/financenormalstu'
|
||||
import { ref } from 'vue';
|
||||
import { ElNotification } from 'element-plus';
|
||||
import { updateFs } from '/@/api/purchase/financenormalstu';
|
||||
|
||||
export default {
|
||||
name: 'PayQrcodeDialog',
|
||||
emits: ['refresh'],
|
||||
setup(props, { emit }) {
|
||||
const visible = ref(false)
|
||||
const tableData = ref([])
|
||||
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)
|
||||
name: 'PayQrcodeDialog',
|
||||
emits: ['refresh'],
|
||||
setup(props, { emit }) {
|
||||
const visible = ref(false);
|
||||
const tableData = ref([]);
|
||||
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 init = (row) => {
|
||||
showPrise1.value = false
|
||||
showPrise2.value = false
|
||||
showPrise3.value = false
|
||||
const init = (row) => {
|
||||
showPrise1.value = false;
|
||||
showPrise2.value = false;
|
||||
showPrise3.value = false;
|
||||
|
||||
// 置空
|
||||
payQrcode1.value = ''
|
||||
payQrcode2.value = ''
|
||||
payQrcode3.value = ''
|
||||
// 置空
|
||||
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.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.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'
|
||||
}
|
||||
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)
|
||||
visible.value = true
|
||||
}
|
||||
tableData.value = [];
|
||||
tableData.value.push(row);
|
||||
visible.value = true;
|
||||
};
|
||||
|
||||
const handleUpdateFS = () => {
|
||||
if (tableData.value.length === 0) return
|
||||
updateFs({ "serialNumber": tableData.value[0].serialNumber.substring(1, tableData.value[0].serialNumber.length) }).then(() => {
|
||||
ElNotification.success('已提交查询请求,请等待1分钟后重新查询')
|
||||
visible.value = false
|
||||
emit('refresh')
|
||||
})
|
||||
}
|
||||
const handleUpdateFS = () => {
|
||||
if (tableData.value.length === 0) return;
|
||||
updateFs({ serialNumber: tableData.value[0].serialNumber.substring(1, tableData.value[0].serialNumber.length) }).then(() => {
|
||||
ElNotification.success('已提交查询请求,请等待1分钟后重新查询');
|
||||
visible.value = false;
|
||||
emit('refresh');
|
||||
});
|
||||
};
|
||||
|
||||
const handleClose = () => {
|
||||
visible.value = false
|
||||
}
|
||||
const handleClose = () => {
|
||||
visible.value = false;
|
||||
};
|
||||
|
||||
return {
|
||||
visible,
|
||||
tableData,
|
||||
payQrcode1,
|
||||
showPrise1,
|
||||
payQrcode1Msg,
|
||||
payQrcode2,
|
||||
showPrise2,
|
||||
payQrcode2Msg,
|
||||
payQrcode3,
|
||||
showPrise3,
|
||||
payQrcode3Msg,
|
||||
init,
|
||||
handleUpdateFS,
|
||||
handleClose
|
||||
}
|
||||
}
|
||||
}
|
||||
return {
|
||||
visible,
|
||||
tableData,
|
||||
payQrcode1,
|
||||
showPrise1,
|
||||
payQrcode1Msg,
|
||||
payQrcode2,
|
||||
showPrise2,
|
||||
payQrcode2Msg,
|
||||
payQrcode3,
|
||||
showPrise3,
|
||||
payQrcode3Msg,
|
||||
init,
|
||||
handleUpdateFS,
|
||||
handleClose,
|
||||
};
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
</style>
|
||||
|
||||
<style scoped></style>
|
||||
|
||||
@@ -1,31 +1,30 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName" @tab-click="handleTabClick">
|
||||
<el-tab-pane label="初中生" name="tab">
|
||||
<AreaStaticByCZ ref="tabIndexRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName" @tab-click="handleTabClick">
|
||||
<el-tab-pane label="初中生" name="tab">
|
||||
<AreaStaticByCZ ref="tabIndexRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-areaStatic">
|
||||
import { ref, defineAsyncComponent, nextTick } from 'vue'
|
||||
import { ref, defineAsyncComponent, nextTick } from 'vue';
|
||||
|
||||
const AreaStaticByCZ = defineAsyncComponent(() => import('./areaStaticByCZ.vue'))
|
||||
const AreaStaticByCZ = defineAsyncComponent(() => import('./areaStaticByCZ.vue'));
|
||||
|
||||
// 状态
|
||||
const activeName = ref('tab')
|
||||
const tabIndexRef = ref()
|
||||
const activeName = ref('tab');
|
||||
const tabIndexRef = ref();
|
||||
|
||||
// Tab 切换
|
||||
const handleTabClick = (tab: any) => {
|
||||
if (tab.paneName === 'tab') {
|
||||
nextTick(() => {
|
||||
tabIndexRef.value?.init()
|
||||
})
|
||||
}
|
||||
}
|
||||
if (tab.paneName === 'tab') {
|
||||
nextTick(() => {
|
||||
tabIndexRef.value?.init();
|
||||
});
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
@@ -1,185 +1,179 @@
|
||||
<template>
|
||||
<div >
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" >
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<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>
|
||||
<el-button icon="Search" type="primary"
|
||||
@click="handleFilter">查询
|
||||
</el-button>
|
||||
<el-button icon="Delete" type="default" plain
|
||||
@click="resetForm">清空
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form>
|
||||
<el-form-item>
|
||||
<el-button icon="Download" type="warning" size="small" @click="dataExportHandle">导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table :data="dataList" border stripe v-loading="dataListLoading"
|
||||
:summary-method="getSummaries" show-summary height="700"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="provinceName" label="省市" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="人数" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleRate" label="占比" />
|
||||
</el-table>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="handleFilter">查询 </el-button>
|
||||
<el-button icon="Delete" type="default" plain @click="resetForm">清空 </el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form>
|
||||
<el-form-item>
|
||||
<el-button icon="Download" type="warning" size="small" @click="dataExportHandle">导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table :data="dataList" border stripe v-loading="dataListLoading" :summary-method="getSummaries" show-summary height="700">
|
||||
<el-table-column align="center" header-align="center" prop="provinceName" label="省市" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="人数" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleRate" label="占比" />
|
||||
</el-table>
|
||||
|
||||
<!-- <chart ref="typeEchartBarRef" style="width:100%;margin-top:80px" :options="chartOption" theme="macarons"></chart>-->
|
||||
|
||||
</div>
|
||||
<!-- <chart ref="typeEchartBarRef" style="width:100%;margin-top:80px" :options="chartOption" theme="macarons"></chart>-->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import axios from 'axios'
|
||||
import { getAreaStatic } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import axios from 'axios';
|
||||
import { getAreaStatic } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// 响应式数据
|
||||
const dataForm = reactive({
|
||||
groupId: "",
|
||||
degreeOfEducation: ""
|
||||
})
|
||||
groupId: '',
|
||||
degreeOfEducation: '',
|
||||
});
|
||||
|
||||
const dataList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const chartOption = ref<any>({})
|
||||
const searchFormRef = ref()
|
||||
const typeEchartBarRef = ref()
|
||||
const dataList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const chartOption = ref<any>({});
|
||||
const searchFormRef = ref();
|
||||
const typeEchartBarRef = ref();
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = Array.isArray(data?.data) ? data.data : []
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}).catch(() => {
|
||||
planList.value = []
|
||||
})
|
||||
}
|
||||
getList()
|
||||
.then((data: any) => {
|
||||
planList.value = Array.isArray(data?.data) ? data.data : [];
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
})
|
||||
.catch(() => {
|
||||
planList.value = [];
|
||||
});
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = () => {
|
||||
dataList.value = []
|
||||
dataForm.degreeOfEducation = '1'
|
||||
dataListLoading.value = true
|
||||
getAreaStatic(dataForm).then((response: any) => {
|
||||
const res = response?.data
|
||||
// 兼容:接口可能返回 { data: [], option: {} } 或直接返回数组
|
||||
dataList.value = Array.isArray(res) ? res : (res?.data || res?.records || res?.list || [])
|
||||
const rawOption = Array.isArray(res) ? null : (res?.option ?? null)
|
||||
// 确保 chart 的 option 合法,series[].data 必须为数组,避免 .includes 报错
|
||||
if (rawOption && typeof rawOption === 'object') {
|
||||
const option = { ...rawOption }
|
||||
if (Array.isArray(option.series)) {
|
||||
option.series = option.series.map((s: any) => ({
|
||||
...s,
|
||||
data: Array.isArray(s?.data) ? s.data : []
|
||||
}))
|
||||
}
|
||||
if (option.data !== undefined && !Array.isArray(option.data)) {
|
||||
option.data = []
|
||||
}
|
||||
chartOption.value = option
|
||||
} else {
|
||||
chartOption.value = {}
|
||||
}
|
||||
dataListLoading.value = false
|
||||
}).catch(() => {
|
||||
dataListLoading.value = false
|
||||
})
|
||||
}
|
||||
dataList.value = [];
|
||||
dataForm.degreeOfEducation = '1';
|
||||
dataListLoading.value = true;
|
||||
getAreaStatic(dataForm)
|
||||
.then((response: any) => {
|
||||
const res = response?.data;
|
||||
// 兼容:接口可能返回 { data: [], option: {} } 或直接返回数组
|
||||
dataList.value = Array.isArray(res) ? res : res?.data || res?.records || res?.list || [];
|
||||
const rawOption = Array.isArray(res) ? null : res?.option ?? null;
|
||||
// 确保 chart 的 option 合法,series[].data 必须为数组,避免 .includes 报错
|
||||
if (rawOption && typeof rawOption === 'object') {
|
||||
const option = { ...rawOption };
|
||||
if (Array.isArray(option.series)) {
|
||||
option.series = option.series.map((s: any) => ({
|
||||
...s,
|
||||
data: Array.isArray(s?.data) ? s.data : [],
|
||||
}));
|
||||
}
|
||||
if (option.data !== undefined && !Array.isArray(option.data)) {
|
||||
option.data = [];
|
||||
}
|
||||
chartOption.value = option;
|
||||
} else {
|
||||
chartOption.value = {};
|
||||
}
|
||||
dataListLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
dataListLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 导出Excel
|
||||
const exportExcel = (form: any, url: string) => {
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
}
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// 导出表格
|
||||
const dataExportHandle = () => {
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/getAreaStaticExport').then((res: any) => {
|
||||
const blob = new Blob([res.data])
|
||||
const fileName = '按地区导出.xls'
|
||||
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(() => {
|
||||
// 错误处理
|
||||
})
|
||||
}
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/getAreaStaticExport')
|
||||
.then((res: any) => {
|
||||
const blob = new Blob([res.data]);
|
||||
const fileName = '按地区导出.xls';
|
||||
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 getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计'
|
||||
} else if (index !== 0) {
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr)
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计';
|
||||
} else if (index !== 0) {
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr);
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0);
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置表单
|
||||
const resetForm = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
};
|
||||
|
||||
// 组件挂载时初始化
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.avue-crud {
|
||||
margin-top: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,177 +1,178 @@
|
||||
<template>
|
||||
<div class="mod-config">
|
||||
<basic-container>
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<div class="mod-config">
|
||||
<basic-container>
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" size="small">
|
||||
<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>
|
||||
<el-button icon="Search" type="primary" size="small"
|
||||
@click="handleFilter">查询
|
||||
</el-button>
|
||||
<el-button icon="Delete" type="default" plain size="small"
|
||||
@click="resetForm">清空
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="avue-crud">
|
||||
<el-table :data="dataList" border stripe :span-method="objectSpanMethod" v-loading="dataListLoading"
|
||||
:summary-method="getSummaries" show-summary :row-style="changeRowColor"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
|
||||
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
|
||||
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
|
||||
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
|
||||
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
|
||||
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
|
||||
</el-table>
|
||||
</div>
|
||||
</basic-container>
|
||||
</div>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" size="small" @click="handleFilter">查询 </el-button>
|
||||
<el-button icon="Delete" type="default" plain size="small" @click="resetForm">清空 </el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="avue-crud">
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
:span-method="objectSpanMethod"
|
||||
v-loading="dataListLoading"
|
||||
:summary-method="getSummaries"
|
||||
show-summary
|
||||
:row-style="changeRowColor"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
|
||||
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
|
||||
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
|
||||
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
|
||||
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
|
||||
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
|
||||
</el-table>
|
||||
</div>
|
||||
</basic-container>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { getContantByUserStatic } from "@/api/recruit/recruitstudentsignup"
|
||||
import { getList } from "@/api/recruit/recruitstudentplangroup"
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { getContantByUserStatic } from '@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// 响应式数据
|
||||
const dataForm = reactive({
|
||||
groupId: ""
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
const dataList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const indexArray = ref<number[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const searchFormRef = ref()
|
||||
const dataList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const indexArray = ref<number[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = () => {
|
||||
dataList.value = []
|
||||
indexArray.value = []
|
||||
dataListLoading.value = true
|
||||
getContantByUserStatic(dataForm).then((response: any) => {
|
||||
dataList.value = response.data
|
||||
let count = 0
|
||||
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
|
||||
indexArray.value.push(rowIndex)
|
||||
count = getRows(rowIndex, dataList.value[rowIndex].deptName)
|
||||
rowIndex += count
|
||||
}
|
||||
dataListLoading.value = false
|
||||
}).catch(() => {
|
||||
dataListLoading.value = false
|
||||
})
|
||||
}
|
||||
dataList.value = [];
|
||||
indexArray.value = [];
|
||||
dataListLoading.value = true;
|
||||
getContantByUserStatic(dataForm)
|
||||
.then((response: any) => {
|
||||
dataList.value = response.data;
|
||||
let count = 0;
|
||||
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
|
||||
indexArray.value.push(rowIndex);
|
||||
count = getRows(rowIndex, dataList.value[rowIndex].deptName);
|
||||
rowIndex += count;
|
||||
}
|
||||
dataListLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
dataListLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 改变行颜色
|
||||
const changeRowColor = ({ row }: any) => {
|
||||
if (row.contantName === "小记") {
|
||||
return {
|
||||
color: "red"
|
||||
}
|
||||
}
|
||||
}
|
||||
if (row.contantName === '小记') {
|
||||
return {
|
||||
color: 'red',
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 表格汇总
|
||||
const getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计'
|
||||
} else if (index !== 0 && index !== 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr)
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0) / 2
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计';
|
||||
} else if (index !== 0 && index !== 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] =
|
||||
values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr);
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0) / 2;
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
// 合并单元格
|
||||
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
|
||||
if (columnIndex === 0) {
|
||||
let rowCount = 0
|
||||
if (indexArray.value.includes(rowIndex)) {
|
||||
rowCount = getRows(rowIndex, row.deptName)
|
||||
return {
|
||||
rowspan: rowCount,
|
||||
colspan: 1
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (columnIndex === 0) {
|
||||
let rowCount = 0;
|
||||
if (indexArray.value.includes(rowIndex)) {
|
||||
rowCount = getRows(rowIndex, row.deptName);
|
||||
return {
|
||||
rowspan: rowCount,
|
||||
colspan: 1,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 获取行数
|
||||
const getRows = (rowIndex: number, name: string) => {
|
||||
let count = 0
|
||||
for (let i = rowIndex; i < dataList.value.length; i++) {
|
||||
if (dataList.value[i].deptName === name) {
|
||||
count++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
let count = 0;
|
||||
for (let i = rowIndex; i < dataList.value.length; i++) {
|
||||
if (dataList.value[i].deptName === name) {
|
||||
count++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置表单
|
||||
const resetForm = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
};
|
||||
|
||||
// 组件挂载时初始化
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.avue-crud {
|
||||
margin-top: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,157 +1,151 @@
|
||||
<template>
|
||||
<div>
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划" >
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<div>
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<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>
|
||||
<el-button icon="Search" type="primary"
|
||||
@click="handleFilter">查询
|
||||
</el-button>
|
||||
<el-button icon="Delete" type="default" plain
|
||||
@click="resetForm">清空
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form>
|
||||
<el-form-item>
|
||||
<el-button icon="Download" type="warning" @click="dataExportHandle">导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table :data="dataList" border stripe v-loading="dataListLoading" height="700"
|
||||
:summary-method="getSummaries" show-summary>
|
||||
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
|
||||
<el-table-column align="center" header-align="center" prop="allNum" label="合计" />
|
||||
<el-table-column align="center" header-align="center" prop="schoolNum" label="学校推荐" />
|
||||
<el-table-column align="center" header-align="center" prop="contantNum" label="联系人" />
|
||||
</el-table>
|
||||
</div>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="handleFilter">查询 </el-button>
|
||||
<el-button icon="Delete" type="default" plain @click="resetForm">清空 </el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form>
|
||||
<el-form-item>
|
||||
<el-button icon="Download" type="warning" @click="dataExportHandle">导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table :data="dataList" border stripe v-loading="dataListLoading" height="700" :summary-method="getSummaries" show-summary>
|
||||
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
|
||||
<el-table-column align="center" header-align="center" prop="allNum" label="合计" />
|
||||
<el-table-column align="center" header-align="center" prop="schoolNum" label="学校推荐" />
|
||||
<el-table-column align="center" header-align="center" prop="contantNum" label="联系人" />
|
||||
</el-table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import axios from 'axios'
|
||||
import { getContantByDeptStatic } from "@/api/recruit/recruitstudentsignup"
|
||||
import { getList } from "@/api/recruit/recruitstudentplangroup"
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import axios from 'axios';
|
||||
import { getContantByDeptStatic } from '@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// 响应式数据
|
||||
const dataForm = reactive({
|
||||
groupId: ""
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
const dataList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const searchFormRef = ref()
|
||||
const dataList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = () => {
|
||||
dataList.value = []
|
||||
dataListLoading.value = true
|
||||
getContantByDeptStatic(dataForm).then((response: any) => {
|
||||
dataList.value = response.data
|
||||
dataListLoading.value = false
|
||||
}).catch(() => {
|
||||
dataListLoading.value = false
|
||||
})
|
||||
}
|
||||
dataList.value = [];
|
||||
dataListLoading.value = true;
|
||||
getContantByDeptStatic(dataForm)
|
||||
.then((response: any) => {
|
||||
dataList.value = response.data;
|
||||
dataListLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
dataListLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 导出Excel
|
||||
const exportExcel = (form: any, url: string) => {
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
}
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// 导出表格
|
||||
const dataExportHandle = () => {
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/getContantByDeptStaticExport').then((res: any) => {
|
||||
const blob = new Blob([res.data])
|
||||
const fileName = '按部门导出.xls'
|
||||
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(() => {
|
||||
// 错误处理
|
||||
})
|
||||
}
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/getContantByDeptStaticExport')
|
||||
.then((res: any) => {
|
||||
const blob = new Blob([res.data]);
|
||||
const fileName = '按部门导出.xls';
|
||||
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 getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计'
|
||||
} else if (index !== 0) {
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr)
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0)
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计';
|
||||
} else if (index !== 0) {
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr);
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0);
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置表单
|
||||
const resetForm = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
};
|
||||
|
||||
// 组件挂载时初始化
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.avue-crud {
|
||||
margin-top: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,212 +1,215 @@
|
||||
<template>
|
||||
<div class="mod-config">
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<div class="mod-config">
|
||||
<el-form :inline="true" :model="dataForm" @keyup.enter="handleFilter" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<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>
|
||||
<el-button icon="Search" type="primary"
|
||||
@click="handleFilter">查询
|
||||
</el-button>
|
||||
<el-button icon="Delete" type="default" plain
|
||||
@click="resetForm">清空
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form>
|
||||
<el-form-item>
|
||||
<el-button icon="Download" type="warning" @click="dataExportHandle">导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="avue-crud">
|
||||
<el-table :data="dataList" border stripe :span-method="objectSpanMethod" v-loading="dataListLoading"
|
||||
:summary-method="getSummaries" show-summary :row-style="changeRowColor"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
|
||||
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
|
||||
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
|
||||
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
|
||||
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
|
||||
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-form-item>
|
||||
<el-button icon="Search" type="primary" @click="handleFilter">查询 </el-button>
|
||||
<el-button icon="Delete" type="default" plain @click="resetForm">清空 </el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form>
|
||||
<el-form-item>
|
||||
<el-button icon="Download" type="warning" @click="dataExportHandle">导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="avue-crud">
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
:span-method="objectSpanMethod"
|
||||
v-loading="dataListLoading"
|
||||
:summary-method="getSummaries"
|
||||
show-summary
|
||||
:row-style="changeRowColor"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="deptName" label="部门" />
|
||||
<el-table-column align="center" header-align="center" prop="contantName" label="联系人" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="招生人数" />
|
||||
<el-table-column align="center" header-align="center" prop="czNum" label="初中生" />
|
||||
<el-table-column align="center" header-align="center" prop="gzNum" label="高中生" />
|
||||
<el-table-column align="center" header-align="center" prop="jzxNum" label="技职校" />
|
||||
<el-table-column align="center" header-align="center" prop="allNum" label="高中+技职校" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import axios from 'axios'
|
||||
import { getContantByUserStatic } from "@/api/recruit/recruitstudentsignup"
|
||||
import { getList } from "@/api/recruit/recruitstudentplangroup"
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import axios from 'axios';
|
||||
import { getContantByUserStatic } from '@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// 响应式数据
|
||||
const dataForm = reactive({
|
||||
groupId: ""
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
const dataList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const indexArray = ref<number[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const searchFormRef = ref()
|
||||
const dataList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const indexArray = ref<number[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
});
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = () => {
|
||||
dataList.value = []
|
||||
indexArray.value = []
|
||||
dataListLoading.value = true
|
||||
getContantByUserStatic(dataForm).then((response: any) => {
|
||||
dataList.value = response.data
|
||||
let count = 0
|
||||
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
|
||||
indexArray.value.push(rowIndex)
|
||||
count = getRows(rowIndex, dataList.value[rowIndex].deptName)
|
||||
rowIndex += count
|
||||
}
|
||||
dataListLoading.value = false
|
||||
}).catch(() => {
|
||||
dataListLoading.value = false
|
||||
})
|
||||
}
|
||||
dataList.value = [];
|
||||
indexArray.value = [];
|
||||
dataListLoading.value = true;
|
||||
getContantByUserStatic(dataForm)
|
||||
.then((response: any) => {
|
||||
dataList.value = response.data;
|
||||
let count = 0;
|
||||
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
|
||||
indexArray.value.push(rowIndex);
|
||||
count = getRows(rowIndex, dataList.value[rowIndex].deptName);
|
||||
rowIndex += count;
|
||||
}
|
||||
dataListLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
dataListLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 导出Excel
|
||||
const exportExcel = (form: any, url: string) => {
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
}
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// 导出表格
|
||||
const dataExportHandle = () => {
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/getContantByUserStaticExport').then((res: any) => {
|
||||
const blob = new Blob([res.data])
|
||||
const fileName = '按联系人导出.xls'
|
||||
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(() => {
|
||||
// 错误处理
|
||||
})
|
||||
}
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/getContantByUserStaticExport')
|
||||
.then((res: any) => {
|
||||
const blob = new Blob([res.data]);
|
||||
const fileName = '按联系人导出.xls';
|
||||
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 changeRowColor = ({ row }: any) => {
|
||||
if (row.contantName === "小记") {
|
||||
return {
|
||||
color: "red"
|
||||
}
|
||||
}
|
||||
}
|
||||
if (row.contantName === '小记') {
|
||||
return {
|
||||
color: 'red',
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 表格汇总
|
||||
const getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计'
|
||||
} else if (index !== 0 && index !== 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr)
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0) / 2
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计';
|
||||
} else if (index !== 0 && index !== 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: number) => isNaN(value))) {
|
||||
sums[index] =
|
||||
values.reduce((prev: number, curr: number) => {
|
||||
const numValue = Number(curr);
|
||||
if (!isNaN(numValue)) {
|
||||
return prev + numValue;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0) / 2;
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
// 合并单元格
|
||||
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
|
||||
if (columnIndex === 0) {
|
||||
let rowCount = 0
|
||||
if (indexArray.value.includes(rowIndex)) {
|
||||
rowCount = getRows(rowIndex, row.deptName)
|
||||
return {
|
||||
rowspan: rowCount,
|
||||
colspan: 1
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (columnIndex === 0) {
|
||||
let rowCount = 0;
|
||||
if (indexArray.value.includes(rowIndex)) {
|
||||
rowCount = getRows(rowIndex, row.deptName);
|
||||
return {
|
||||
rowspan: rowCount,
|
||||
colspan: 1,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 获取行数
|
||||
const getRows = (rowIndex: number, name: string) => {
|
||||
let count = 0
|
||||
for (let i = rowIndex; i < dataList.value.length; i++) {
|
||||
if (dataList.value[i].deptName === name) {
|
||||
count++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
let count = 0;
|
||||
for (let i = rowIndex; i < dataList.value.length; i++) {
|
||||
if (dataList.value[i].deptName === name) {
|
||||
count++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置表单
|
||||
const resetForm = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
};
|
||||
|
||||
// 组件挂载时初始化
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.avue-crud {
|
||||
margin-top: 20px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,40 +1,39 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName" @tab-click="handleTabClick">
|
||||
<el-tab-pane label="按联系人统计" name="tab">
|
||||
<ContanctByUserStatic ref="tabIndexRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="按部门统计" name="static">
|
||||
<ContanctByDeptStatic ref="staticIndexRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName" @tab-click="handleTabClick">
|
||||
<el-tab-pane label="按联系人统计" name="tab">
|
||||
<ContanctByUserStatic ref="tabIndexRef" />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="按部门统计" name="static">
|
||||
<ContanctByDeptStatic ref="staticIndexRef" />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-contanctStatic">
|
||||
import { ref, defineAsyncComponent, nextTick } from 'vue'
|
||||
import { ref, defineAsyncComponent, nextTick } from 'vue';
|
||||
|
||||
const ContanctByUserStatic = defineAsyncComponent(() => import('./contanctByUserStatic.vue'))
|
||||
const ContanctByDeptStatic = defineAsyncComponent(() => import('./contanctByDeptStatic.vue'))
|
||||
const ContanctByUserStatic = defineAsyncComponent(() => import('./contanctByUserStatic.vue'));
|
||||
const ContanctByDeptStatic = defineAsyncComponent(() => import('./contanctByDeptStatic.vue'));
|
||||
|
||||
// 状态
|
||||
const activeName = ref('tab')
|
||||
const tabIndexRef = ref()
|
||||
const staticIndexRef = ref()
|
||||
const activeName = ref('tab');
|
||||
const tabIndexRef = ref();
|
||||
const staticIndexRef = ref();
|
||||
|
||||
// Tab 切换
|
||||
const handleTabClick = (tab: any) => {
|
||||
if (tab.paneName === 'tab') {
|
||||
nextTick(() => {
|
||||
tabIndexRef.value?.init()
|
||||
})
|
||||
} else {
|
||||
nextTick(() => {
|
||||
staticIndexRef.value?.init()
|
||||
})
|
||||
}
|
||||
}
|
||||
if (tab.paneName === 'tab') {
|
||||
nextTick(() => {
|
||||
tabIndexRef.value?.init();
|
||||
});
|
||||
} else {
|
||||
nextTick(() => {
|
||||
staticIndexRef.value?.init();
|
||||
});
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,277 +1,279 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
title="请设置住宿范围"
|
||||
append-to-body
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="90%">
|
||||
<div>
|
||||
<el-form :model="form" :rules="rules" ref="formRef" class="demo-ruleForm">
|
||||
<el-form-item label="住宿半径(米)" prop="raidus">
|
||||
<el-input-number v-model="form.raidus" :min="0" style="width: 100%"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div id="container"></div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog title="请设置住宿范围" append-to-body :close-on-click-modal="false" v-model="visible" width="90%">
|
||||
<div>
|
||||
<el-form :model="form" :rules="rules" ref="formRef" class="demo-ruleForm">
|
||||
<el-form-item label="住宿半径(米)" prop="raidus">
|
||||
<el-input-number v-model="form.raidus" :min="0" style="width: 100%"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div id="container"></div>
|
||||
</div>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, watch, nextTick } from 'vue'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { loadTiandituMap } from "/@/api/recruit/recruitstudentsignup"
|
||||
import { editDormrange } from "/@/api/admin/dict"
|
||||
import { getDicts } from "/@/api/admin/dict"
|
||||
import { TIANDITU_TOKEN } from '/@/config/map'
|
||||
import { ref, reactive, watch, nextTick } from 'vue';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { loadTiandituMap } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { editDormrange } from '/@/api/admin/dict';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
import { TIANDITU_TOKEN } from '/@/config/map';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表单引用
|
||||
const formRef = ref()
|
||||
const formRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const tk = TIANDITU_TOKEN // 天地图的token(在 src/config/map.ts 中配置)
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const circleShow = ref(false)
|
||||
const circle = ref<any>(null)
|
||||
const map = ref<any>(null)
|
||||
const tk = TIANDITU_TOKEN; // 天地图的token(在 src/config/map.ts 中配置)
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const circleShow = ref(false);
|
||||
const circle = ref<any>(null);
|
||||
const map = ref<any>(null);
|
||||
|
||||
// 地址信息
|
||||
const center = reactive({ lng: 0, lat: 0 })
|
||||
const dictId = ref("")
|
||||
const center = reactive({ lng: 0, lat: 0 });
|
||||
const dictId = ref('');
|
||||
|
||||
const form = reactive({
|
||||
raidus: 0,
|
||||
})
|
||||
raidus: 0,
|
||||
});
|
||||
|
||||
const rules = {
|
||||
raidus: [
|
||||
{ required: true, message: '住宿半径不能为空', trigger: ["blur", "change"] }
|
||||
],
|
||||
}
|
||||
raidus: [{ required: true, message: '住宿半径不能为空', trigger: ['blur', 'change'] }],
|
||||
};
|
||||
|
||||
// 监听半径变化
|
||||
watch(() => form.raidus, (newVal) => {
|
||||
if (newVal !== 0 && newVal !== undefined && circle.value && map.value) {
|
||||
// 移除旧圆形
|
||||
map.value.removeOverLay(circle.value)
|
||||
// 创建新圆形(确保数据类型正确)
|
||||
// @ts-ignore
|
||||
const newCircle = new window.T.Circle(
|
||||
// @ts-ignore
|
||||
new window.T.LngLat(
|
||||
// @ts-ignore
|
||||
parseFloat(center.lng),
|
||||
// @ts-ignore
|
||||
parseFloat(center.lat)
|
||||
),
|
||||
// @ts-ignore
|
||||
parseFloat(newVal), // 确保半径是数字类型
|
||||
{
|
||||
color: '#FF0000', // 边框颜色:鲜红色
|
||||
weight: 4, // 边框粗细:4像素
|
||||
opacity: 0.9, // 边框不透明度:90%
|
||||
fillColor: '#FF4444', // 填充颜色:亮红色
|
||||
fillOpacity: 0.12 // 填充透明度:12%
|
||||
}
|
||||
)
|
||||
map.value.addOverLay(newCircle)
|
||||
circle.value = newCircle
|
||||
|
||||
// 让新圆形也不拦截鼠标事件
|
||||
setTimeout(() => {
|
||||
const circleElements = document.querySelectorAll('.tdt-circle, [class*="circle"]')
|
||||
circleElements.forEach((el: any) => {
|
||||
el.style.pointerEvents = 'none'
|
||||
})
|
||||
}, 100)
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => form.raidus,
|
||||
(newVal) => {
|
||||
if (newVal !== 0 && newVal !== undefined && circle.value && map.value) {
|
||||
// 移除旧圆形
|
||||
map.value.removeOverLay(circle.value);
|
||||
// 创建新圆形(确保数据类型正确)
|
||||
// @ts-ignore
|
||||
const newCircle = new window.T.Circle(
|
||||
// @ts-ignore
|
||||
new window.T.LngLat(
|
||||
// @ts-ignore
|
||||
parseFloat(center.lng),
|
||||
// @ts-ignore
|
||||
parseFloat(center.lat)
|
||||
),
|
||||
// @ts-ignore
|
||||
parseFloat(newVal), // 确保半径是数字类型
|
||||
{
|
||||
color: '#FF0000', // 边框颜色:鲜红色
|
||||
weight: 4, // 边框粗细:4像素
|
||||
opacity: 0.9, // 边框不透明度:90%
|
||||
fillColor: '#FF4444', // 填充颜色:亮红色
|
||||
fillOpacity: 0.12, // 填充透明度:12%
|
||||
}
|
||||
);
|
||||
map.value.addOverLay(newCircle);
|
||||
circle.value = newCircle;
|
||||
|
||||
// 让新圆形也不拦截鼠标事件
|
||||
setTimeout(() => {
|
||||
const circleElements = document.querySelectorAll('.tdt-circle, [class*="circle"]');
|
||||
circleElements.forEach((el: any) => {
|
||||
el.style.pointerEvents = 'none';
|
||||
});
|
||||
}, 100);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
circleShow.value = true
|
||||
nextTick(() => {
|
||||
getDicts("recruit_dorm_jw").then((data: any) => {
|
||||
const arr = data.data
|
||||
arr.forEach((e: any) => {
|
||||
if (e.label == 'bj') {
|
||||
form.raidus = e.value
|
||||
dictId.value = e.id
|
||||
} else if (e.label == 'lng') {
|
||||
center.lng = e.value
|
||||
} else if (e.label == 'lat') {
|
||||
center.lat = e.value
|
||||
}
|
||||
})
|
||||
|
||||
// 等待对话框渲染完成后再加载地图
|
||||
setTimeout(() => {
|
||||
// 调试信息:打印配置数据
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地图配置:', { lng: center.lng, lat: center.lat, radius: form.raidus, token: tk })
|
||||
|
||||
loadTiandituMap(tk).then((T: any) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('天地图API加载成功', T)
|
||||
|
||||
// 清除之前的地图实例(如果存在)
|
||||
if (map.value) {
|
||||
map.value.clearOverLays()
|
||||
}
|
||||
|
||||
// 创建地图实例
|
||||
map.value = new T.Map("container")
|
||||
// 创建点坐标(确保经纬度是数字类型)
|
||||
// @ts-ignore
|
||||
const point = new T.LngLat(
|
||||
// @ts-ignore
|
||||
parseFloat(center.lng),
|
||||
// @ts-ignore
|
||||
parseFloat(center.lat)
|
||||
)
|
||||
|
||||
// 根据半径自动计算合适的缩放级别
|
||||
// @ts-ignore
|
||||
const radius = parseFloat(form.raidus)
|
||||
let zoomLevel = 12 // 默认缩放级别
|
||||
|
||||
// 根据半径动态调整缩放级别
|
||||
if (radius <= 1000) {
|
||||
zoomLevel = 15 // 1公里以内 - 非常近
|
||||
} else if (radius <= 3000) {
|
||||
zoomLevel = 14 // 3公里以内 - 近距离
|
||||
} else if (radius <= 5000) {
|
||||
zoomLevel = 13 // 5公里以内 - 中等距离
|
||||
} else if (radius <= 10000) {
|
||||
zoomLevel = 12 // 10公里以内 - 较远
|
||||
} else if (radius <= 20000) {
|
||||
zoomLevel = 11 // 20公里以内 - 远距离
|
||||
} else {
|
||||
zoomLevel = 10 // 20公里以上 - 超远距离
|
||||
}
|
||||
|
||||
// 初始化地图,设置中心点坐标和地图级别
|
||||
map.value.centerAndZoom(point, zoomLevel)
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地图缩放级别:', zoomLevel, '(半径:', radius, '米)')
|
||||
|
||||
// 添加地图类型切换控件(让用户可以切换卫星图/普通图)
|
||||
const ctrl = new T.Control.MapType()
|
||||
map.value.addControl(ctrl)
|
||||
|
||||
// 默认使用矢量地图(普通地图),用户可通过右上角控件切换到卫星图
|
||||
|
||||
// 绘制圆形覆盖物(使用前面已计算好的 radius 变量)
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('绘制圆形:', { center: point, radius: radius, radiusType: typeof radius })
|
||||
|
||||
circle.value = new T.Circle(point, radius, {
|
||||
color: '#FF0000', // 边框颜色:鲜红色,更醒目
|
||||
weight: 4, // 边框粗细:4像素,更明显
|
||||
opacity: 0.9, // 边框不透明度:90%,清晰可见
|
||||
fillColor: '#FF4444', // 填充颜色:亮红色
|
||||
fillOpacity: 0.12 // 填充透明度:12%,轻盈不遮挡地图
|
||||
})
|
||||
map.value.addOverLay(circle.value)
|
||||
|
||||
// 让圆形不拦截鼠标事件,使地图可以在圆圈内拖拽
|
||||
// 通过 CSS 设置 pointer-events 为 none
|
||||
setTimeout(() => {
|
||||
const circleElements = document.querySelectorAll('.tdt-circle, [class*="circle"]')
|
||||
circleElements.forEach((el: any) => {
|
||||
el.style.pointerEvents = 'none'
|
||||
})
|
||||
}, 100)
|
||||
|
||||
// 添加中心点标记(更明显地标识中心位置)
|
||||
const marker = new T.Marker(point)
|
||||
map.value.addOverLay(marker)
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地图初始化完成 - 圆形已添加')
|
||||
}).catch((error: any) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error('天地图加载失败:', error)
|
||||
message.error('地图加载失败,请检查网络连接或Token配置')
|
||||
})
|
||||
}, 200)
|
||||
}).catch(() => {
|
||||
message.error('获取地图配置失败')
|
||||
})
|
||||
})
|
||||
}
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
circleShow.value = true;
|
||||
nextTick(() => {
|
||||
getDicts('recruit_dorm_jw')
|
||||
.then((data: any) => {
|
||||
const arr = data.data;
|
||||
arr.forEach((e: any) => {
|
||||
if (e.label == 'bj') {
|
||||
form.raidus = e.value;
|
||||
dictId.value = e.id;
|
||||
} else if (e.label == 'lng') {
|
||||
center.lng = e.value;
|
||||
} else if (e.label == 'lat') {
|
||||
center.lat = e.value;
|
||||
}
|
||||
});
|
||||
|
||||
// 等待对话框渲染完成后再加载地图
|
||||
setTimeout(() => {
|
||||
// 调试信息:打印配置数据
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地图配置:', { lng: center.lng, lat: center.lat, radius: form.raidus, token: tk });
|
||||
|
||||
loadTiandituMap(tk)
|
||||
.then((T: any) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('天地图API加载成功', T);
|
||||
|
||||
// 清除之前的地图实例(如果存在)
|
||||
if (map.value) {
|
||||
map.value.clearOverLays();
|
||||
}
|
||||
|
||||
// 创建地图实例
|
||||
map.value = new T.Map('container');
|
||||
// 创建点坐标(确保经纬度是数字类型)
|
||||
// @ts-ignore
|
||||
const point = new T.LngLat(
|
||||
// @ts-ignore
|
||||
parseFloat(center.lng),
|
||||
// @ts-ignore
|
||||
parseFloat(center.lat)
|
||||
);
|
||||
|
||||
// 根据半径自动计算合适的缩放级别
|
||||
// @ts-ignore
|
||||
const radius = parseFloat(form.raidus);
|
||||
let zoomLevel = 12; // 默认缩放级别
|
||||
|
||||
// 根据半径动态调整缩放级别
|
||||
if (radius <= 1000) {
|
||||
zoomLevel = 15; // 1公里以内 - 非常近
|
||||
} else if (radius <= 3000) {
|
||||
zoomLevel = 14; // 3公里以内 - 近距离
|
||||
} else if (radius <= 5000) {
|
||||
zoomLevel = 13; // 5公里以内 - 中等距离
|
||||
} else if (radius <= 10000) {
|
||||
zoomLevel = 12; // 10公里以内 - 较远
|
||||
} else if (radius <= 20000) {
|
||||
zoomLevel = 11; // 20公里以内 - 远距离
|
||||
} else {
|
||||
zoomLevel = 10; // 20公里以上 - 超远距离
|
||||
}
|
||||
|
||||
// 初始化地图,设置中心点坐标和地图级别
|
||||
map.value.centerAndZoom(point, zoomLevel);
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地图缩放级别:', zoomLevel, '(半径:', radius, '米)');
|
||||
|
||||
// 添加地图类型切换控件(让用户可以切换卫星图/普通图)
|
||||
const ctrl = new T.Control.MapType();
|
||||
map.value.addControl(ctrl);
|
||||
|
||||
// 默认使用矢量地图(普通地图),用户可通过右上角控件切换到卫星图
|
||||
|
||||
// 绘制圆形覆盖物(使用前面已计算好的 radius 变量)
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('绘制圆形:', { center: point, radius: radius, radiusType: typeof radius });
|
||||
|
||||
circle.value = new T.Circle(point, radius, {
|
||||
color: '#FF0000', // 边框颜色:鲜红色,更醒目
|
||||
weight: 4, // 边框粗细:4像素,更明显
|
||||
opacity: 0.9, // 边框不透明度:90%,清晰可见
|
||||
fillColor: '#FF4444', // 填充颜色:亮红色
|
||||
fillOpacity: 0.12, // 填充透明度:12%,轻盈不遮挡地图
|
||||
});
|
||||
map.value.addOverLay(circle.value);
|
||||
|
||||
// 让圆形不拦截鼠标事件,使地图可以在圆圈内拖拽
|
||||
// 通过 CSS 设置 pointer-events 为 none
|
||||
setTimeout(() => {
|
||||
const circleElements = document.querySelectorAll('.tdt-circle, [class*="circle"]');
|
||||
circleElements.forEach((el: any) => {
|
||||
el.style.pointerEvents = 'none';
|
||||
});
|
||||
}, 100);
|
||||
|
||||
// 添加中心点标记(更明显地标识中心位置)
|
||||
const marker = new T.Marker(point);
|
||||
map.value.addOverLay(marker);
|
||||
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地图初始化完成 - 圆形已添加');
|
||||
})
|
||||
.catch((error: any) => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error('天地图加载失败:', error);
|
||||
message.error('地图加载失败,请检查网络连接或Token配置');
|
||||
});
|
||||
}, 200);
|
||||
})
|
||||
.catch(() => {
|
||||
message.error('获取地图配置失败');
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = async () => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认保存住宿半径')
|
||||
formRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
editDormrange({ id: dictId.value, value: form.raidus }).then(() => {
|
||||
message.success('修改成功')
|
||||
visible.value = false
|
||||
canSubmit.value = true
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
})
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认保存住宿半径');
|
||||
formRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
editDormrange({ id: dictId.value, value: form.raidus })
|
||||
.then(() => {
|
||||
message.success('修改成功');
|
||||
visible.value = false;
|
||||
canSubmit.value = true;
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
});
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
#container {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 700px;
|
||||
margin: 0;
|
||||
font-family: "微软雅黑";
|
||||
margin-top: 15px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 700px;
|
||||
margin: 0;
|
||||
font-family: '微软雅黑';
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: none;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
/* 让地图上的圆形覆盖物不拦截鼠标事件,使地图可以拖拽 */
|
||||
#container svg path[fill*="#FF"],
|
||||
#container svg path[stroke*="#FF"],
|
||||
#container svg path[fill*='#FF'],
|
||||
#container svg path[stroke*='#FF'],
|
||||
#container svg circle,
|
||||
#container canvas {
|
||||
pointer-events: none !important;
|
||||
pointer-events: none !important;
|
||||
}
|
||||
|
||||
/* 但保持标记点可点击 */
|
||||
#container .tdt-marker,
|
||||
#container img {
|
||||
pointer-events: auto !important;
|
||||
pointer-events: auto !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,160 +1,131 @@
|
||||
<template>
|
||||
<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="请选择招生计划">
|
||||
<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>
|
||||
<el-button type="warning"
|
||||
icon="Download"
|
||||
plain
|
||||
@click="handleExport">汇总导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
show-summary
|
||||
v-loading="dataListLoading">
|
||||
|
||||
<el-table-column
|
||||
prop="deptCode"
|
||||
header-align="center"
|
||||
align="center"
|
||||
width="120"
|
||||
label="学院">
|
||||
<template #default="scope">
|
||||
<span>{{ getLabelValueByProps(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="total"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="申请人数(范围外)">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="man"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="男生数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="woman"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="女生数">
|
||||
</el-table-column>
|
||||
|
||||
</el-table>
|
||||
</div>
|
||||
<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="请选择招生计划">
|
||||
<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>
|
||||
<el-button type="warning" icon="Download" plain @click="handleExport">汇总导出</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-table :data="dataList" border stripe show-summary v-loading="dataListLoading">
|
||||
<el-table-column prop="deptCode" header-align="center" align="center" width="120" label="学院">
|
||||
<template #default="scope">
|
||||
<span>{{ getLabelValueByProps(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="total" header-align="center" align="center" label="申请人数(范围外)"> </el-table-column>
|
||||
<el-table-column prop="man" header-align="center" align="center" label="男生数"> </el-table-column>
|
||||
<el-table-column prop="woman" header-align="center" align="center" label="女生数"> </el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<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 { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getLabelValueByProps } from '/@/utils/dictLabel'
|
||||
import { ref, reactive, watch, onMounted } from 'vue';
|
||||
import axios from 'axios';
|
||||
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[]>([])
|
||||
const dataList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const searchFormRef = ref()
|
||||
const deptList = ref<any[]>([]);
|
||||
const dataList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const searchFormRef = ref();
|
||||
|
||||
const dataForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 监听 groupId 变化
|
||||
watch(() => dataForm.groupId, (val) => {
|
||||
if (val) {
|
||||
getTableList(val)
|
||||
}
|
||||
})
|
||||
watch(
|
||||
() => dataForm.groupId,
|
||||
(val) => {
|
||||
if (val) {
|
||||
getTableList(val);
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// 初始化部门列表
|
||||
const initDept = () => {
|
||||
getDeptList().then((data: any) => {
|
||||
deptList.value = data.data
|
||||
})
|
||||
}
|
||||
getDeptList().then((data: any) => {
|
||||
deptList.value = data.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 导出Excel
|
||||
const exportExcel = (form: any, url: string) => {
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
}
|
||||
return axios({
|
||||
method: 'post',
|
||||
url: url,
|
||||
data: form,
|
||||
responseType: 'blob',
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// 导出处理
|
||||
const handleExport = () => {
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/dormApplyAnalysisExport').then((res: any) => {
|
||||
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(() => {
|
||||
// 错误处理
|
||||
})
|
||||
}
|
||||
exportExcel(dataForm, '/recruit/recruitstudentsignup/dormApplyAnalysisExport')
|
||||
.then((res: any) => {
|
||||
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 initPlanGroup = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id
|
||||
}
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
if (planList.value.length > 0) {
|
||||
dataForm.groupId = planList.value[0].id;
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 获取表格数据
|
||||
const getTableList = (groupId: string) => {
|
||||
dataListLoading.value = true
|
||||
dormApplyAnalysis({ "groupId": groupId }).then((response: any) => {
|
||||
dataList.value = response.data
|
||||
dataListLoading.value = false
|
||||
}).catch(() => {
|
||||
dataListLoading.value = false
|
||||
})
|
||||
}
|
||||
dataListLoading.value = true;
|
||||
dormApplyAnalysis({ groupId: groupId })
|
||||
.then((response: any) => {
|
||||
dataList.value = response.data;
|
||||
dataListLoading.value = false;
|
||||
})
|
||||
.catch(() => {
|
||||
dataListLoading.value = false;
|
||||
});
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = () => {
|
||||
if (dataForm.groupId) {
|
||||
getTableList(dataForm.groupId)
|
||||
}
|
||||
}
|
||||
if (dataForm.groupId) {
|
||||
getTableList(dataForm.groupId);
|
||||
}
|
||||
};
|
||||
|
||||
// 组件挂载时初始化
|
||||
onMounted(() => {
|
||||
initDept()
|
||||
initPlanGroup()
|
||||
})
|
||||
initDept();
|
||||
initPlanGroup();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,127 +1,106 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<header style="font-size: 40px; text-align: center; margin-bottom: 20px;">
|
||||
历年常州地区初中生分数段人数统计(本省本市、初中生源)
|
||||
</header>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<header style="font-size: 40px; text-align: center; margin-bottom: 20px">历年常州地区初中生分数段人数统计(本省本市、初中生源)</header>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="dataListLoading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="socre" header-align="center" align="center" label="分数段" />
|
||||
<el-table-column
|
||||
v-for="(item, index) in headList"
|
||||
:key="index"
|
||||
:prop="item.year"
|
||||
:label="item.year"
|
||||
header-align="center"
|
||||
>
|
||||
<el-table-column
|
||||
:prop="item.propOne"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数"
|
||||
/>
|
||||
<el-table-column
|
||||
:prop="item.propTwo"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比"
|
||||
/>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="dataListLoading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="socre" header-align="center" align="center" label="分数段" />
|
||||
<el-table-column v-for="(item, index) in headList" :key="index" :prop="item.year" :label="item.year" header-align="center">
|
||||
<el-table-column :prop="item.propOne" header-align="center" align="center" label="人数" />
|
||||
<el-table-column :prop="item.propTwo" header-align="center" align="center" label="占比" />
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-inSchoolSocreStatic">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { inSchoolSocreStatic } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { inSchoolSocreStatic } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 状态
|
||||
const headList = ref<any[]>([])
|
||||
const deptCodes = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const dataList = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const exportLoading = ref(false)
|
||||
const headList = ref<any[]>([]);
|
||||
const deptCodes = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const dataList = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 使用 table hook 获取样式
|
||||
const { tableStyle, downBlobFile } = useTable()
|
||||
const { tableStyle, downBlobFile } = useTable();
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const [deptResponse, planData] = await Promise.all([
|
||||
getDeptListByLevelTwo(),
|
||||
getList()
|
||||
])
|
||||
|
||||
deptCodes.value = deptResponse.data || []
|
||||
planList.value = planData.data || []
|
||||
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
getDataList()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const [deptResponse, planData] = await Promise.all([getDeptListByLevelTwo(), getList()]);
|
||||
|
||||
deptCodes.value = deptResponse.data || [];
|
||||
planList.value = planData.data || [];
|
||||
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
getDataList();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = async () => {
|
||||
try {
|
||||
dataListLoading.value = true
|
||||
dataList.value = []
|
||||
const response = await inSchoolSocreStatic(queryForm)
|
||||
if (response.data && response.data.length > 0) {
|
||||
response.data.forEach((e: any) => {
|
||||
dataList.value.push(e.map)
|
||||
})
|
||||
headList.value = response.data[0].list || []
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error)
|
||||
} finally {
|
||||
dataListLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
dataListLoading.value = true;
|
||||
dataList.value = [];
|
||||
const response = await inSchoolSocreStatic(queryForm);
|
||||
if (response.data && response.data.length > 0) {
|
||||
response.data.forEach((e: any) => {
|
||||
dataList.value.push(e.map);
|
||||
});
|
||||
headList.value = response.data[0].list || [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error);
|
||||
} finally {
|
||||
dataListLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 导出
|
||||
const dataExportHandle = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
await downBlobFile('/recruit/recruitstudentsignup/inSchoolSocreStaticExport', queryForm, '历年常州地区初中生分数段统计.xls')
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
await downBlobFile('/recruit/recruitstudentsignup/inSchoolSocreStaticExport', queryForm, '历年常州地区初中生分数段统计.xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,111 +1,100 @@
|
||||
<template>
|
||||
<el-dialog v-model="visible" width="600" :title="`面试审核(${row.name})`">
|
||||
<el-form ref="dataFormRef" :model="dataForm" :rules="dataRule" label-width="120px">
|
||||
<el-form-item label="面试结果" prop="interview">
|
||||
<el-radio-group v-model="dataForm.interview" @change="handleInterviewChange">
|
||||
<el-radio :label="item.value" v-for="item in interviewDicList" :key="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="未通过原因" prop="interviewReason" v-if="dataForm.interview == '-1'">
|
||||
<el-input
|
||||
type="textarea"
|
||||
v-model="dataForm.interviewReason"
|
||||
placeholder="请输入未通过的原因"
|
||||
:rows="4">
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-dialog v-model="visible" width="600" :title="`面试审核(${row.name})`">
|
||||
<el-form ref="dataFormRef" :model="dataForm" :rules="dataRule" label-width="120px">
|
||||
<el-form-item label="面试结果" prop="interview">
|
||||
<el-radio-group v-model="dataForm.interview" @change="handleInterviewChange">
|
||||
<el-radio :label="item.value" v-for="item in interviewDicList" :key="item.value">{{ item.label }}</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item label="未通过原因" prop="interviewReason" v-if="dataForm.interview == '-1'">
|
||||
<el-input type="textarea" v-model="dataForm.interviewReason" placeholder="请输入未通过的原因" :rows="4"> </el-input>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="confirm">确认</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="confirm">确认</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { interview } from "/@/api/recruit/recruitstudentsignup"
|
||||
import { INTERVIEW_DIC_LIST } from '/@/config/global'
|
||||
import type { FormInstance } from 'element-plus'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { interview } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { INTERVIEW_DIC_LIST } from '/@/config/global';
|
||||
import type { FormInstance } from 'element-plus';
|
||||
|
||||
const interviewDicList = INTERVIEW_DIC_LIST.filter((item) => item.value != '0')
|
||||
const interviewDicList = INTERVIEW_DIC_LIST.filter((item) => item.value != '0');
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refresh'): void
|
||||
}>()
|
||||
(e: 'refresh'): void;
|
||||
}>();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const row = reactive<any>({})
|
||||
const dataFormRef = ref<FormInstance>()
|
||||
const visible = ref(false);
|
||||
const row = reactive<any>({});
|
||||
const dataFormRef = ref<FormInstance>();
|
||||
const dataForm = reactive({
|
||||
interview: '1',
|
||||
interviewReason: ''
|
||||
})
|
||||
interview: '1',
|
||||
interviewReason: '',
|
||||
});
|
||||
|
||||
// 表单验证规则
|
||||
const dataRule = reactive({
|
||||
interview: [
|
||||
{ required: true, message: '请选择面试结果', trigger: 'change' }
|
||||
],
|
||||
interviewReason: [] as any[]
|
||||
})
|
||||
interview: [{ required: true, message: '请选择面试结果', trigger: 'change' }],
|
||||
interviewReason: [] as any[],
|
||||
});
|
||||
|
||||
// 初始化
|
||||
const init = (rowData: any) => {
|
||||
visible.value = true
|
||||
Object.assign(row, rowData)
|
||||
dataForm.interview = rowData.interview || '1'
|
||||
dataForm.interviewReason = rowData.interviewReason || ''
|
||||
// 重置表单验证状态
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.clearValidate()
|
||||
})
|
||||
}
|
||||
visible.value = true;
|
||||
Object.assign(row, rowData);
|
||||
dataForm.interview = rowData.interview || '1';
|
||||
dataForm.interviewReason = rowData.interviewReason || '';
|
||||
// 重置表单验证状态
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.clearValidate();
|
||||
});
|
||||
};
|
||||
|
||||
// 面试结果改变
|
||||
const handleInterviewChange = () => {
|
||||
dataForm.interviewReason = ''
|
||||
if(dataForm.interview == '-1'){
|
||||
dataRule.interviewReason = [
|
||||
{ required: true, message: '请输入未通过的原因', trigger: 'blur' }
|
||||
]
|
||||
} else {
|
||||
dataRule.interviewReason = []
|
||||
}
|
||||
}
|
||||
dataForm.interviewReason = '';
|
||||
if (dataForm.interview == '-1') {
|
||||
dataRule.interviewReason = [{ required: true, message: '请输入未通过的原因', trigger: 'blur' }];
|
||||
} else {
|
||||
dataRule.interviewReason = [];
|
||||
}
|
||||
};
|
||||
|
||||
// 确认
|
||||
const confirm = () => {
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (!valid) {
|
||||
return
|
||||
}
|
||||
interview({
|
||||
"id": row.id,
|
||||
"interview": dataForm.interview,
|
||||
"interviewReason": dataForm.interviewReason
|
||||
}).then(() => {
|
||||
message.success('操作成功')
|
||||
visible.value = false
|
||||
emit('refresh')
|
||||
})
|
||||
})
|
||||
}
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (!valid) {
|
||||
return;
|
||||
}
|
||||
interview({
|
||||
id: row.id,
|
||||
interview: dataForm.interview,
|
||||
interviewReason: dataForm.interviewReason,
|
||||
}).then(() => {
|
||||
message.success('操作成功');
|
||||
visible.value = false;
|
||||
emit('refresh');
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
</style>
|
||||
<style scoped></style>
|
||||
|
||||
@@ -1,195 +1,182 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学制" prop="learnYear">
|
||||
<el-select v-model="queryForm.learnYear" filterable placeholder="请选择学制" clearable>
|
||||
<el-option
|
||||
v-for="item in majorYears"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否联院" prop="isUnion">
|
||||
<el-select v-model="queryForm.isUnion" filterable placeholder="请选择是否联院" clearable>
|
||||
<el-option key="0" label="否" value="0" />
|
||||
<el-option key="1" label="是" value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学制" prop="learnYear">
|
||||
<el-select v-model="queryForm.learnYear" filterable placeholder="请选择学制" clearable>
|
||||
<el-option v-for="item in majorYears" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否联院" prop="isUnion">
|
||||
<el-select v-model="queryForm.isUnion" filterable placeholder="请选择是否联院" clearable>
|
||||
<el-option key="0" label="否" value="0" />
|
||||
<el-option key="1" label="是" value="1" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
:row-style="changeRowColor"
|
||||
v-loading="dataListLoading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="indexNum" header-align="center" align="center" label="序号">
|
||||
<template #default="scope">
|
||||
{{ scope.row.indexNum }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="deptCode" header-align="center" align="center" label="系部">
|
||||
<template #default="scope">
|
||||
{{ getDeptType(scope.row.deptCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="majorName" header-align="center" align="center" label="所报专业" />
|
||||
<el-table-column prop="maxScore" header-align="center" align="center" label="最高分" />
|
||||
<el-table-column prop="minScore" header-align="center" align="center" label="最低分" />
|
||||
<el-table-column prop="avgScore" header-align="center" align="center" label="平均分" />
|
||||
<el-table-column prop="majorPeopleNum" header-align="center" align="center" label="专业人数" />
|
||||
<!-- <el-table-column prop="avgScoreDB" header-align="center" align="center" label="均分对比" />-->
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
:row-style="changeRowColor"
|
||||
v-loading="dataListLoading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="indexNum" header-align="center" align="center" label="序号">
|
||||
<template #default="scope">
|
||||
{{ scope.row.indexNum }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="deptCode" header-align="center" align="center" label="系部">
|
||||
<template #default="scope">
|
||||
{{ getDeptType(scope.row.deptCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="majorName" header-align="center" align="center" label="所报专业" />
|
||||
<el-table-column prop="maxScore" header-align="center" align="center" label="最高分" />
|
||||
<el-table-column prop="minScore" header-align="center" align="center" label="最低分" />
|
||||
<el-table-column prop="avgScore" header-align="center" align="center" label="平均分" />
|
||||
<el-table-column prop="majorPeopleNum" header-align="center" align="center" label="专业人数" />
|
||||
<!-- <el-table-column prop="avgScoreDB" header-align="center" align="center" label="均分对比" />-->
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-juniorlneStatic">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import { juniorlneStatic } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept'
|
||||
import {getDictsByTypes} from "/@/api/admin/dict";
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { juniorlneStatic } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { getDeptListByLevelTwo } from '/@/api/basic/basicdept';
|
||||
import { getDictsByTypes } from '/@/api/admin/dict';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 字典
|
||||
// const { useDict } = useDict()
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const deptCodes = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const dataList = ref<any[]>([])
|
||||
const majorYears = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const exportLoading = ref(false)
|
||||
const deptCodes = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const dataList = ref<any[]>([]);
|
||||
const majorYears = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
learnYear: '',
|
||||
isUnion: ''
|
||||
})
|
||||
groupId: '',
|
||||
learnYear: '',
|
||||
isUnion: '',
|
||||
});
|
||||
|
||||
// 使用 table hook 获取样式
|
||||
const { tableStyle, downBlobFile } = useTable()
|
||||
const { tableStyle, downBlobFile } = useTable();
|
||||
|
||||
const queryDictData=()=>{
|
||||
getDictsByTypes(['basic_major_years']).then((res:any)=>{
|
||||
majorYears.value = res.data.basic_major_years || []
|
||||
})
|
||||
}
|
||||
const queryDictData = () => {
|
||||
getDictsByTypes(['basic_major_years']).then((res: any) => {
|
||||
majorYears.value = res.data.basic_major_years || [];
|
||||
});
|
||||
};
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
queryDictData()
|
||||
try {
|
||||
queryDictData();
|
||||
|
||||
const [deptResponse, planData] = await Promise.all([
|
||||
getDeptListByLevelTwo(),
|
||||
getList()
|
||||
])
|
||||
const [deptResponse, planData] = await Promise.all([getDeptListByLevelTwo(), getList()]);
|
||||
|
||||
deptCodes.value = deptResponse.data || []
|
||||
planList.value = planData.data || []
|
||||
deptCodes.value = deptResponse.data || [];
|
||||
planList.value = planData.data || [];
|
||||
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
getDataList()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error)
|
||||
}
|
||||
}
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
getDataList();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = async () => {
|
||||
try {
|
||||
dataListLoading.value = true
|
||||
dataList.value = []
|
||||
const response = await juniorlneStatic(queryForm)
|
||||
dataList.value = response.data || []
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error)
|
||||
} finally {
|
||||
dataListLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
dataListLoading.value = true;
|
||||
dataList.value = [];
|
||||
const response = await juniorlneStatic(queryForm);
|
||||
dataList.value = response.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error);
|
||||
} finally {
|
||||
dataListLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 导出
|
||||
const dataExportHandle = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
await downBlobFile('/recruit/recruitstudentsignup/juniorlneStaticExport', queryForm, '初中分数统计.xls')
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
await downBlobFile('/recruit/recruitstudentsignup/juniorlneStaticExport', queryForm, '初中分数统计.xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 改变行颜色
|
||||
const changeRowColor = ({ row }: { row: any }) => {
|
||||
if (row.majorName === '合计') {
|
||||
return {
|
||||
color: 'red'
|
||||
}
|
||||
}
|
||||
}
|
||||
if (row.majorName === '合计') {
|
||||
return {
|
||||
color: 'red',
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 获取系部名称
|
||||
const getDeptType = (type: string) => {
|
||||
const dept = deptCodes.value.find((item: any) => item.deptCode === type)
|
||||
return dept ? dept.deptName : ''
|
||||
}
|
||||
const dept = deptCodes.value.find((item: any) => item.deptCode === type);
|
||||
return dept ? dept.deptName : '';
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
queryForm.learnYear = ''
|
||||
queryForm.isUnion = ''
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
queryForm.learnYear = '';
|
||||
queryForm.isUnion = '';
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,440 +1,350 @@
|
||||
<template>
|
||||
<div>
|
||||
<!-- 搜索表单 -->
|
||||
<search-form
|
||||
v-show="showSearch"
|
||||
:model="queryForm"
|
||||
ref="searchFormRef"
|
||||
@keyup-enter="getDataList"
|
||||
>
|
||||
<template #default="{ visible }">
|
||||
<template v-if="visible">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option
|
||||
v-for="item in deptList"
|
||||
:key="item.deptCode"
|
||||
:label="item.deptName"
|
||||
:value="item.deptCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="录取专业" prop="confirmedMajor">
|
||||
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName + '(' + item.learnYear + '年制)'"
|
||||
:value="item.majorCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="唯一号/姓名/身份证号" prop="search">
|
||||
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-form-item label="住宿范围" prop="isOutFw">
|
||||
<el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围">
|
||||
<el-option
|
||||
v-for="item in isOutFwList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否发送短信" prop="isSend">
|
||||
<el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信">
|
||||
<el-option
|
||||
v-for="item in isSendList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别">
|
||||
<el-option
|
||||
v-for="item in sexy"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</template>
|
||||
<template #actions>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</search-form>
|
||||
<div>
|
||||
<!-- 搜索表单 -->
|
||||
<search-form v-show="showSearch" :model="queryForm" ref="searchFormRef" @keyup-enter="getDataList">
|
||||
<template #default="{ visible }">
|
||||
<template v-if="visible">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="学院" prop="deptCode">
|
||||
<el-select v-model="queryForm.deptCode" filterable clearable placeholder="请选择学院">
|
||||
<el-option v-for="item in deptList" :key="item.deptCode" :label="item.deptName" :value="item.deptCode" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="录取专业" prop="confirmedMajor">
|
||||
<el-select v-model="queryForm.confirmedMajor" filterable clearable placeholder="请选择录取专业">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName + '(' + item.learnYear + '年制)'"
|
||||
:value="item.majorCode"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="唯一号/姓名/身份证号" prop="search">
|
||||
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号" />
|
||||
</el-form-item>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-form-item label="住宿范围" prop="isOutFw">
|
||||
<el-select v-model="queryForm.isOutFw" filterable clearable placeholder="请选择住宿范围">
|
||||
<el-option v-for="item in isOutFwList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否发送短信" prop="isSend">
|
||||
<el-select v-model="queryForm.isSend" filterable clearable placeholder="请选择是否发送短信">
|
||||
<el-option v-for="item in isSendList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="性别" prop="gender">
|
||||
<el-select v-model="queryForm.gender" filterable clearable placeholder="请选择性别">
|
||||
<el-option v-for="item in sexy" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</template>
|
||||
<template #actions>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</template>
|
||||
</search-form>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDorm')"
|
||||
icon="Setting"
|
||||
@click="setDormFW"
|
||||
>
|
||||
设置住宿范围
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDorm')"
|
||||
type="danger"
|
||||
plain
|
||||
icon="Location"
|
||||
class="ml10"
|
||||
@click="yjOut"
|
||||
>
|
||||
一键判断住宿范围
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDormMess')"
|
||||
type="danger"
|
||||
plain
|
||||
icon="Message"
|
||||
class="ml10"
|
||||
@click="yjSend"
|
||||
>
|
||||
批量发送短信
|
||||
</el-button>
|
||||
<el-button
|
||||
type="warning"
|
||||
plain
|
||||
icon="Download"
|
||||
class="ml10"
|
||||
@click="handleExport"
|
||||
>
|
||||
名单导出
|
||||
</el-button>
|
||||
</div>
|
||||
<!-- 操作按钮 -->
|
||||
<div class="mb15">
|
||||
<el-button v-if="hasAuth('recruitStuDorm')" icon="Setting" @click="setDormFW"> 设置住宿范围 </el-button>
|
||||
<el-button v-if="hasAuth('recruitStuDorm')" type="danger" plain icon="Location" class="ml10" @click="yjOut"> 一键判断住宿范围 </el-button>
|
||||
<el-button v-if="hasAuth('recruitStuDormMess')" type="danger" plain icon="Message" class="ml10" @click="yjSend"> 批量发送短信 </el-button>
|
||||
<el-button type="warning" plain icon="Download" class="ml10" @click="handleExport"> 名单导出 </el-button>
|
||||
</div>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="serialNumber" label="唯一号" width="100" align="center" show-overflow-tooltip />
|
||||
<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">
|
||||
<GenderTag :sex="scope.row.gender" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="idNumber" label="身份证号" width="180" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="deptCode" label="学院" width="120" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getDeptName(scope.row.deptCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="homeAddressDetail" label="家庭地址" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="isOutFw" label="范围" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="getStatusConfig(DORM_RANGE_STATUS_LIST, scope.row.isOutFw)">{{ getStatusConfig(DORM_RANGE_STATUS_LIST, scope.row.isOutFw)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isSd" label="手动设置" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="getStatusConfig(MANUAL_SET_STATUS_LIST, scope.row.isSd)">{{ getStatusConfig(MANUAL_SET_STATUS_LIST, scope.row.isSd)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isSend" label="发送短信" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="getStatusConfig(SEND_STATUS_LIST, scope.row.isSend)">{{ getStatusConfig(SEND_STATUS_LIST, scope.row.isSend)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="300" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDormSd') && scope.row.isOutFw != '1'"
|
||||
type="primary"
|
||||
link
|
||||
icon="CircleCheck"
|
||||
@click="setFw(scope.row, 1)"
|
||||
>
|
||||
设为范围内
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDormSd') && scope.row.isOutFw != '2'"
|
||||
type="primary"
|
||||
link
|
||||
icon="Close"
|
||||
@click="setFw(scope.row, 2)"
|
||||
>
|
||||
设为范围外
|
||||
</el-button>
|
||||
<el-button
|
||||
type="primary"
|
||||
link
|
||||
icon="Location"
|
||||
@click="baiduMap(scope.row)"
|
||||
>
|
||||
家庭地址
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDormDel')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="deleteHandle(scope.row.id)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="serialNumber" label="唯一号" width="100" align="center" show-overflow-tooltip />
|
||||
<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">
|
||||
<GenderTag :sex="scope.row.gender" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="idNumber" label="身份证号" width="180" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="deptCode" label="学院" width="120" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getDeptName(scope.row.deptCode) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="homeAddressDetail" label="家庭地址" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="isOutFw" label="范围" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="getStatusConfig(DORM_RANGE_STATUS_LIST, scope.row.isOutFw)">{{
|
||||
getStatusConfig(DORM_RANGE_STATUS_LIST, scope.row.isOutFw)?.label
|
||||
}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isSd" label="手动设置" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="getStatusConfig(MANUAL_SET_STATUS_LIST, scope.row.isSd)">{{
|
||||
getStatusConfig(MANUAL_SET_STATUS_LIST, scope.row.isSd)?.label
|
||||
}}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="isSend" label="发送短信" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span v-if="getStatusConfig(SEND_STATUS_LIST, scope.row.isSend)">{{ getStatusConfig(SEND_STATUS_LIST, scope.row.isSend)?.label }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="300" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruitStuDormSd') && scope.row.isOutFw != '1'"
|
||||
type="primary"
|
||||
link
|
||||
icon="CircleCheck"
|
||||
@click="setFw(scope.row, 1)"
|
||||
>
|
||||
设为范围内
|
||||
</el-button>
|
||||
<el-button v-if="hasAuth('recruitStuDormSd') && scope.row.isOutFw != '2'" type="primary" link icon="Close" @click="setFw(scope.row, 2)">
|
||||
设为范围外
|
||||
</el-button>
|
||||
<el-button type="primary" link icon="Location" @click="baiduMap(scope.row)"> 家庭地址 </el-button>
|
||||
<el-button v-if="hasAuth('recruitStuDormDel')" type="danger" link icon="Delete" @click="deleteHandle(scope.row.id)"> 删除 </el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<DormFW ref="dormFWRef" />
|
||||
<ShowMap ref="baiduMapRef" />
|
||||
</div>
|
||||
<DormFW ref="dormFWRef" />
|
||||
<ShowMap ref="baiduMapRef" />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignupList">
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
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'
|
||||
import { DORM_RANGE_STATUS_LIST, SEND_STATUS_LIST, MANUAL_SET_STATUS_LIST, getStatusConfig } from '/@/config/global'
|
||||
import { ref, reactive, onMounted, nextTick, defineAsyncComponent } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
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';
|
||||
import { DORM_RANGE_STATUS_LIST, SEND_STATUS_LIST, MANUAL_SET_STATUS_LIST, getStatusConfig } from '/@/config/global';
|
||||
|
||||
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'))
|
||||
const SearchForm = defineAsyncComponent(() => import('/@/components/SearchForm/index.vue'))
|
||||
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'))
|
||||
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'))
|
||||
const { hasAuth } = useAuth()
|
||||
const GenderTag = defineAsyncComponent(() => import('/@/components/GenderTag/index.vue'));
|
||||
const SearchForm = defineAsyncComponent(() => import('/@/components/SearchForm/index.vue'));
|
||||
const DormFW = defineAsyncComponent(() => import('./dormFW.vue'));
|
||||
const ShowMap = defineAsyncComponent(() => import('./showMap.vue'));
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 字典数据
|
||||
const { sexy } = useDict('sexy')
|
||||
const { sexy } = useDict('sexy');
|
||||
|
||||
// 搜索表单显示状态
|
||||
const showSearch = ref(true)
|
||||
const showSearch = ref(true);
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const dormFWRef = ref()
|
||||
const baiduMapRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const dormFWRef = ref();
|
||||
const baiduMapRef = ref();
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const planMajorList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const isOutFwList = DORM_RANGE_STATUS_LIST
|
||||
const isSendList = SEND_STATUS_LIST
|
||||
|
||||
const planList = ref<any[]>([]);
|
||||
const planMajorList = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
const isOutFwList = DORM_RANGE_STATUS_LIST;
|
||||
const isSendList = SEND_STATUS_LIST;
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
deptCode: '',
|
||||
confirmedMajor: '',
|
||||
search: '',
|
||||
isOutFw: '',
|
||||
isSend: null,
|
||||
gender: ''
|
||||
})
|
||||
groupId: '',
|
||||
deptCode: '',
|
||||
confirmedMajor: '',
|
||||
search: '',
|
||||
isOutFw: '',
|
||||
isSend: null,
|
||||
gender: '',
|
||||
});
|
||||
|
||||
// 弹窗状态(DormFW 和 ShowMap 组件内部自己管理显示状态)
|
||||
|
||||
// 获取学院名称
|
||||
const getDeptName = (deptCode: string) => {
|
||||
const item = deptList.value.find(item => item.deptCode === deptCode)
|
||||
return item ? item.deptName : ''
|
||||
}
|
||||
const item = deptList.value.find((item) => item.deptCode === deptCode);
|
||||
return item ? item.deptName : '';
|
||||
};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchListStuDorm(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
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'
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchListStuDorm(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
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
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle, downBlobFile } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
// 查询二级学院信息
|
||||
const deptData = await getDeptList()
|
||||
deptList.value = deptData.data || []
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList()
|
||||
planList.value = planData.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
// 查询二级学院信息
|
||||
const deptData = await getDeptList();
|
||||
deptList.value = deptData.data || [];
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList();
|
||||
planList.value = planData.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// console.log(error)
|
||||
}
|
||||
};
|
||||
|
||||
// 设置住宿范围
|
||||
const setFw = async (row: any, type: number) => {
|
||||
const title = type == 1 ? '范围内' : '范围外'
|
||||
try {
|
||||
await messageBox.confirm(`是否确认设置${title}?请谨慎操作`)
|
||||
await setFwApi({ id: row.id, isOutFw: type })
|
||||
message.success('操作成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
const title = type == 1 ? '范围内' : '范围外';
|
||||
try {
|
||||
await messageBox.confirm(`是否确认设置${title}?请谨慎操作`);
|
||||
await setFwApi({ id: row.id, isOutFw: type });
|
||||
message.success('操作成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 设置住宿范围窗口
|
||||
const setDormFW = () => {
|
||||
nextTick(() => {
|
||||
dormFWRef.value?.init()
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
dormFWRef.value?.init();
|
||||
});
|
||||
};
|
||||
|
||||
// 一键判断住宿范围
|
||||
const yjOut = async () => {
|
||||
if (!queryForm.groupId) {
|
||||
message.warning('招生计划不能为空')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await messageBox.confirm('是否确认一键判断是否超出住宿范围?请谨慎操作')
|
||||
await yjOutApi({ groupId: queryForm.groupId })
|
||||
message.success('操作成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
if (!queryForm.groupId) {
|
||||
message.warning('招生计划不能为空');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await messageBox.confirm('是否确认一键判断是否超出住宿范围?请谨慎操作');
|
||||
await yjOutApi({ groupId: queryForm.groupId });
|
||||
message.success('操作成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 批量发送短信
|
||||
const yjSend = async () => {
|
||||
if (!queryForm.groupId) {
|
||||
message.warning('招生计划不能为空')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await messageBox.confirm('是否确认批量发送短信通知?请谨慎操作')
|
||||
await yjSendApi({ groupId: queryForm.groupId })
|
||||
message.success('操作成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
if (!queryForm.groupId) {
|
||||
message.warning('招生计划不能为空');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await messageBox.confirm('是否确认批量发送短信通知?请谨慎操作');
|
||||
await yjSendApi({ groupId: queryForm.groupId });
|
||||
message.success('操作成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 百度地图
|
||||
const baiduMap = (row: any) => {
|
||||
nextTick(() => {
|
||||
baiduMapRef.value?.init(row)
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
baiduMapRef.value?.init(row);
|
||||
});
|
||||
};
|
||||
|
||||
// 导出
|
||||
const handleExport = async () => {
|
||||
if (!queryForm.groupId) {
|
||||
message.warning('招生计划不能为空')
|
||||
return
|
||||
}
|
||||
|
||||
try {
|
||||
await downBlobFile(
|
||||
'/recruit/recruitstudentsignup/stuDormExport',
|
||||
queryForm,
|
||||
'新生住宿名单导出.xls'
|
||||
)
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
}
|
||||
}
|
||||
if (!queryForm.groupId) {
|
||||
message.warning('招生计划不能为空');
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
await downBlobFile('/recruit/recruitstudentsignup/stuDormExport', queryForm, '新生住宿名单导出.xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
queryForm.deptCode = ''
|
||||
queryForm.confirmedMajor = ''
|
||||
queryForm.search = ''
|
||||
queryForm.isOutFw = ''
|
||||
queryForm.isSend = null
|
||||
queryForm.gender = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
queryForm.deptCode = '';
|
||||
queryForm.confirmedMajor = '';
|
||||
queryForm.search = '';
|
||||
queryForm.isOutFw = '';
|
||||
queryForm.isSend = null;
|
||||
queryForm.gender = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 删除
|
||||
const deleteHandle = async (id: string) => {
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作')
|
||||
await delFw(id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm('是否确认删除本条数据?请谨慎操作');
|
||||
await delFw(id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -1,375 +1,356 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="title"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
append-to-body
|
||||
width="600">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit"
|
||||
label-width="100px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id"
|
||||
placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input type="text" v-model="dataForm.name" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="身份证号" prop="idNumber">
|
||||
<el-input type="text" v-model="dataForm.idNumber" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="成绩折算分" prop="correctedScore">
|
||||
<el-input-number v-model="dataForm.correctedScore" controls-position="right" :min="0" :max="999" :step-strictly="true"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="原录取专业" prop="confirmedMajor">
|
||||
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="" disabled>
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName"
|
||||
:value="item.majorCode">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="新录取专业" prop="newConfirmedMajor">
|
||||
<el-select v-model="dataForm.newConfirmedMajor" filterable placeholder="" @change="changeCM(dataForm.newConfirmedMajor)">
|
||||
<el-option
|
||||
v-for="item in planMajorList"
|
||||
:key="item.majorCode"
|
||||
:label="item.majorName+' || '+item.xyNum"
|
||||
:value="item.majorCode">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-dialog :title="title" :close-on-click-modal="false" v-model="visible" append-to-body width="600">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="dataFormSubmit" label-width="100px">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input type="text" v-model="dataForm.name" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="身份证号" prop="idNumber">
|
||||
<el-input type="text" v-model="dataForm.idNumber" disabled></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="成绩折算分" prop="correctedScore">
|
||||
<el-input-number v-model="dataForm.correctedScore" controls-position="right" :min="0" :max="999" :step-strictly="true"></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="原录取专业" prop="confirmedMajor">
|
||||
<el-select v-model="dataForm.confirmedMajor" filterable clearable placeholder="" disabled>
|
||||
<el-option v-for="item in planMajorList" :key="item.majorCode" :label="item.majorName" :value="item.majorCode"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="新录取专业" prop="newConfirmedMajor">
|
||||
<el-select v-model="dataForm.newConfirmedMajor" filterable placeholder="" @change="changeCM(dataForm.newConfirmedMajor)">
|
||||
<el-option v-for="item in planMajorList" :key="item.majorCode" :label="item.majorName + ' || ' + item.xyNum" :value="item.majorCode">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="学费" prop="feeTuition">
|
||||
<el-input-number v-model="dataForm.feeTuition" controls-position="right" :min="0" :max="999999" :step-strictly="true" disabled></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="代办费" prop="feeAgency">
|
||||
<el-input-number v-model="dataForm.feeAgency" controls-position="right" :min="0" :max="999999" :step-strictly="true" disabled></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="总费用" prop="allMoney">
|
||||
<span style="color: red">{{ Number(dataForm.feeTuition) + Number(dataForm.feeAgency) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="auditRemarks">
|
||||
<el-input type="textarea" v-model="dataForm.auditRemarks" placeholder="备注" :rows="2"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit(false)" v-if="canSubmit">确认修改</el-button>
|
||||
<el-button type="warning" @click="dataFormSubmit(true)" v-if="canSubmit" v-auth="'recruit_signup_change_force'">强制修改</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="学费" prop="feeTuition">
|
||||
<el-input-number
|
||||
v-model="dataForm.feeTuition"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
:max="999999"
|
||||
:step-strictly="true"
|
||||
disabled
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item label="代办费" prop="feeAgency">
|
||||
<el-input-number
|
||||
v-model="dataForm.feeAgency"
|
||||
controls-position="right"
|
||||
:min="0"
|
||||
:max="999999"
|
||||
:step-strictly="true"
|
||||
disabled
|
||||
></el-input-number>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="总费用" prop="allMoney">
|
||||
<span style="color: red">{{ Number(dataForm.feeTuition) + Number(dataForm.feeAgency) }}</span>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="备注" prop="auditRemarks">
|
||||
<el-input type="textarea" v-model="dataForm.auditRemarks" placeholder="备注" :rows="2"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit(false)" v-if="canSubmit">确认修改</el-button>
|
||||
<el-button type="warning" @click="dataFormSubmit(true)" v-if="canSubmit" v-auth="'recruit_signup_change_force'">强制修改</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { useMessageBox, useMessage } from '/@/hooks/message'
|
||||
import { getObj, changeMajor } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getList } from "/@/api/recruit/recruitstudentplangroup"
|
||||
import { listByEdu } from "/@/api/recruit/recruitstudentplan"
|
||||
import { getDicts } from "/@/api/admin/dict"
|
||||
import { list as scoreList } from "/@/api/recruit/recruitstudentplancorrectscoreconfig"
|
||||
import { getStatusConfig, AUDIT_STATUS_LIST } from '/@/config/global'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { useMessageBox, useMessage } from '/@/hooks/message';
|
||||
import { getObj, changeMajor } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { listByEdu } from '/@/api/recruit/recruitstudentplan';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
import { list as scoreList } from '/@/api/recruit/recruitstudentplancorrectscoreconfig';
|
||||
import { getStatusConfig, AUDIT_STATUS_LIST } from '/@/config/global';
|
||||
|
||||
const auditStatusList = AUDIT_STATUS_LIST
|
||||
const auditStatusList = AUDIT_STATUS_LIST;
|
||||
// 消息提示 hooks
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox();
|
||||
const message = useMessage();
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const title = ref("")
|
||||
const planList = ref<any[]>([])
|
||||
const planMajorList = ref<any[]>([])
|
||||
const agencyFeeList = ref<any[]>([])
|
||||
const schoolCodeList = ref<any[]>([])
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const title = ref('');
|
||||
const planList = ref<any[]>([]);
|
||||
const planMajorList = ref<any[]>([]);
|
||||
const agencyFeeList = ref<any[]>([]);
|
||||
const schoolCodeList = ref<any[]>([]);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
groupId: "",
|
||||
name: "",
|
||||
oldName: "",
|
||||
gender: "",
|
||||
nationality: "",
|
||||
degreeOfEducation: "",
|
||||
isLeagueMember: "",
|
||||
schoolOfGraduation: "",
|
||||
isAccommodation: "",
|
||||
examRegistrationNumbers: "",
|
||||
isMinimumLivingSecurity: "",
|
||||
score: "",
|
||||
postcode: "",
|
||||
residenceType: "",
|
||||
correctedScore: null as number | null,
|
||||
placeScore: "",
|
||||
schoolFrom: "",
|
||||
idNumber: "",
|
||||
residenceProvince: "",
|
||||
residenceCity: "",
|
||||
residenceArea: "",
|
||||
residenceDetail: "",
|
||||
homeAddressProvince: "",
|
||||
homeAddressCity: "",
|
||||
homeAddressArea: "",
|
||||
homeAddressDetail: "",
|
||||
parentName: "",
|
||||
parentTelOne: "",
|
||||
parentTelTwo: "",
|
||||
selfTel: "",
|
||||
wishMajorOne: "",
|
||||
wishMajorTwo: "",
|
||||
wishMajorThree: "",
|
||||
confirmedMajor: "",
|
||||
sevenMajor: "",
|
||||
sixMajor: "",
|
||||
fiveMajor: "",
|
||||
fourMajor: "",
|
||||
threeMajor: "",
|
||||
twoMajor: "",
|
||||
feeContribute: 0,
|
||||
scorePhoto: "",
|
||||
graPic: "",
|
||||
yyPic: "",
|
||||
housePic: "",
|
||||
sbPic: "",
|
||||
contactName: "",
|
||||
oldSerialNumber: "",
|
||||
colorDiscrimination: "",
|
||||
nutrition: "",
|
||||
height: "",
|
||||
weight: "",
|
||||
pastMedicalHistory: "",
|
||||
eyesightLeft: "",
|
||||
eyesightRight: "",
|
||||
correctEyesightLeft: "",
|
||||
correctEyesightRight: "",
|
||||
remarks: "",
|
||||
auditRemarks: "",
|
||||
serialNumber: "",
|
||||
auditStatus: "",
|
||||
schoolCode: "",
|
||||
newConfirmedMajor: "",
|
||||
householdPic: "",
|
||||
feeTuition: 0,
|
||||
feeAgency: 0
|
||||
})
|
||||
id: '',
|
||||
groupId: '',
|
||||
name: '',
|
||||
oldName: '',
|
||||
gender: '',
|
||||
nationality: '',
|
||||
degreeOfEducation: '',
|
||||
isLeagueMember: '',
|
||||
schoolOfGraduation: '',
|
||||
isAccommodation: '',
|
||||
examRegistrationNumbers: '',
|
||||
isMinimumLivingSecurity: '',
|
||||
score: '',
|
||||
postcode: '',
|
||||
residenceType: '',
|
||||
correctedScore: null as number | null,
|
||||
placeScore: '',
|
||||
schoolFrom: '',
|
||||
idNumber: '',
|
||||
residenceProvince: '',
|
||||
residenceCity: '',
|
||||
residenceArea: '',
|
||||
residenceDetail: '',
|
||||
homeAddressProvince: '',
|
||||
homeAddressCity: '',
|
||||
homeAddressArea: '',
|
||||
homeAddressDetail: '',
|
||||
parentName: '',
|
||||
parentTelOne: '',
|
||||
parentTelTwo: '',
|
||||
selfTel: '',
|
||||
wishMajorOne: '',
|
||||
wishMajorTwo: '',
|
||||
wishMajorThree: '',
|
||||
confirmedMajor: '',
|
||||
sevenMajor: '',
|
||||
sixMajor: '',
|
||||
fiveMajor: '',
|
||||
fourMajor: '',
|
||||
threeMajor: '',
|
||||
twoMajor: '',
|
||||
feeContribute: 0,
|
||||
scorePhoto: '',
|
||||
graPic: '',
|
||||
yyPic: '',
|
||||
housePic: '',
|
||||
sbPic: '',
|
||||
contactName: '',
|
||||
oldSerialNumber: '',
|
||||
colorDiscrimination: '',
|
||||
nutrition: '',
|
||||
height: '',
|
||||
weight: '',
|
||||
pastMedicalHistory: '',
|
||||
eyesightLeft: '',
|
||||
eyesightRight: '',
|
||||
correctEyesightLeft: '',
|
||||
correctEyesightRight: '',
|
||||
remarks: '',
|
||||
auditRemarks: '',
|
||||
serialNumber: '',
|
||||
auditStatus: '',
|
||||
schoolCode: '',
|
||||
newConfirmedMajor: '',
|
||||
householdPic: '',
|
||||
feeTuition: 0,
|
||||
feeAgency: 0,
|
||||
});
|
||||
|
||||
const dataRule = reactive({
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'change' }
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: '姓名不能为空', trigger: 'change' }
|
||||
],
|
||||
idNumber: [
|
||||
{ required: true, message: '身份证不能为空', trigger: 'change' }
|
||||
],
|
||||
correctedScore: [
|
||||
{ required: true, message: '成绩折算分不能为空', trigger: 'change' }
|
||||
],
|
||||
confirmedMajor: [
|
||||
{ required: true, message: '原录取专业不能为空', trigger: 'change' }
|
||||
],
|
||||
newConfirmedMajor: [
|
||||
{ required: true, message: '新录取专业不能为空', trigger: 'change' }
|
||||
]
|
||||
})
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'change' }],
|
||||
name: [{ required: true, message: '姓名不能为空', trigger: 'change' }],
|
||||
idNumber: [{ required: true, message: '身份证不能为空', trigger: 'change' }],
|
||||
correctedScore: [{ required: true, message: '成绩折算分不能为空', trigger: 'change' }],
|
||||
confirmedMajor: [{ required: true, message: '原录取专业不能为空', trigger: 'change' }],
|
||||
newConfirmedMajor: [{ required: true, message: '新录取专业不能为空', trigger: 'change' }],
|
||||
});
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 根据新专业和文化程度更新学费
|
||||
const updateTuitionByNewMajorAndEducation = () => {
|
||||
if (!dataForm.newConfirmedMajor || !dataForm.degreeOfEducation) {
|
||||
return
|
||||
}
|
||||
|
||||
// 查找选中的新专业
|
||||
const selectedMajor = planMajorList.value.find((major: any) => major.majorCode === dataForm.newConfirmedMajor)
|
||||
if (!selectedMajor) {
|
||||
return
|
||||
}
|
||||
|
||||
// 根据文化程度选择对应的学费字段
|
||||
// '1' = 初中 -> czFee
|
||||
// '2' = 高中 -> gzFee
|
||||
// '3' = 技职校 -> jzxFee
|
||||
if (dataForm.degreeOfEducation === '1' && selectedMajor.czFee !== undefined && selectedMajor.czFee !== null) {
|
||||
dataForm.feeTuition = selectedMajor.czFee
|
||||
} else if (dataForm.degreeOfEducation === '2' && selectedMajor.gzFee !== undefined && selectedMajor.gzFee !== null) {
|
||||
dataForm.feeTuition = selectedMajor.gzFee
|
||||
} else if (dataForm.degreeOfEducation === '3' && selectedMajor.jzxFee !== undefined && selectedMajor.jzxFee !== null) {
|
||||
dataForm.feeTuition = selectedMajor.jzxFee
|
||||
}
|
||||
}
|
||||
if (!dataForm.newConfirmedMajor || !dataForm.degreeOfEducation) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 查找选中的新专业
|
||||
const selectedMajor = planMajorList.value.find((major: any) => major.majorCode === dataForm.newConfirmedMajor);
|
||||
if (!selectedMajor) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 根据文化程度选择对应的学费字段
|
||||
// '1' = 初中 -> czFee
|
||||
// '2' = 高中 -> gzFee
|
||||
// '3' = 技职校 -> jzxFee
|
||||
if (dataForm.degreeOfEducation === '1' && selectedMajor.czFee !== undefined && selectedMajor.czFee !== null) {
|
||||
dataForm.feeTuition = selectedMajor.czFee;
|
||||
} else if (dataForm.degreeOfEducation === '2' && selectedMajor.gzFee !== undefined && selectedMajor.gzFee !== null) {
|
||||
dataForm.feeTuition = selectedMajor.gzFee;
|
||||
} else if (dataForm.degreeOfEducation === '3' && selectedMajor.jzxFee !== undefined && selectedMajor.jzxFee !== null) {
|
||||
dataForm.feeTuition = selectedMajor.jzxFee;
|
||||
}
|
||||
};
|
||||
|
||||
// 改变新专业
|
||||
const changeCM = (id: string) => {
|
||||
if (id) {
|
||||
// 从新专业中获取学费
|
||||
updateTuitionByNewMajorAndEducation()
|
||||
}
|
||||
}
|
||||
|
||||
if (id) {
|
||||
// 从新专业中获取学费
|
||||
updateTuitionByNewMajorAndEducation();
|
||||
}
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = async (force:any) => {
|
||||
const titleText = "确认调整录取专业么?"
|
||||
if (dataForm.confirmedMajor == dataForm.newConfirmedMajor) {
|
||||
message.error('新专业不能和原专业相同')
|
||||
return
|
||||
}
|
||||
dataForm.force=force
|
||||
try {
|
||||
await messageBox.confirm(titleText)
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false
|
||||
if (dataForm.id) {
|
||||
changeMajor(dataForm).then(() => {
|
||||
message.success('操作成功')
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
const dataFormSubmit = async (force: any) => {
|
||||
const titleText = '确认调整录取专业么?';
|
||||
if (dataForm.confirmedMajor == dataForm.newConfirmedMajor) {
|
||||
message.error('新专业不能和原专业相同');
|
||||
return;
|
||||
}
|
||||
dataForm.force = force;
|
||||
try {
|
||||
await messageBox.confirm(titleText);
|
||||
dataFormRef.value?.validate((valid: boolean) => {
|
||||
if (valid) {
|
||||
canSubmit.value = false;
|
||||
if (dataForm.id) {
|
||||
changeMajor(dataForm)
|
||||
.then(() => {
|
||||
message.success('操作成功');
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
dataForm.id = id || ""
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
initData()
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
if (dataForm.id) {
|
||||
// 获取数据字典代办费
|
||||
getDicts('recruit_agency_fee').then((res: any) => {
|
||||
agencyFeeList.value = res.data
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data)
|
||||
title.value = dataForm.serialNumber
|
||||
// 获取文化程度对应的专业
|
||||
planMajorList.value = []
|
||||
dataForm.id = id || '';
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
initData();
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
if (dataForm.id) {
|
||||
// 获取数据字典代办费
|
||||
getDicts('recruit_agency_fee').then((res: any) => {
|
||||
agencyFeeList.value = res.data;
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
Object.assign(dataForm, response.data);
|
||||
title.value = dataForm.serialNumber;
|
||||
// 获取文化程度对应的专业
|
||||
planMajorList.value = [];
|
||||
|
||||
agencyFeeList.value.forEach((e: any) => {
|
||||
if (String(dataForm.degreeOfEducation) == String(e.label)) {
|
||||
dataForm.feeAgency = e.value
|
||||
}
|
||||
})
|
||||
listByEdu({ groupId: dataForm.groupId, degreeOfEducation: dataForm.degreeOfEducation }).then((e: any) => {
|
||||
planMajorList.value = e.data
|
||||
// 加载专业列表后,如果已有新专业,更新学费
|
||||
if (dataForm.newConfirmedMajor) {
|
||||
updateTuitionByNewMajorAndEducation()
|
||||
}
|
||||
// 获取招生计划下的学校和分数线
|
||||
scoreList({ groupId: dataForm.groupId }).then((data: any) => {
|
||||
schoolCodeList.value = data.data
|
||||
})
|
||||
agencyFeeList.value.forEach((e: any) => {
|
||||
if (String(dataForm.degreeOfEducation) == String(e.label)) {
|
||||
dataForm.feeAgency = e.value;
|
||||
}
|
||||
});
|
||||
listByEdu({ groupId: dataForm.groupId, degreeOfEducation: dataForm.degreeOfEducation }).then((e: any) => {
|
||||
planMajorList.value = e.data;
|
||||
// 加载专业列表后,如果已有新专业,更新学费
|
||||
if (dataForm.newConfirmedMajor) {
|
||||
updateTuitionByNewMajorAndEducation();
|
||||
}
|
||||
// 获取招生计划下的学校和分数线
|
||||
scoreList({ groupId: dataForm.groupId }).then((data: any) => {
|
||||
schoolCodeList.value = data.data;
|
||||
});
|
||||
|
||||
const educationPrefixMap: Record<string, string> = {
|
||||
'1': 'C', // 初中
|
||||
'2': 'G', // 高中
|
||||
'3': 'J' // 技职校
|
||||
}
|
||||
const prefix = educationPrefixMap[String(dataForm.degreeOfEducation)]
|
||||
if (prefix) {
|
||||
title.value = prefix + title.value
|
||||
}
|
||||
// 从字典数据获取录取状态标签
|
||||
const auditStatusConfig = getStatusConfig(auditStatusList, dataForm.auditStatus)
|
||||
if (auditStatusConfig && auditStatusConfig.label) {
|
||||
title.value = auditStatusConfig.label + " " + title.value
|
||||
}
|
||||
|
||||
})
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const educationPrefixMap: Record<string, string> = {
|
||||
'1': 'C', // 初中
|
||||
'2': 'G', // 高中
|
||||
'3': 'J', // 技职校
|
||||
};
|
||||
const prefix = educationPrefixMap[String(dataForm.degreeOfEducation)];
|
||||
if (prefix) {
|
||||
title.value = prefix + title.value;
|
||||
}
|
||||
// 从字典数据获取录取状态标签
|
||||
const auditStatusConfig = getStatusConfig(auditStatusList, dataForm.auditStatus);
|
||||
if (auditStatusConfig && auditStatusConfig.label) {
|
||||
title.value = auditStatusConfig.label + ' ' + title.value;
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.el-form {
|
||||
.el-row:not(:last-of-type) {
|
||||
margin-bottom: 18px !important;
|
||||
}
|
||||
.el-row:not(:last-of-type) {
|
||||
margin-bottom: 18px !important;
|
||||
}
|
||||
}
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,389 +1,203 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<header style="font-size: 40px; text-align: center; margin-bottom: 20px;">
|
||||
招生地区分布统计(本省本市、普通招生、自主招生)
|
||||
</header>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<header style="font-size: 40px; text-align: center; margin-bottom: 20px">招生地区分布统计(本省本市、普通招生、自主招生)</header>
|
||||
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="是否联院" prop="isUnion">
|
||||
<el-select v-model="queryForm.isUnion" filterable placeholder="请选择是否联院">
|
||||
<el-option
|
||||
v-for="item in isUnionList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="是否联院" prop="isUnion">
|
||||
<el-select v-model="queryForm.isUnion" filterable placeholder="请选择是否联院">
|
||||
<el-option v-for="item in isUnionList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
:span-method="objectSpanMethod"
|
||||
v-loading="dataListLoading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
:span-method="objectSpanMethod"
|
||||
v-loading="dataListLoading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column prop="year" header-align="center" align="center" label="年份"> </el-table-column>
|
||||
<el-table-column prop="type" header-align="center" align="center" label="类别"> </el-table-column>
|
||||
<el-table-column prop="peopleNum" header-align="center" align="center" label="招生总数"> </el-table-column>
|
||||
<el-table-column prop="peopleRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
|
||||
<el-table-column
|
||||
prop="year"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="年份">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="type"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="类别">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="peopleNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="招生总数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="peopleRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="天宁区">
|
||||
<el-table-column prop="tnNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="tnRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="新北区">
|
||||
<el-table-column prop="xbNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="xbRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="武进区">
|
||||
<el-table-column prop="wjNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="wjRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="钟楼区">
|
||||
<el-table-column prop="zlNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="zlRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="金坛">
|
||||
<el-table-column prop="jtNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="jtRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="溧阳">
|
||||
<el-table-column prop="lyNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="lyRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="武进区(含 戚墅堰)">
|
||||
<el-table-column prop="wjjNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="wjjRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="经开区">
|
||||
<el-table-column prop="jkqNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="jkqRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="市辖区">
|
||||
<el-table-column prop="cityNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="cityRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="天宁区">
|
||||
<el-table-column
|
||||
prop="tnNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="tnRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="新北区">
|
||||
<el-table-column
|
||||
prop="xbNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="xbRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="武进区">
|
||||
<el-table-column
|
||||
prop="wjNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="wjRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="钟楼区">
|
||||
<el-table-column
|
||||
prop="zlNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="zlRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="金坛">
|
||||
<el-table-column
|
||||
prop="jtNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="jtRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="溧阳">
|
||||
<el-table-column
|
||||
prop="lyNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="lyRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="武进区(含 戚墅堰)">
|
||||
<el-table-column
|
||||
prop="wjjNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="wjjRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="经开区">
|
||||
<el-table-column
|
||||
prop="jkqNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="jkqRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="市辖区">
|
||||
<el-table-column
|
||||
prop="cityNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="cityRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="本省外市">
|
||||
<el-table-column
|
||||
prop="bswNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="bswRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop=""
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="外省">
|
||||
<el-table-column
|
||||
prop="wsNum"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="人数">
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="wsRate"
|
||||
header-align="center"
|
||||
align="center"
|
||||
label="占比">
|
||||
</el-table-column>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table-column prop="" header-align="center" align="center" label="本省外市">
|
||||
<el-table-column prop="bswNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="bswRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
<el-table-column prop="" header-align="center" align="center" label="外省">
|
||||
<el-table-column prop="wsNum" header-align="center" align="center" label="人数"> </el-table-column>
|
||||
<el-table-column prop="wsRate" header-align="center" align="center" label="占比"> </el-table-column>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-schoolAreaStatic">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { schoolAreaStatic } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { schoolAreaStatic } from '/@/api/recruit/recruitstudentsignup';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const isUnionList = [
|
||||
{ value: '0', label: '否' },
|
||||
{ value: '1', label: '是' }
|
||||
]
|
||||
const dataList = ref<any[]>([])
|
||||
const indexArray = ref<number[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const exportLoading = ref(false)
|
||||
{ value: '0', label: '否' },
|
||||
{ value: '1', label: '是' },
|
||||
];
|
||||
const dataList = ref<any[]>([]);
|
||||
const indexArray = ref<number[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
isUnion: '0'
|
||||
})
|
||||
isUnion: '0',
|
||||
});
|
||||
|
||||
// 使用 table hook 获取样式
|
||||
const { tableStyle, downBlobFile } = useTable()
|
||||
const { tableStyle, downBlobFile } = useTable();
|
||||
|
||||
// 初始化
|
||||
const init = () => {
|
||||
queryForm.isUnion = '0'
|
||||
getDataList()
|
||||
}
|
||||
queryForm.isUnion = '0';
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 获取行数
|
||||
const getRows = (rowIndex: number, name: string) => {
|
||||
let count = 0
|
||||
for (let i = rowIndex; i < dataList.value.length; i++) {
|
||||
if (dataList.value[i].year === name) {
|
||||
count++
|
||||
} else {
|
||||
break
|
||||
}
|
||||
}
|
||||
return count
|
||||
}
|
||||
let count = 0;
|
||||
for (let i = rowIndex; i < dataList.value.length; i++) {
|
||||
if (dataList.value[i].year === name) {
|
||||
count++;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return count;
|
||||
};
|
||||
|
||||
// 合并单元格方法
|
||||
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
|
||||
if (columnIndex === 0) {
|
||||
if (indexArray.value.includes(rowIndex)) {
|
||||
const rowCount = getRows(rowIndex, row.year)
|
||||
return {
|
||||
rowspan: rowCount,
|
||||
colspan: 1
|
||||
}
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (columnIndex === 0) {
|
||||
if (indexArray.value.includes(rowIndex)) {
|
||||
const rowCount = getRows(rowIndex, row.year);
|
||||
return {
|
||||
rowspan: rowCount,
|
||||
colspan: 1,
|
||||
};
|
||||
} else {
|
||||
return {
|
||||
rowspan: 0,
|
||||
colspan: 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = async () => {
|
||||
try {
|
||||
dataListLoading.value = true
|
||||
dataList.value = []
|
||||
indexArray.value = []
|
||||
const response = await schoolAreaStatic(queryForm)
|
||||
dataList.value = response.data || []
|
||||
|
||||
// 计算合并单元格的索引
|
||||
let count = 0
|
||||
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
|
||||
indexArray.value.push(rowIndex)
|
||||
count = getRows(rowIndex, dataList.value[rowIndex].year)
|
||||
rowIndex += count
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error)
|
||||
} finally {
|
||||
dataListLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
dataListLoading.value = true;
|
||||
dataList.value = [];
|
||||
indexArray.value = [];
|
||||
const response = await schoolAreaStatic(queryForm);
|
||||
dataList.value = response.data || [];
|
||||
|
||||
// 计算合并单元格的索引
|
||||
let count = 0;
|
||||
for (let rowIndex = 0; rowIndex < dataList.value.length; ) {
|
||||
indexArray.value.push(rowIndex);
|
||||
count = getRows(rowIndex, dataList.value[rowIndex].year);
|
||||
rowIndex += count;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error);
|
||||
} finally {
|
||||
dataListLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 导出
|
||||
const dataExportHandle = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
await downBlobFile(
|
||||
'/recruit/recruitstudentsignup/schoolAreaStaticExport',
|
||||
queryForm,
|
||||
'招生地区分布统计(本省本市、普通招生、自主招生).xls'
|
||||
)
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
await downBlobFile('/recruit/recruitstudentsignup/schoolAreaStaticExport', queryForm, '招生地区分布统计(本省本市、普通招生、自主招生).xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.isUnion = '0'
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.isUnion = '0';
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,175 +1,164 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="dataExportHandle">导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="dataListLoading"
|
||||
:summary-method="getSummaries"
|
||||
show-summary
|
||||
:row-style="changeRowColor"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="schoolName" label="学校名称" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="人数" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleRate" label="占比" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="dataList"
|
||||
border
|
||||
stripe
|
||||
v-loading="dataListLoading"
|
||||
:summary-method="getSummaries"
|
||||
show-summary
|
||||
:row-style="changeRowColor"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column align="center" header-align="center" prop="schoolName" label="学校名称" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleNum" label="人数" />
|
||||
<el-table-column align="center" header-align="center" prop="peopleRate" label="占比" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-schoolStatic">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { getSchoolStatic } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { getSchoolStatic } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const dataList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const indexArray = ref<any[]>([])
|
||||
const dataListLoading = ref(false)
|
||||
const exportLoading = ref(false)
|
||||
const dataList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
const indexArray = ref<any[]>([]);
|
||||
const dataListLoading = ref(false);
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: ''
|
||||
})
|
||||
groupId: '',
|
||||
});
|
||||
|
||||
// 使用 table hook 获取样式
|
||||
const { tableStyle, downBlobFile } = useTable()
|
||||
const { tableStyle, downBlobFile } = useTable();
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
getDataList()
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
getDataList();
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('初始化失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 获取数据列表
|
||||
const getDataList = async () => {
|
||||
try {
|
||||
dataListLoading.value = true
|
||||
dataList.value = []
|
||||
indexArray.value = []
|
||||
const response = await getSchoolStatic(queryForm)
|
||||
dataList.value = response.data || []
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error)
|
||||
} finally {
|
||||
dataListLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
dataListLoading.value = true;
|
||||
dataList.value = [];
|
||||
indexArray.value = [];
|
||||
const response = await getSchoolStatic(queryForm);
|
||||
dataList.value = response.data || [];
|
||||
} catch (error) {
|
||||
console.error('获取数据失败', error);
|
||||
} finally {
|
||||
dataListLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 导出
|
||||
const dataExportHandle = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
await downBlobFile('/recruit/recruitstudentsignup/getSchoolStaticExport', queryForm, '按学校导出.xls')
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
await downBlobFile('/recruit/recruitstudentsignup/getSchoolStaticExport', queryForm, '按学校导出.xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 改变行颜色
|
||||
const changeRowColor = ({ row }: { row: any }) => {
|
||||
const specialSchools = [
|
||||
'智能装备学院',
|
||||
'智能制造学院',
|
||||
'信息服务学院',
|
||||
'交通运输学院',
|
||||
'医药康养学院',
|
||||
'招生就业处'
|
||||
]
|
||||
if (specialSchools.includes(row.schoolName)) {
|
||||
return {
|
||||
color: 'red'
|
||||
}
|
||||
}
|
||||
}
|
||||
const specialSchools = ['智能装备学院', '智能制造学院', '信息服务学院', '交通运输学院', '医药康养学院', '招生就业处'];
|
||||
if (specialSchools.includes(row.schoolName)) {
|
||||
return {
|
||||
color: 'red',
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 合计方法
|
||||
const getSummaries = (param: any) => {
|
||||
const { columns, data } = param
|
||||
const sums: any[] = []
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计'
|
||||
} else if (index === 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]))
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] = values.reduce((prev: number, curr: any) => {
|
||||
const value = Number(curr)
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr
|
||||
} else {
|
||||
return prev
|
||||
}
|
||||
}, 0) / 2
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--'
|
||||
}
|
||||
})
|
||||
return sums
|
||||
}
|
||||
const { columns, data } = param;
|
||||
const sums: any[] = [];
|
||||
columns.forEach((column: any, index: number) => {
|
||||
if (index === 0) {
|
||||
sums[index] = '总计';
|
||||
} else if (index === 1) {
|
||||
const values = data.map((item: any) => Number(item[column.property]));
|
||||
if (!values.every((value: any) => isNaN(value))) {
|
||||
sums[index] =
|
||||
values.reduce((prev: number, curr: any) => {
|
||||
const value = Number(curr);
|
||||
if (!isNaN(value)) {
|
||||
return prev + curr;
|
||||
} else {
|
||||
return prev;
|
||||
}
|
||||
}, 0) / 2;
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
} else {
|
||||
sums[index] = '--';
|
||||
}
|
||||
});
|
||||
return sums;
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,188 +1,186 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
title="家庭地址地图查看"
|
||||
append-to-body
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
width="90%">
|
||||
<div style="height: 100%;width:100%">
|
||||
<el-descriptions :column="1" border class="address-descriptions">
|
||||
<el-descriptions-item label="家庭地址">{{ form.homeAddressDetail }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<div id="container2"></div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
<el-dialog title="家庭地址地图查看" append-to-body :close-on-click-modal="false" v-model="visible" width="90%">
|
||||
<div style="height: 100%; width: 100%">
|
||||
<el-descriptions :column="1" border class="address-descriptions">
|
||||
<el-descriptions-item label="家庭地址">{{ form.homeAddressDetail }}</el-descriptions-item>
|
||||
</el-descriptions>
|
||||
<div id="container2"></div>
|
||||
</div>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick } from 'vue'
|
||||
import { loadTiandituMap } from "/@/api/recruit/recruitstudentsignup"
|
||||
import { getDicts } from "/@/api/admin/dict"
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { TIANDITU_TOKEN } from '/@/config/map'
|
||||
import { ref, reactive, nextTick } from 'vue';
|
||||
import { loadTiandituMap } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
import { ElMessage } from 'element-plus';
|
||||
import { TIANDITU_TOKEN } from '/@/config/map';
|
||||
|
||||
// 表单引用
|
||||
const formRef = ref()
|
||||
const formRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const tk = TIANDITU_TOKEN // 天地图的token(在 src/config/map.ts 中配置)
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const circleShow = ref(false)
|
||||
const circle = ref<any>(null)
|
||||
const map = ref<any>(null)
|
||||
const tk = TIANDITU_TOKEN; // 天地图的token(在 src/config/map.ts 中配置)
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const circleShow = ref(false);
|
||||
const circle = ref<any>(null);
|
||||
const map = ref<any>(null);
|
||||
|
||||
// 地址信息
|
||||
const center = reactive({ lng: 0, lat: 0 })
|
||||
const dictId = ref("")
|
||||
const center = reactive({ lng: 0, lat: 0 });
|
||||
const dictId = ref('');
|
||||
|
||||
const form = reactive({
|
||||
id: "",
|
||||
homeAddressDetail: "",
|
||||
homeLng: 0, // 家庭地址经度
|
||||
homeLat: 0, // 家庭地址纬度
|
||||
raidus: 0
|
||||
})
|
||||
|
||||
id: '',
|
||||
homeAddressDetail: '',
|
||||
homeLng: 0, // 家庭地址经度
|
||||
homeLat: 0, // 家庭地址纬度
|
||||
raidus: 0,
|
||||
});
|
||||
|
||||
// 初始化
|
||||
const init = (row: any) => {
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
circleShow.value = true
|
||||
form.id = row.id
|
||||
form.homeAddressDetail = row.homeAddressDetail
|
||||
// 获取家庭地址的经纬度(如果有的话)
|
||||
form.homeLng = row.homeLng || row.homeLongitude || 0
|
||||
form.homeLat = row.homeLat || row.homeLatitude || 0
|
||||
nextTick(() => {
|
||||
getDicts("recruit_dorm_jw").then((data: any) => {
|
||||
const arr = data.data
|
||||
arr.forEach((e: any) => {
|
||||
if (e.label == 'bj') {
|
||||
form.raidus = e.value
|
||||
dictId.value = e.id
|
||||
} else if (e.label == 'lng') {
|
||||
center.lng = e.value
|
||||
} else if (e.label == 'lat') {
|
||||
center.lat = e.value
|
||||
}
|
||||
})
|
||||
|
||||
// 等待对话框渲染完成后再加载地图
|
||||
setTimeout(() => {
|
||||
loadTiandituMap(tk).then((T: any) => {
|
||||
// 清除之前的地图实例(如果存在)
|
||||
if (map.value) {
|
||||
map.value.clearOverLays()
|
||||
}
|
||||
|
||||
// 创建地图实例
|
||||
map.value = new T.Map("container2")
|
||||
// 创建点坐标
|
||||
const point = new T.LngLat(center.lng, center.lat)
|
||||
// 初始化地图,设置中心点坐标和地图级别(使用默认矢量地图)
|
||||
map.value.centerAndZoom(point, 13)
|
||||
|
||||
// 启用地图交互功能
|
||||
map.value.enableDrag() // 启用拖拽
|
||||
map.value.enableScrollWheelZoom() // 启用滚轮缩放
|
||||
map.value.enableDoubleClickZoom() // 启用双击放大
|
||||
map.value.enableKeyboard() // 启用键盘操作
|
||||
|
||||
// 使用天地图JavaScript API的Geocoder进行地址解析
|
||||
if (form.homeAddressDetail) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('开始地理编码,地址:', form.homeAddressDetail)
|
||||
|
||||
// 创建地理编码对象
|
||||
const geocoder = new T.Geocoder()
|
||||
|
||||
// 进行地址解析
|
||||
geocoder.getPoint(form.homeAddressDetail, (result: any) => {
|
||||
if (result && result.getStatus() === 0) {
|
||||
// 解析成功
|
||||
const location = result.getLocationPoint()
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地理编码成功:', { lng: location.lng, lat: location.lat })
|
||||
|
||||
// 将地图中心移动到该位置
|
||||
map.value.centerAndZoom(location, 15)
|
||||
|
||||
// 添加标记
|
||||
const marker = new T.Marker(location)
|
||||
map.value.addOverLay(marker)
|
||||
|
||||
// 添加信息窗口
|
||||
const infoWin = new T.InfoWindow()
|
||||
infoWin.setContent(`<div style="padding:12px;max-width:300px;">
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
circleShow.value = true;
|
||||
form.id = row.id;
|
||||
form.homeAddressDetail = row.homeAddressDetail;
|
||||
// 获取家庭地址的经纬度(如果有的话)
|
||||
form.homeLng = row.homeLng || row.homeLongitude || 0;
|
||||
form.homeLat = row.homeLat || row.homeLatitude || 0;
|
||||
nextTick(() => {
|
||||
getDicts('recruit_dorm_jw')
|
||||
.then((data: any) => {
|
||||
const arr = data.data;
|
||||
arr.forEach((e: any) => {
|
||||
if (e.label == 'bj') {
|
||||
form.raidus = e.value;
|
||||
dictId.value = e.id;
|
||||
} else if (e.label == 'lng') {
|
||||
center.lng = e.value;
|
||||
} else if (e.label == 'lat') {
|
||||
center.lat = e.value;
|
||||
}
|
||||
});
|
||||
|
||||
// 等待对话框渲染完成后再加载地图
|
||||
setTimeout(() => {
|
||||
loadTiandituMap(tk)
|
||||
.then((T: any) => {
|
||||
// 清除之前的地图实例(如果存在)
|
||||
if (map.value) {
|
||||
map.value.clearOverLays();
|
||||
}
|
||||
|
||||
// 创建地图实例
|
||||
map.value = new T.Map('container2');
|
||||
// 创建点坐标
|
||||
const point = new T.LngLat(center.lng, center.lat);
|
||||
// 初始化地图,设置中心点坐标和地图级别(使用默认矢量地图)
|
||||
map.value.centerAndZoom(point, 13);
|
||||
|
||||
// 启用地图交互功能
|
||||
map.value.enableDrag(); // 启用拖拽
|
||||
map.value.enableScrollWheelZoom(); // 启用滚轮缩放
|
||||
map.value.enableDoubleClickZoom(); // 启用双击放大
|
||||
map.value.enableKeyboard(); // 启用键盘操作
|
||||
|
||||
// 使用天地图JavaScript API的Geocoder进行地址解析
|
||||
if (form.homeAddressDetail) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('开始地理编码,地址:', form.homeAddressDetail);
|
||||
|
||||
// 创建地理编码对象
|
||||
const geocoder = new T.Geocoder();
|
||||
|
||||
// 进行地址解析
|
||||
geocoder.getPoint(form.homeAddressDetail, (result: any) => {
|
||||
if (result && result.getStatus() === 0) {
|
||||
// 解析成功
|
||||
const location = result.getLocationPoint();
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地理编码成功:', { lng: location.lng, lat: location.lat });
|
||||
|
||||
// 将地图中心移动到该位置
|
||||
map.value.centerAndZoom(location, 15);
|
||||
|
||||
// 添加标记
|
||||
const marker = new T.Marker(location);
|
||||
map.value.addOverLay(marker);
|
||||
|
||||
// 添加信息窗口
|
||||
const infoWin = new T.InfoWindow();
|
||||
infoWin.setContent(`<div style="padding:12px;max-width:300px;">
|
||||
<div style="font-size:14px;font-weight:bold;margin-bottom:8px;">📍 家庭地址</div>
|
||||
<div style="color:#666;margin-bottom:6px;">${form.homeAddressDetail}</div>
|
||||
<div style="font-size:12px;color:#999;padding-top:6px;border-top:1px solid #eee;">
|
||||
坐标: ${location.lng.toFixed(6)}, ${location.lat.toFixed(6)}
|
||||
</div>
|
||||
</div>`)
|
||||
marker.addEventListener('click', function () {
|
||||
marker.openInfoWindow(infoWin)
|
||||
})
|
||||
|
||||
// 自动打开信息窗口
|
||||
marker.openInfoWindow(infoWin)
|
||||
} else {
|
||||
// 解析失败,显示学校中心位置
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地理编码失败,显示学校中心位置')
|
||||
|
||||
ElMessage.warning('地址解析失败')
|
||||
}
|
||||
})
|
||||
} else {
|
||||
// 没有地址信息
|
||||
const marker = new T.Marker(point)
|
||||
map.value.addOverLay(marker)
|
||||
|
||||
const infoWin = new T.InfoWindow()
|
||||
infoWin.setContent(`<div style="padding:12px;max-width:300px;">
|
||||
</div>`);
|
||||
marker.addEventListener('click', function () {
|
||||
marker.openInfoWindow(infoWin);
|
||||
});
|
||||
|
||||
// 自动打开信息窗口
|
||||
marker.openInfoWindow(infoWin);
|
||||
} else {
|
||||
// 解析失败,显示学校中心位置
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('地理编码失败,显示学校中心位置');
|
||||
|
||||
ElMessage.warning('地址解析失败');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
// 没有地址信息
|
||||
const marker = new T.Marker(point);
|
||||
map.value.addOverLay(marker);
|
||||
|
||||
const infoWin = new T.InfoWindow();
|
||||
infoWin.setContent(`<div style="padding:12px;max-width:300px;">
|
||||
<div style="font-size:14px;font-weight:bold;margin-bottom:8px;">📍 学校位置</div>
|
||||
<div style="font-size:12px;color:#999;">暂无家庭地址信息</div>
|
||||
</div>`)
|
||||
marker.addEventListener('click', function () {
|
||||
marker.openInfoWindow(infoWin)
|
||||
})
|
||||
}
|
||||
}).catch(() => {
|
||||
ElMessage.error('地图加载失败,请检查网络连接或Token配置')
|
||||
})
|
||||
}, 200)
|
||||
}).catch(() => {
|
||||
ElMessage.error('获取地图配置失败')
|
||||
})
|
||||
})
|
||||
}
|
||||
</div>`);
|
||||
marker.addEventListener('click', function () {
|
||||
marker.openInfoWindow(infoWin);
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch(() => {
|
||||
ElMessage.error('地图加载失败,请检查网络连接或Token配置');
|
||||
});
|
||||
}, 200);
|
||||
})
|
||||
.catch(() => {
|
||||
ElMessage.error('获取地图配置失败');
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
#container2 {
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 700px;
|
||||
margin: 0;
|
||||
font-family: "微软雅黑";
|
||||
margin-top: 15px;
|
||||
overflow: hidden;
|
||||
width: 100%;
|
||||
height: 700px;
|
||||
margin: 0;
|
||||
font-family: '微软雅黑';
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
ul li {
|
||||
list-style: none;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
:deep(.address-descriptions .el-descriptions__label) {
|
||||
width: 100px !important;
|
||||
min-width: 100px !important;
|
||||
text-align: center !important;
|
||||
width: 100px !important;
|
||||
min-width: 100px !important;
|
||||
text-align: center !important;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,176 +1,171 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-form :model="queryForm" inline class="mb-4" ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划" @change="chanMajor">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="handleFilter">查询</el-button>
|
||||
<el-button type="primary" plain icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="handleExport">导出</el-button>
|
||||
</div>
|
||||
<div class="mb15">
|
||||
<el-button type="warning" plain icon="Download" :loading="exportLoading" @click="handleExport">导出</el-button>
|
||||
</div>
|
||||
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
border
|
||||
stripe
|
||||
height="700px"
|
||||
v-loading="state.loading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column width="150" prop="deptCode" header-align="center" align="center" label="学院">
|
||||
<template #default="scope">
|
||||
{{ global.getLabelValueByPropes(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="150" prop="majorCode" header-align="center" align="center" label="专业代码" />
|
||||
<el-table-column prop="majorName" header-align="center" align="center" label="专业名称" />
|
||||
<el-table-column width="80" prop="scoreLine" header-align="center" align="center" label="分数线" />
|
||||
<el-table-column width="80" prop="planNum" header-align="center" align="center" label="计划总数" />
|
||||
<el-table-column width="80" prop="recruitmentNum" header-align="center" align="center" label="拟招人数" />
|
||||
<el-table-column width="80" prop="hasNum" header-align="center" align="center" label="已招人数" />
|
||||
<el-table-column width="80" prop="boyNum" header-align="center" align="center" label="已招(男)" />
|
||||
<el-table-column width="80" prop="girlNum" header-align="center" align="center" label="已招(女)" />
|
||||
<el-table-column width="80" prop="cityFrom" header-align="center" align="center" label="市平台" />
|
||||
<el-table-column width="80" prop="schoolFrom" header-align="center" align="center" label="校平台" />
|
||||
<el-table-column width="80" prop="xyNum" header-align="center" align="center" label="剩余人数" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
<el-table
|
||||
:data="state.dataList"
|
||||
border
|
||||
stripe
|
||||
height="700px"
|
||||
v-loading="state.loading"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column width="150" prop="deptCode" header-align="center" align="center" label="学院">
|
||||
<template #default="scope">
|
||||
{{ global.getLabelValueByPropes(deptList, scope.row.deptCode, { key: 'deptCode', value: 'deptName' }) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column width="150" prop="majorCode" header-align="center" align="center" label="专业代码" />
|
||||
<el-table-column prop="majorName" header-align="center" align="center" label="专业名称" />
|
||||
<el-table-column width="80" prop="scoreLine" header-align="center" align="center" label="分数线" />
|
||||
<el-table-column width="80" prop="planNum" header-align="center" align="center" label="计划总数" />
|
||||
<el-table-column width="80" prop="recruitmentNum" header-align="center" align="center" label="拟招人数" />
|
||||
<el-table-column width="80" prop="hasNum" header-align="center" align="center" label="已招人数" />
|
||||
<el-table-column width="80" prop="boyNum" header-align="center" align="center" label="已招(男)" />
|
||||
<el-table-column width="80" prop="girlNum" header-align="center" align="center" label="已招(女)" />
|
||||
<el-table-column width="80" prop="cityFrom" header-align="center" align="center" label="市平台" />
|
||||
<el-table-column width="80" prop="schoolFrom" header-align="center" align="center" label="校平台" />
|
||||
<el-table-column width="80" prop="xyNum" header-align="center" align="center" label="剩余人数" />
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignup-static">
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { useDict } from '/@/hooks/dict'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan'
|
||||
import { getDeptList } from '/@/api/basic/basicclass'
|
||||
import { ref, reactive, onMounted } from 'vue';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { useDict } from '/@/hooks/dict';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { listPlanByCondition as planMajor } from '/@/api/recruit/recruitstudentplan';
|
||||
import { getDeptList } from '/@/api/basic/basicclass';
|
||||
// @ts-ignore
|
||||
import global from '/@/components/tools/commondict.vue'
|
||||
import global from '/@/components/tools/commondict.vue';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 字典
|
||||
const { getTypeValue } = useDict()
|
||||
const { getTypeValue } = useDict();
|
||||
|
||||
// 引用
|
||||
const searchFormRef = ref()
|
||||
const searchFormRef = ref();
|
||||
|
||||
// 状态
|
||||
const planList = ref<any[]>([])
|
||||
const eduList = ref<any[]>([])
|
||||
const planMajorList = ref<any[]>([])
|
||||
const deptList = ref<any[]>([])
|
||||
const exportLoading = ref(false)
|
||||
const planList = ref<any[]>([]);
|
||||
const eduList = ref<any[]>([]);
|
||||
const planMajorList = ref<any[]>([]);
|
||||
const deptList = ref<any[]>([]);
|
||||
const exportLoading = ref(false);
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
auditStatus: 20
|
||||
})
|
||||
groupId: '',
|
||||
auditStatus: 20,
|
||||
});
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
// pageList: async (params: any) => {
|
||||
// const response = await fetchListByStatic(params)
|
||||
// return {
|
||||
// data: {
|
||||
// records: response.data || [],
|
||||
// total: response.data?.length || 0
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
// pageList: async (params: any) => {
|
||||
// const response = await fetchListByStatic(params)
|
||||
// return {
|
||||
// data: {
|
||||
// records: response.data || [],
|
||||
// total: response.data?.length || 0
|
||||
// }
|
||||
// }
|
||||
// },
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, tableStyle, downBlobFile } = useTable(state)
|
||||
const { getDataList, tableStyle, downBlobFile } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
// 查询二级学院信息
|
||||
const deptData = await getDeptList()
|
||||
deptList.value = deptData.data || []
|
||||
deptList.value.push({ deptCode: '小计(高中/职技校)', deptName: '小计(高中/职技校)' })
|
||||
deptList.value.push({ deptCode: '小计(初中)', deptName: '小计(初中)' })
|
||||
deptList.value.push({ deptCode: '小计(初中_联院大专)', deptName: '小计(初中_联院大专)' })
|
||||
deptList.value.push({ deptCode: '合计', deptName: '合计' })
|
||||
try {
|
||||
// 查询二级学院信息
|
||||
const deptData = await getDeptList();
|
||||
deptList.value = deptData.data || [];
|
||||
deptList.value.push({ deptCode: '小计(高中/职技校)', deptName: '小计(高中/职技校)' });
|
||||
deptList.value.push({ deptCode: '小计(初中)', deptName: '小计(初中)' });
|
||||
deptList.value.push({ deptCode: '小计(初中_联院大专)', deptName: '小计(初中_联院大专)' });
|
||||
deptList.value.push({ deptCode: '合计', deptName: '合计' });
|
||||
|
||||
// 获取招生计划列表
|
||||
const planData = await getList()
|
||||
planList.value = planData.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
getDataList()
|
||||
chanMajor()
|
||||
}
|
||||
// 获取招生计划列表
|
||||
const planData = await getList();
|
||||
planList.value = planData.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
getDataList();
|
||||
chanMajor();
|
||||
}
|
||||
|
||||
// 获取字典数据
|
||||
const eduRes = await getTypeValue('education_type')
|
||||
eduList.value = eduRes.data || []
|
||||
} catch (error) {
|
||||
message.error('初始化失败')
|
||||
}
|
||||
}
|
||||
// 获取字典数据
|
||||
const eduRes = await getTypeValue('education_type');
|
||||
eduList.value = eduRes.data || [];
|
||||
} catch (error) {
|
||||
message.error('初始化失败');
|
||||
}
|
||||
};
|
||||
|
||||
// 导出
|
||||
const handleExport = async () => {
|
||||
try {
|
||||
exportLoading.value = true
|
||||
await downBlobFile('/recruit/recruitstudentsignup/exportExcel', queryForm, '招生统计.xls')
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败')
|
||||
} finally {
|
||||
exportLoading.value = false
|
||||
}
|
||||
}
|
||||
try {
|
||||
exportLoading.value = true;
|
||||
await downBlobFile('/recruit/recruitstudentsignup/exportExcel', queryForm, '招生统计.xls');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '导出失败');
|
||||
} finally {
|
||||
exportLoading.value = false;
|
||||
}
|
||||
};
|
||||
|
||||
// 切换专业
|
||||
const chanMajor = async () => {
|
||||
try {
|
||||
planMajorList.value = []
|
||||
if (queryForm.groupId) {
|
||||
const data = await planMajor({ groupId: queryForm.groupId })
|
||||
planMajorList.value = data.data || []
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取专业列表失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
planMajorList.value = [];
|
||||
if (queryForm.groupId) {
|
||||
const data = await planMajor({ groupId: queryForm.groupId });
|
||||
planMajorList.value = data.data || [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('获取专业列表失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 查询
|
||||
const handleFilter = () => {
|
||||
getDataList()
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,37 +1,37 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="申请列表" name="first">
|
||||
<List />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="申请汇总" name="second">
|
||||
<DormAnalysis />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="申请列表" name="first">
|
||||
<List />
|
||||
</el-tab-pane>
|
||||
<el-tab-pane label="申请汇总" name="second">
|
||||
<DormAnalysis />
|
||||
</el-tab-pane>
|
||||
</el-tabs>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="studorm">
|
||||
import { ref, defineAsyncComponent } from 'vue'
|
||||
import { ref, defineAsyncComponent } from 'vue';
|
||||
|
||||
const List = defineAsyncComponent(() => import('./list.vue'))
|
||||
const DormAnalysis = defineAsyncComponent(() => import('./dorm_analysis.vue'))
|
||||
const List = defineAsyncComponent(() => import('./list.vue'));
|
||||
const DormAnalysis = defineAsyncComponent(() => import('./dorm_analysis.vue'));
|
||||
|
||||
// 响应式数据
|
||||
const activeName = ref('first')
|
||||
const activeName = ref('first');
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
:deep(.el-tabs) {
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.el-tabs__content {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
}
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.el-tabs__content {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,537 +1,522 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
:title="title"
|
||||
:close-on-click-modal="false"
|
||||
v-model="visible"
|
||||
append-to-body
|
||||
width="70%">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="() => dataFormSubmit('1')"
|
||||
label-width="100px">
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id"
|
||||
placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input type="text" v-model="dataForm.name" :disabled="type != 1"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="联系人" prop="contactName">
|
||||
<el-select
|
||||
v-model="dataForm.contactName"
|
||||
filterable
|
||||
clearable
|
||||
placeholder=""
|
||||
:disabled="!(hasAuth('recruit_recruitprestudent_dj_sure') || dataForm.auditStatus != '20')">
|
||||
<el-option
|
||||
v-for="item in contactNameList"
|
||||
:key="item.teacherNo"
|
||||
:label="item.realName+'-'+item.deptCode"
|
||||
:value="item.teacherNo">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-dialog :title="title" :close-on-click-modal="false" v-model="visible" append-to-body width="70%">
|
||||
<el-form :model="dataForm" :rules="dataRule" ref="dataFormRef" @keyup.enter="() => dataFormSubmit('1')" label-width="100px">
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="dataForm.groupId" filterable :disabled="!!dataForm.id" placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id"> </el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="姓名" prop="name">
|
||||
<el-input type="text" v-model="dataForm.name" :disabled="type != 1"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="联系人" prop="contactName">
|
||||
<el-select
|
||||
v-model="dataForm.contactName"
|
||||
filterable
|
||||
clearable
|
||||
placeholder=""
|
||||
:disabled="!(hasAuth('recruit_recruitprestudent_dj_sure') || dataForm.auditStatus != '20')"
|
||||
>
|
||||
<el-option v-for="item in contactNameList" :key="item.teacherNo" :label="item.realName + '-' + item.deptCode" :value="item.teacherNo">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="成绩单" prop="scorePhoto">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="uploadSuccess">
|
||||
<div v-if="dataForm.scorePhoto" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.scorePhoto" class="avatar"/>
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="毕业证" prop="graPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload2Success">
|
||||
<div v-if="dataForm.graPic" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.graPic" class="avatar"/>
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="在常营业执照" prop="yyPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload3Success">
|
||||
<div v-if="dataForm.yyPic" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.yyPic" class="avatar"/>
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="在常社保证明" prop="sbPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload5Success">
|
||||
<div v-if="dataForm.sbPic" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.sbPic" class="avatar"/>
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
|
||||
<el-col >
|
||||
<el-form-item label="在常租赁合同/房产证明" prop="housePic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
list-type="picture-card"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:limit="5"
|
||||
:data="uploadData"
|
||||
:file-list="houseList"
|
||||
:before-upload="beforeUpload"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="remove4Handler"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload4Success">
|
||||
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
<template #tip>
|
||||
<div>最多上传5张</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col>
|
||||
<el-form-item label="户口本" prop="householdPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
list-type="picture-card"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:limit="5"
|
||||
:data="uploadData"
|
||||
:file-list="hkPicList"
|
||||
:before-upload="beforeUpload"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="remove6Handler"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload6Success">
|
||||
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
<template #tip>
|
||||
<div>最多上传5张</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="材料审核意见" prop="zlshRemark">
|
||||
<el-input v-model="dataForm.zlshRemark" placeholder="请输入审核意见" type="textarea" :rows="2" ></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit('1',false)" v-if="hasAuth('recruit_recruitstudentsignup_edit') && canSubmit">保存</el-button>
|
||||
<el-button type="success" icon="CircleCheck" @click="dataFormSubmit('2',false)" v-if="hasAuth('signup_material_exam') && canSubmit">通过</el-button>
|
||||
<el-button type="success" icon="CircleCheck" @click="dataFormSubmit('2',true)" v-if="hasAuth('signup_material_pass_force') && canSubmit">强制通过</el-button>
|
||||
<el-button type="danger" icon="CircleClose" @click="dataFormSubmit('3',false)" v-if="hasAuth('signup_material_exam') && canSubmit">驳回</el-button>
|
||||
</div>
|
||||
</template>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="成绩单" prop="scorePhoto">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="uploadSuccess"
|
||||
>
|
||||
<div v-if="dataForm.scorePhoto" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.scorePhoto" class="avatar" />
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="毕业证" prop="graPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload2Success"
|
||||
>
|
||||
<div v-if="dataForm.graPic" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.graPic" class="avatar" />
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="在常营业执照" prop="yyPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload3Success"
|
||||
>
|
||||
<div v-if="dataForm.yyPic" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.yyPic" class="avatar" />
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item label="在常社保证明" prop="sbPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
class="avatar-uploader"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:data="uploadData"
|
||||
:show-file-list="false"
|
||||
:before-upload="beforeUpload"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload5Success"
|
||||
>
|
||||
<div v-if="dataForm.sbPic" class="avatar-wrapper">
|
||||
<img :src="baseUrl + dataForm.sbPic" class="avatar" />
|
||||
</div>
|
||||
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col>
|
||||
<el-form-item label="在常租赁合同/房产证明" prop="housePic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
list-type="picture-card"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:limit="5"
|
||||
:data="uploadData"
|
||||
:file-list="houseList"
|
||||
:before-upload="beforeUpload"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="remove4Handler"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload4Success"
|
||||
>
|
||||
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
<template #tip>
|
||||
<div>最多上传5张</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-dialog title="图片预览" v-model="dialogUploadVisible" append-to-body>
|
||||
<img width="100%" :src="dialogImageUrl" alt="">
|
||||
</el-dialog>
|
||||
</el-dialog>
|
||||
<el-col>
|
||||
<el-form-item label="户口本" prop="householdPic">
|
||||
<el-upload
|
||||
:action="uploadUrl"
|
||||
list-type="picture-card"
|
||||
name="file"
|
||||
:headers="headers"
|
||||
:limit="5"
|
||||
:data="uploadData"
|
||||
:file-list="hkPicList"
|
||||
:before-upload="beforeUpload"
|
||||
:on-preview="handlePictureCardPreview"
|
||||
:on-remove="remove6Handler"
|
||||
:http-request="httpRequest"
|
||||
:on-success="upload6Success"
|
||||
>
|
||||
<el-icon class="avatar-uploader-icon"><Plus /></el-icon>
|
||||
<template #tip>
|
||||
<div>最多上传5张</div>
|
||||
</template>
|
||||
</el-upload>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item label="材料审核意见" prop="zlshRemark">
|
||||
<el-input v-model="dataForm.zlshRemark" placeholder="请输入审核意见" type="textarea" :rows="2"></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit('1', false)" v-if="hasAuth('recruit_recruitstudentsignup_edit') && canSubmit"
|
||||
>保存</el-button
|
||||
>
|
||||
<el-button type="success" icon="CircleCheck" @click="dataFormSubmit('2', false)" v-if="hasAuth('signup_material_exam') && canSubmit"
|
||||
>通过</el-button
|
||||
>
|
||||
<el-button type="success" icon="CircleCheck" @click="dataFormSubmit('2', true)" v-if="hasAuth('signup_material_pass_force') && canSubmit"
|
||||
>强制通过</el-button
|
||||
>
|
||||
<el-button type="danger" icon="CircleClose" @click="dataFormSubmit('3', false)" v-if="hasAuth('signup_material_exam') && canSubmit"
|
||||
>驳回</el-button
|
||||
>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<el-dialog title="图片预览" v-model="dialogUploadVisible" append-to-body>
|
||||
<img width="100%" :src="dialogImageUrl" alt="" />
|
||||
</el-dialog>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, nextTick, computed, onMounted } from 'vue'
|
||||
import { Plus } from '@element-plus/icons-vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { Session } from '/@/utils/storage'
|
||||
import axios from 'axios'
|
||||
import { getObj, materialExam } from '/@/api/recruit/recruitstudentsignup'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import { queryAllTeacher } from '/@/api/professional/professionaluser/teacherbase'
|
||||
import { AUDIT_STATUS_LIST, getStatusConfig } from '/@/config/global'
|
||||
import { ref, reactive, nextTick, computed, onMounted } from 'vue';
|
||||
import { Plus } from '@element-plus/icons-vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { Session } from '/@/utils/storage';
|
||||
import axios from 'axios';
|
||||
import { getObj, materialExam } from '/@/api/recruit/recruitstudentsignup';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import { queryAllTeacher } from '/@/api/professional/professionaluser/teacherbase';
|
||||
import { AUDIT_STATUS_LIST, getStatusConfig } from '/@/config/global';
|
||||
|
||||
const auditStatusList = AUDIT_STATUS_LIST
|
||||
const { hasAuth } = useAuth()
|
||||
const auditStatusList = AUDIT_STATUS_LIST;
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
const baseUrl = import.meta.env.VITE_API_URL
|
||||
const uploadUrl = baseUrl + '/recruit/file/uploadAttachment'
|
||||
const baseUrl = import.meta.env.VITE_API_URL;
|
||||
const uploadUrl = baseUrl + '/recruit/file/uploadAttachment';
|
||||
|
||||
// 请求头
|
||||
const headers = computed(() => {
|
||||
return {
|
||||
"Authorization": 'Bearer ' + Session.getToken()
|
||||
}
|
||||
})
|
||||
return {
|
||||
Authorization: 'Bearer ' + Session.getToken(),
|
||||
};
|
||||
});
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refreshDataList'): void
|
||||
}>()
|
||||
(e: 'refreshDataList'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const dataFormRef = ref();
|
||||
|
||||
// 响应式数据
|
||||
const uploadData = reactive({})
|
||||
const visible = ref(false)
|
||||
const canSubmit = ref(false)
|
||||
const title = ref("")
|
||||
const contactNameflag = ref(false)
|
||||
const type = ref<number | null>(null)
|
||||
const contactNameList = ref<any[]>([])
|
||||
const planList = ref<any[]>([])
|
||||
const uploadData = reactive({});
|
||||
const visible = ref(false);
|
||||
const canSubmit = ref(false);
|
||||
const title = ref('');
|
||||
const contactNameflag = ref(false);
|
||||
const type = ref<number | null>(null);
|
||||
const contactNameList = ref<any[]>([]);
|
||||
const planList = ref<any[]>([]);
|
||||
|
||||
const houseList = ref<any[]>([])
|
||||
const hkPicList = ref<any[]>([])
|
||||
const houseList = ref<any[]>([]);
|
||||
const hkPicList = ref<any[]>([]);
|
||||
|
||||
const fileReader = ref<FileReader | null>(null)
|
||||
const dialogImageUrl = ref("")
|
||||
const dialogUploadVisible = ref(false)
|
||||
const fileReader = ref<FileReader | null>(null);
|
||||
const dialogImageUrl = ref('');
|
||||
const dialogUploadVisible = ref(false);
|
||||
|
||||
const dataForm = reactive({
|
||||
id: "",
|
||||
zlshRemark: "",
|
||||
groupId: "",
|
||||
name: "",
|
||||
contactName: "",
|
||||
scorePhoto: "",
|
||||
graPic: "",
|
||||
yyPic: "",
|
||||
housePic: "",
|
||||
sbPic: "",
|
||||
householdPic: "",
|
||||
zlsh: "",
|
||||
// 以下字段从后端获取,用于显示和判断
|
||||
serialNumber: "",
|
||||
degreeOfEducation: "",
|
||||
auditStatus: ""
|
||||
})
|
||||
id: '',
|
||||
zlshRemark: '',
|
||||
groupId: '',
|
||||
name: '',
|
||||
contactName: '',
|
||||
scorePhoto: '',
|
||||
graPic: '',
|
||||
yyPic: '',
|
||||
housePic: '',
|
||||
sbPic: '',
|
||||
householdPic: '',
|
||||
zlsh: '',
|
||||
// 以下字段从后端获取,用于显示和判断
|
||||
serialNumber: '',
|
||||
degreeOfEducation: '',
|
||||
auditStatus: '',
|
||||
});
|
||||
|
||||
const dataRule = {
|
||||
groupId: [
|
||||
{ required: true, message: '招生计划不能为空', trigger: 'change' }
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: '姓名不能为空', trigger: 'change' }
|
||||
],
|
||||
idNumber: [
|
||||
{ required: true, message: '身份证不能为空', trigger: 'change' }
|
||||
],
|
||||
correctedScore: [
|
||||
{ required: true, message: '成绩折算分不能为空', trigger: 'change' }
|
||||
],
|
||||
confirmedMajor: [
|
||||
{ required: true, message: '原录取专业不能为空', trigger: 'change' }
|
||||
],
|
||||
newConfirmedMajor: [
|
||||
{ required: true, message: '新录取专业不能为空', trigger: 'change' }
|
||||
]
|
||||
}
|
||||
groupId: [{ required: true, message: '招生计划不能为空', trigger: 'change' }],
|
||||
name: [{ required: true, message: '姓名不能为空', trigger: 'change' }],
|
||||
idNumber: [{ required: true, message: '身份证不能为空', trigger: 'change' }],
|
||||
correctedScore: [{ required: true, message: '成绩折算分不能为空', trigger: 'change' }],
|
||||
confirmedMajor: [{ required: true, message: '原录取专业不能为空', trigger: 'change' }],
|
||||
newConfirmedMajor: [{ required: true, message: '新录取专业不能为空', trigger: 'change' }],
|
||||
};
|
||||
|
||||
// 初始化 FileReader
|
||||
onMounted(() => {
|
||||
if (!window.FileReader) {
|
||||
message.error('您的浏览器不支持 FileReader API!')
|
||||
} else {
|
||||
fileReader.value = new FileReader()
|
||||
}
|
||||
})
|
||||
if (!window.FileReader) {
|
||||
message.error('您的浏览器不支持 FileReader API!');
|
||||
} else {
|
||||
fileReader.value = new FileReader();
|
||||
}
|
||||
});
|
||||
|
||||
// 上传前验证
|
||||
const beforeUpload = (file: File) => {
|
||||
const isLt5M = file.size < 10 * 1024 * 1024
|
||||
if (!isLt5M) {
|
||||
message.error('文件大小不能超过10M')
|
||||
return false
|
||||
}
|
||||
return true
|
||||
}
|
||||
const isLt5M = file.size < 10 * 1024 * 1024;
|
||||
if (!isLt5M) {
|
||||
message.error('文件大小不能超过10M');
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
// 图片预览
|
||||
const handlePictureCardPreview = (file: any) => {
|
||||
dialogImageUrl.value = file.url
|
||||
dialogUploadVisible.value = true
|
||||
}
|
||||
|
||||
dialogImageUrl.value = file.url;
|
||||
dialogUploadVisible.value = true;
|
||||
};
|
||||
|
||||
// 通用移除文件处理(多文件)
|
||||
const handleRemoveMultiple = (fileList: any[], dataFormField: string) => {
|
||||
return (file: any) => {
|
||||
const arr: any[] = []
|
||||
const strArr: string[] = []
|
||||
const dataFormObj = dataForm as any
|
||||
fileList.forEach((e: any) => {
|
||||
if (e.url != file.url) {
|
||||
arr.push(e)
|
||||
// 保存时使用原始路径
|
||||
strArr.push(e.originalUrl || (e.url.startsWith(baseUrl) ? e.url.substring(baseUrl.length) : e.url))
|
||||
}
|
||||
})
|
||||
fileList.splice(0, fileList.length, ...arr)
|
||||
dataFormObj[dataFormField] = strArr.join(",")
|
||||
}
|
||||
}
|
||||
return (file: any) => {
|
||||
const arr: any[] = [];
|
||||
const strArr: string[] = [];
|
||||
const dataFormObj = dataForm as any;
|
||||
fileList.forEach((e: any) => {
|
||||
if (e.url != file.url) {
|
||||
arr.push(e);
|
||||
// 保存时使用原始路径
|
||||
strArr.push(e.originalUrl || (e.url.startsWith(baseUrl) ? e.url.substring(baseUrl.length) : e.url));
|
||||
}
|
||||
});
|
||||
fileList.splice(0, fileList.length, ...arr);
|
||||
dataFormObj[dataFormField] = strArr.join(',');
|
||||
};
|
||||
};
|
||||
|
||||
// 移除文件处理(多图上传)
|
||||
const remove4Handler = handleRemoveMultiple(houseList.value, 'housePic')
|
||||
const remove6Handler = handleRemoveMultiple(hkPicList.value, 'householdPic')
|
||||
const remove4Handler = handleRemoveMultiple(houseList.value, 'housePic');
|
||||
const remove6Handler = handleRemoveMultiple(hkPicList.value, 'householdPic');
|
||||
|
||||
// 自定义上传请求
|
||||
const httpRequest = (options: any) => {
|
||||
const file = options.file
|
||||
if (file && fileReader.value) {
|
||||
fileReader.value.readAsDataURL(file)
|
||||
fileReader.value.onload = () => {
|
||||
const base64Str = fileReader.value?.result as string
|
||||
const config = {
|
||||
url: uploadUrl,
|
||||
method: 'post',
|
||||
headers: headers.value,
|
||||
data: {
|
||||
base64Str: base64Str.split(',')[1]
|
||||
},
|
||||
timeout: 10000,
|
||||
onUploadProgress: function (progressEvent: any) {
|
||||
progressEvent.percent = progressEvent.loaded / progressEvent.total * 100
|
||||
options.onProgress(progressEvent, file)
|
||||
},
|
||||
}
|
||||
axios(config)
|
||||
.then((res: any) => {
|
||||
options.onSuccess(res, file)
|
||||
})
|
||||
.catch((err: any) => {
|
||||
options.onError(err)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
const file = options.file;
|
||||
if (file && fileReader.value) {
|
||||
fileReader.value.readAsDataURL(file);
|
||||
fileReader.value.onload = () => {
|
||||
const base64Str = fileReader.value?.result as string;
|
||||
const config = {
|
||||
url: uploadUrl,
|
||||
method: 'post',
|
||||
headers: headers.value,
|
||||
data: {
|
||||
base64Str: base64Str.split(',')[1],
|
||||
},
|
||||
timeout: 10000,
|
||||
onUploadProgress: function (progressEvent: any) {
|
||||
progressEvent.percent = (progressEvent.loaded / progressEvent.total) * 100;
|
||||
options.onProgress(progressEvent, file);
|
||||
},
|
||||
};
|
||||
axios(config)
|
||||
.then((res: any) => {
|
||||
options.onSuccess(res, file);
|
||||
})
|
||||
.catch((err: any) => {
|
||||
options.onError(err);
|
||||
});
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
// 通用上传成功回调(单文件 - avatar模式)
|
||||
const handleUploadSuccess = (dataFormField: string) => {
|
||||
return (res: any) => {
|
||||
const fileUrl = res.data.fileUrl
|
||||
const dataFormObj = dataForm as any
|
||||
dataFormObj[dataFormField] = fileUrl
|
||||
}
|
||||
}
|
||||
return (res: any) => {
|
||||
const fileUrl = res.data.fileUrl;
|
||||
const dataFormObj = dataForm as any;
|
||||
dataFormObj[dataFormField] = fileUrl;
|
||||
};
|
||||
};
|
||||
|
||||
// 通用上传成功回调(多文件)
|
||||
const handleUploadSuccessMultiple = (fileList: any[], dataFormField: string) => {
|
||||
return (res: any) => {
|
||||
const fileUrl = res.data.fileUrl // 后端返回的原始路径
|
||||
const dataFormObj = dataForm as any
|
||||
// 添加到文件列表,显示时添加 baseUrl 前缀,同时保存原始路径用于提交
|
||||
fileList.push({ url: baseUrl + fileUrl, name: '', originalUrl: fileUrl })
|
||||
// 保存时使用原始路径
|
||||
const arr: string[] = []
|
||||
fileList.forEach((e: any) => {
|
||||
// 优先使用保存的原始路径,如果没有则从 url 中提取
|
||||
arr.push(e.originalUrl || (e.url.startsWith(baseUrl) ? e.url.substring(baseUrl.length) : e.url))
|
||||
})
|
||||
dataFormObj[dataFormField] = arr.join(",")
|
||||
}
|
||||
}
|
||||
return (res: any) => {
|
||||
const fileUrl = res.data.fileUrl; // 后端返回的原始路径
|
||||
const dataFormObj = dataForm as any;
|
||||
// 添加到文件列表,显示时添加 baseUrl 前缀,同时保存原始路径用于提交
|
||||
fileList.push({ url: baseUrl + fileUrl, name: '', originalUrl: fileUrl });
|
||||
// 保存时使用原始路径
|
||||
const arr: string[] = [];
|
||||
fileList.forEach((e: any) => {
|
||||
// 优先使用保存的原始路径,如果没有则从 url 中提取
|
||||
arr.push(e.originalUrl || (e.url.startsWith(baseUrl) ? e.url.substring(baseUrl.length) : e.url));
|
||||
});
|
||||
dataFormObj[dataFormField] = arr.join(',');
|
||||
};
|
||||
};
|
||||
|
||||
// 上传成功回调
|
||||
const uploadSuccess = handleUploadSuccess('scorePhoto')
|
||||
const upload2Success = handleUploadSuccess('graPic')
|
||||
const upload3Success = handleUploadSuccess('yyPic')
|
||||
const upload4Success = handleUploadSuccessMultiple(houseList.value, 'housePic')
|
||||
const upload5Success = handleUploadSuccess('sbPic')
|
||||
const upload6Success = handleUploadSuccessMultiple(hkPicList.value, 'householdPic')
|
||||
const uploadSuccess = handleUploadSuccess('scorePhoto');
|
||||
const upload2Success = handleUploadSuccess('graPic');
|
||||
const upload3Success = handleUploadSuccess('yyPic');
|
||||
const upload4Success = handleUploadSuccessMultiple(houseList.value, 'housePic');
|
||||
const upload5Success = handleUploadSuccess('sbPic');
|
||||
const upload6Success = handleUploadSuccessMultiple(hkPicList.value, 'householdPic');
|
||||
|
||||
// 初始化数据
|
||||
const initData = () => {
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data
|
||||
})
|
||||
// 联系人(教职工)
|
||||
queryAllTeacher().then((res: any) => {
|
||||
contactNameList.value = res.data
|
||||
})
|
||||
}
|
||||
getList().then((data: any) => {
|
||||
planList.value = data.data;
|
||||
});
|
||||
// 联系人(教职工)
|
||||
queryAllTeacher().then((res: any) => {
|
||||
contactNameList.value = res.data;
|
||||
});
|
||||
};
|
||||
|
||||
// 表单提交
|
||||
const dataFormSubmit = (submitType: string,force:any) => {
|
||||
if ((dataForm.zlshRemark == '' || !dataForm.zlshRemark) && submitType == '3') {
|
||||
message.error('请填写驳回理由')
|
||||
return
|
||||
}
|
||||
dataForm.zlsh = submitType
|
||||
canSubmit.value = false
|
||||
dataForm.force=force
|
||||
materialExam(dataForm).then(() => {
|
||||
message.success('操作成功')
|
||||
visible.value = false
|
||||
emit('refreshDataList')
|
||||
}).catch(() => {
|
||||
canSubmit.value = true
|
||||
})
|
||||
}
|
||||
const dataFormSubmit = (submitType: string, force: any) => {
|
||||
if ((dataForm.zlshRemark == '' || !dataForm.zlshRemark) && submitType == '3') {
|
||||
message.error('请填写驳回理由');
|
||||
return;
|
||||
}
|
||||
dataForm.zlsh = submitType;
|
||||
canSubmit.value = false;
|
||||
dataForm.force = force;
|
||||
materialExam(dataForm)
|
||||
.then(() => {
|
||||
message.success('操作成功');
|
||||
visible.value = false;
|
||||
emit('refreshDataList');
|
||||
})
|
||||
.catch(() => {
|
||||
canSubmit.value = true;
|
||||
});
|
||||
};
|
||||
|
||||
// 初始化方法
|
||||
const init = (id: string | null) => {
|
||||
dataForm.id = id || ""
|
||||
visible.value = true
|
||||
canSubmit.value = true
|
||||
initData()
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields()
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
// 清空多图上传的列表
|
||||
houseList.value = []
|
||||
hkPicList.value = []
|
||||
Object.assign(dataForm, response.data)
|
||||
title.value = dataForm.serialNumber
|
||||
// avatar 模式直接使用 dataForm 中的字段,不需要 fileList
|
||||
// 多图上传需要初始化列表
|
||||
if (dataForm.housePic && dataForm.housePic != '') {
|
||||
const arr = dataForm.housePic.split(",").filter((item: string) => item && item.trim())
|
||||
arr.forEach((e: string) => {
|
||||
// 保存原始路径,显示时添加 baseUrl 前缀
|
||||
houseList.value.push({ url: baseUrl + e, name: '', originalUrl: e })
|
||||
})
|
||||
}
|
||||
if (dataForm.householdPic && dataForm.householdPic != '') {
|
||||
const arr2 = dataForm.householdPic.split(",").filter((item: string) => item && item.trim())
|
||||
arr2.forEach((e: string) => {
|
||||
// 保存原始路径,显示时添加 baseUrl 前缀
|
||||
hkPicList.value.push({ url: baseUrl + e, name: '', originalUrl: e })
|
||||
})
|
||||
}
|
||||
dataForm.id = id || '';
|
||||
visible.value = true;
|
||||
canSubmit.value = true;
|
||||
initData();
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.resetFields();
|
||||
if (dataForm.id) {
|
||||
getObj(dataForm.id).then((response: any) => {
|
||||
// 清空多图上传的列表
|
||||
houseList.value = [];
|
||||
hkPicList.value = [];
|
||||
Object.assign(dataForm, response.data);
|
||||
title.value = dataForm.serialNumber;
|
||||
// avatar 模式直接使用 dataForm 中的字段,不需要 fileList
|
||||
// 多图上传需要初始化列表
|
||||
if (dataForm.housePic && dataForm.housePic != '') {
|
||||
const arr = dataForm.housePic.split(',').filter((item: string) => item && item.trim());
|
||||
arr.forEach((e: string) => {
|
||||
// 保存原始路径,显示时添加 baseUrl 前缀
|
||||
houseList.value.push({ url: baseUrl + e, name: '', originalUrl: e });
|
||||
});
|
||||
}
|
||||
if (dataForm.householdPic && dataForm.householdPic != '') {
|
||||
const arr2 = dataForm.householdPic.split(',').filter((item: string) => item && item.trim());
|
||||
arr2.forEach((e: string) => {
|
||||
// 保存原始路径,显示时添加 baseUrl 前缀
|
||||
hkPicList.value.push({ url: baseUrl + e, name: '', originalUrl: e });
|
||||
});
|
||||
}
|
||||
|
||||
const educationPrefixMap: Record<string, string> = {
|
||||
'1': 'C', // 初中
|
||||
'2': 'G', // 高中
|
||||
'3': 'J' // 技职校
|
||||
}
|
||||
const prefix = educationPrefixMap[String(dataForm.degreeOfEducation)]
|
||||
if (prefix) {
|
||||
title.value = prefix + title.value
|
||||
}
|
||||
contactNameflag.value = false
|
||||
const auditStatusConfig = getStatusConfig(auditStatusList, dataForm.auditStatus)
|
||||
if (auditStatusConfig) {
|
||||
title.value = auditStatusConfig.label + " " + title.value
|
||||
if (auditStatusConfig.value == '20') {
|
||||
contactNameflag.value = true
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
const educationPrefixMap: Record<string, string> = {
|
||||
'1': 'C', // 初中
|
||||
'2': 'G', // 高中
|
||||
'3': 'J', // 技职校
|
||||
};
|
||||
const prefix = educationPrefixMap[String(dataForm.degreeOfEducation)];
|
||||
if (prefix) {
|
||||
title.value = prefix + title.value;
|
||||
}
|
||||
contactNameflag.value = false;
|
||||
const auditStatusConfig = getStatusConfig(auditStatusList, dataForm.auditStatus);
|
||||
if (auditStatusConfig) {
|
||||
title.value = auditStatusConfig.label + ' ' + title.value;
|
||||
if (auditStatusConfig.value == '20') {
|
||||
contactNameflag.value = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.el-form{
|
||||
.el-form-item:last-of-type{
|
||||
margin-bottom:18px!important;
|
||||
}
|
||||
}
|
||||
.el-form {
|
||||
.el-form-item:last-of-type {
|
||||
margin-bottom: 18px !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
.avatar-uploader {
|
||||
:deep(.el-upload) {
|
||||
border: 1px dashed var(--el-border-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: var(--el-transition-duration-fast);
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
.avatar-uploader {
|
||||
:deep(.el-upload) {
|
||||
border: 1px dashed var(--el-border-color);
|
||||
border-radius: 6px;
|
||||
cursor: pointer;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
transition: var(--el-transition-duration-fast);
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
&:hover {
|
||||
border-color: var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.avatar-uploader-icon {
|
||||
font-size: 28px;
|
||||
color: #8c939d;
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
line-height: 148px;
|
||||
text-align: center;
|
||||
}
|
||||
.avatar-uploader-icon {
|
||||
font-size: 28px;
|
||||
color: #8c939d;
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
line-height: 148px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.avatar-wrapper {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
.avatar {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.avatar-wrapper {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
.avatar {
|
||||
width: 148px;
|
||||
height: 148px;
|
||||
display: block;
|
||||
object-fit: cover;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,443 +1,428 @@
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option
|
||||
v-for="item in planList"
|
||||
:key="item.id"
|
||||
:label="item.groupName"
|
||||
:value="item.id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="唯一号/姓名/身份证号" prop="search">
|
||||
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="异动审核" prop="isMajorChange">
|
||||
<el-select v-model="queryForm.isMajorChange" filterable clearable placeholder="请选择异动审核">
|
||||
<el-option
|
||||
v-for="item in majorChangeList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<el-form :model="queryForm" inline ref="searchFormRef">
|
||||
<el-form-item label="招生计划" prop="groupId">
|
||||
<el-select v-model="queryForm.groupId" filterable clearable placeholder="请选择招生计划">
|
||||
<el-option v-for="item in planList" :key="item.id" :label="item.groupName" :value="item.id" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="唯一号/姓名/身份证号" prop="search">
|
||||
<el-input v-model="queryForm.search" clearable placeholder="唯一号/姓名/身份证号/学校名称" />
|
||||
</el-form-item>
|
||||
<el-form-item label="异动审核" prop="isMajorChange">
|
||||
<el-select v-model="queryForm.isMajorChange" filterable clearable placeholder="请选择异动审核">
|
||||
<el-option v-for="item in majorChangeList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="type" label="异动类型" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getTypeLabel(scope.row.type) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="姓名[唯一号]" min-width="160" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="majorChangeInfo" label="专业变更情况" min-width="180" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<DetailPopover
|
||||
v-if="scope.row.newMajorInfo || scope.row.oldMajorInfo"
|
||||
title="专业变更详情"
|
||||
:title-icon="InfoFilled"
|
||||
:width="320"
|
||||
:items="(() => {
|
||||
const items = []
|
||||
if (scope.row.newMajorInfo) {
|
||||
items.push({ label: '新专业', content: scope.row.newMajorInfo, contentClass: 'new-major' })
|
||||
}
|
||||
if (scope.row.oldMajorInfo) {
|
||||
items.push({ label: '旧专业', content: scope.row.oldMajorInfo })
|
||||
}
|
||||
return items
|
||||
})()">
|
||||
<template #reference>
|
||||
<span class="major-change-link">
|
||||
{{ scope.row.newMajorInfo || '查看详情' }}
|
||||
<el-icon class="title-icon"><InfoFilled /></el-icon>
|
||||
</span>
|
||||
</template>
|
||||
</DetailPopover>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="代办费变更情况" min-width="130" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span class="new-fee">{{ scope.row.newAgencyFee }}</span> / <span class="old-fee">{{ scope.row.oldAgencyFee }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="学费变更情况" min-width="140" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span class="new-fee">{{ scope.row.newFeeTuition }}</span> / <span class="old-fee">{{ scope.row.oldFeeTuition }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="分数变更情况" min-width="130" align="center">
|
||||
<template #default="scope">
|
||||
<span class="new-fee">{{ scope.row.newCorrectedScore }}</span> / <span class="old-fee">{{ scope.row.oldCorrectedScore }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createBy" label="异动发起人" min-width="120" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createTime" label="异动时间" min-width="180" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="isMajorChange" label="异动审核" min-width="110" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<template v-if="getStatusConfig(auditStateOptions, scope.row.isMajorChange)">
|
||||
<!-- 有备注信息时,使用 popover 包裹 ClickableTag -->
|
||||
<DetailPopover
|
||||
v-if="scope.row.remarks"
|
||||
title="异动审核详情"
|
||||
:width="300"
|
||||
:items="[
|
||||
{
|
||||
label: '审核状态',
|
||||
layout: 'horizontal',
|
||||
content: getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label
|
||||
},
|
||||
{
|
||||
label: '备注信息',
|
||||
content: scope.row.remarks,
|
||||
contentClass: 'reason-content'
|
||||
}
|
||||
]">
|
||||
<template #reference>
|
||||
<ClickableTag
|
||||
width="80"
|
||||
:type="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.type || 'info'"
|
||||
:left-icon="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.icon">
|
||||
{{ getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
<template #content-0>
|
||||
<ClickableTag
|
||||
:type="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.type || 'info'"
|
||||
:left-icon="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.icon"
|
||||
:right-icon="null">
|
||||
{{ getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
<template #content-1>
|
||||
<div class="reason-content">
|
||||
<el-icon class="reason-icon"><Warning /></el-icon>
|
||||
<span>{{ scope.row.remarks }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</DetailPopover>
|
||||
|
||||
<!-- 没有备注信息时,直接显示 ClickableTag -->
|
||||
<ClickableTag
|
||||
v-else
|
||||
width="80"
|
||||
:type="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.type || 'info'"
|
||||
:left-icon="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.icon"
|
||||
:right-icon="null">
|
||||
{{ getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
|
||||
<!-- 无状态 -->
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="100" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnover_edit') && scope.row.isMajorChange == '1'"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="majorchange(scope.row.id, scope.row.groupId)"
|
||||
>
|
||||
审核
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="type" label="异动类型" width="100" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
{{ getTypeLabel(scope.row.type) }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="name" label="姓名[唯一号]" min-width="160" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="majorChangeInfo" label="专业变更情况" min-width="180" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<DetailPopover
|
||||
v-if="scope.row.newMajorInfo || scope.row.oldMajorInfo"
|
||||
title="专业变更详情"
|
||||
:title-icon="InfoFilled"
|
||||
:width="320"
|
||||
:items="
|
||||
(() => {
|
||||
const items = [];
|
||||
if (scope.row.newMajorInfo) {
|
||||
items.push({ label: '新专业', content: scope.row.newMajorInfo, contentClass: 'new-major' });
|
||||
}
|
||||
if (scope.row.oldMajorInfo) {
|
||||
items.push({ label: '旧专业', content: scope.row.oldMajorInfo });
|
||||
}
|
||||
return items;
|
||||
})()
|
||||
"
|
||||
>
|
||||
<template #reference>
|
||||
<span class="major-change-link">
|
||||
{{ scope.row.newMajorInfo || '查看详情' }}
|
||||
<el-icon class="title-icon"><InfoFilled /></el-icon>
|
||||
</span>
|
||||
</template>
|
||||
</DetailPopover>
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="代办费变更情况" min-width="130" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span class="new-fee">{{ scope.row.newAgencyFee }}</span> / <span class="old-fee">{{ scope.row.oldAgencyFee }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="学费变更情况" min-width="140" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<span class="new-fee">{{ scope.row.newFeeTuition }}</span> / <span class="old-fee">{{ scope.row.oldFeeTuition }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="分数变更情况" min-width="130" align="center">
|
||||
<template #default="scope">
|
||||
<span class="new-fee">{{ scope.row.newCorrectedScore }}</span> / <span class="old-fee">{{ scope.row.oldCorrectedScore }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column prop="createBy" label="异动发起人" min-width="120" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createTime" label="异动时间" min-width="180" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="isMajorChange" label="异动审核" min-width="110" align="center" show-overflow-tooltip>
|
||||
<template #default="scope">
|
||||
<template v-if="getStatusConfig(auditStateOptions, scope.row.isMajorChange)">
|
||||
<!-- 有备注信息时,使用 popover 包裹 ClickableTag -->
|
||||
<DetailPopover
|
||||
v-if="scope.row.remarks"
|
||||
title="异动审核详情"
|
||||
:width="300"
|
||||
:items="[
|
||||
{
|
||||
label: '审核状态',
|
||||
layout: 'horizontal',
|
||||
content: getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label,
|
||||
},
|
||||
{
|
||||
label: '备注信息',
|
||||
content: scope.row.remarks,
|
||||
contentClass: 'reason-content',
|
||||
},
|
||||
]"
|
||||
>
|
||||
<template #reference>
|
||||
<ClickableTag
|
||||
width="80"
|
||||
:type="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.type || 'info'"
|
||||
:left-icon="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.icon"
|
||||
>
|
||||
{{ getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
<template #content-0>
|
||||
<ClickableTag
|
||||
:type="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.type || 'info'"
|
||||
:left-icon="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.icon"
|
||||
:right-icon="null"
|
||||
>
|
||||
{{ getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
<template #content-1>
|
||||
<div class="reason-content">
|
||||
<el-icon class="reason-icon"><Warning /></el-icon>
|
||||
<span>{{ scope.row.remarks }}</span>
|
||||
</div>
|
||||
</template>
|
||||
</DetailPopover>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 没有备注信息时,直接显示 ClickableTag -->
|
||||
<ClickableTag
|
||||
v-else
|
||||
width="80"
|
||||
:type="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.type || 'info'"
|
||||
:left-icon="getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.icon"
|
||||
:right-icon="null"
|
||||
>
|
||||
{{ getStatusConfig(auditStateOptions, scope.row.isMajorChange)?.label }}
|
||||
</ClickableTag>
|
||||
</template>
|
||||
|
||||
<!-- 异动审核弹窗 -->
|
||||
<el-dialog v-model="majorChangeVisible" title="异动审核" width="600px">
|
||||
<el-form :model="exarmForm" ref="exarmFormRef" label-width="100px" :rules="dataRule">
|
||||
<el-form-item label="审核结果" prop="isMajorChange">
|
||||
<el-select v-model="exarmForm.isMajorChange" filterable clearable placeholder="请选择审核结果">
|
||||
<el-option
|
||||
v-for="item in isMajorChangeList"
|
||||
:key="item.value"
|
||||
:label="item.label"
|
||||
:value="item.value"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="审核意见" prop="remarks">
|
||||
<el-input
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
style="width: 100%"
|
||||
v-model="exarmForm.remarks"
|
||||
maxlength="20"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="cancelPlace">取消</el-button>
|
||||
<el-button type="primary" @click="update(false)">保存</el-button>
|
||||
<el-button type="warning" @click="update(true)" v-auth="'recruit_signup_change_force'">强制保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 无状态 -->
|
||||
<span v-else class="empty-text">-</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="100" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnover_edit') && scope.row.isMajorChange == '1'"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="majorchange(scope.row.id, scope.row.groupId)"
|
||||
>
|
||||
审核
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 异动审核弹窗 -->
|
||||
<el-dialog v-model="majorChangeVisible" title="异动审核" width="600px">
|
||||
<el-form :model="exarmForm" ref="exarmFormRef" label-width="100px" :rules="dataRule">
|
||||
<el-form-item label="审核结果" prop="isMajorChange">
|
||||
<el-select v-model="exarmForm.isMajorChange" filterable clearable placeholder="请选择审核结果">
|
||||
<el-option v-for="item in isMajorChangeList" :key="item.value" :label="item.label" :value="item.value" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="审核意见" prop="remarks">
|
||||
<el-input
|
||||
type="textarea"
|
||||
placeholder="请输入审核意见"
|
||||
:autosize="{ minRows: 2, maxRows: 4 }"
|
||||
style="width: 100%"
|
||||
v-model="exarmForm.remarks"
|
||||
maxlength="20"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="cancelPlace">取消</el-button>
|
||||
<el-button type="primary" @click="update(false)">保存</el-button>
|
||||
<el-button type="warning" @click="update(true)" v-auth="'recruit_signup_change_force'">强制保存</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignupturnover">
|
||||
import { ref, reactive, computed, onMounted } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { fetchList, putObj } from '/@/api/recruit/recruitstudentsignupturnover'
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup'
|
||||
import ClickableTag from '/@/components/ClickableTag/index.vue'
|
||||
import DetailPopover from '/@/components/DetailPopover/index.vue'
|
||||
import { Warning, InfoFilled } from '@element-plus/icons-vue'
|
||||
import { TURNOVER_AUDIT_STATUS_LIST, getStatusConfig } from '/@/config/global'
|
||||
import { getDicts } from '/@/api/admin/dict'
|
||||
import { ref, reactive, computed, onMounted } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { fetchList, putObj } from '/@/api/recruit/recruitstudentsignupturnover';
|
||||
import { getList } from '/@/api/recruit/recruitstudentplangroup';
|
||||
import ClickableTag from '/@/components/ClickableTag/index.vue';
|
||||
import DetailPopover from '/@/components/DetailPopover/index.vue';
|
||||
import { Warning, InfoFilled } from '@element-plus/icons-vue';
|
||||
import { TURNOVER_AUDIT_STATUS_LIST, getStatusConfig } from '/@/config/global';
|
||||
import { getDicts } from '/@/api/admin/dict';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const searchFormRef = ref()
|
||||
const exarmFormRef = ref()
|
||||
const tableRef = ref();
|
||||
const searchFormRef = ref();
|
||||
const exarmFormRef = ref();
|
||||
|
||||
// 弹窗状态
|
||||
const majorChangeVisible = ref(false)
|
||||
const majorChangeVisible = ref(false);
|
||||
|
||||
// 数据
|
||||
const planList = ref<any[]>([])
|
||||
const planList = ref<any[]>([]);
|
||||
// 使用字典 recruit_change_type
|
||||
const typeList = ref<any[]>([])
|
||||
const typeList = ref<any[]>([]);
|
||||
|
||||
// 审核状态选项配置(用于 ClickableTag 组件和检索条件)
|
||||
const auditStateOptions = ref<any[]>(TURNOVER_AUDIT_STATUS_LIST)
|
||||
const auditStateOptions = ref<any[]>(TURNOVER_AUDIT_STATUS_LIST);
|
||||
|
||||
// 从 auditStateOptions 派生检索条件列表(只包含 label 和 value)
|
||||
const majorChangeList = computed(() => {
|
||||
return auditStateOptions.value.map(item => ({
|
||||
label: item.label,
|
||||
value: item.value
|
||||
}))
|
||||
})
|
||||
return auditStateOptions.value.map((item) => ({
|
||||
label: item.label,
|
||||
value: item.value,
|
||||
}));
|
||||
});
|
||||
|
||||
// 审核弹窗中的选项(只包含通过和驳回)
|
||||
const isMajorChangeList = computed(() => {
|
||||
return auditStateOptions.value
|
||||
.filter(item => item.value !== '1')
|
||||
.map(item => ({
|
||||
label: item.label,
|
||||
value: item.value
|
||||
}))
|
||||
})
|
||||
return auditStateOptions.value
|
||||
.filter((item) => item.value !== '1')
|
||||
.map((item) => ({
|
||||
label: item.label,
|
||||
value: item.value,
|
||||
}));
|
||||
});
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive({
|
||||
groupId: '',
|
||||
search: '',
|
||||
isMajorChange: ''
|
||||
})
|
||||
groupId: '',
|
||||
search: '',
|
||||
isMajorChange: '',
|
||||
});
|
||||
|
||||
// 审核表单
|
||||
const exarmForm = reactive({
|
||||
id: '',
|
||||
isMajorChange: '',
|
||||
examRemark: '',
|
||||
groupId: '',
|
||||
remarks: '',
|
||||
force:false
|
||||
})
|
||||
id: '',
|
||||
isMajorChange: '',
|
||||
examRemark: '',
|
||||
groupId: '',
|
||||
remarks: '',
|
||||
force: false,
|
||||
});
|
||||
|
||||
// 表单验证规则
|
||||
const dataRule = {
|
||||
isMajorChange: [
|
||||
{ required: true, message: '请选择审核结果', trigger: 'change' }
|
||||
]
|
||||
}
|
||||
isMajorChange: [{ required: true, message: '请选择审核结果', trigger: 'change' }],
|
||||
};
|
||||
|
||||
// 获取异动类型标签
|
||||
const getTypeLabel = (type: string) => {
|
||||
const item = typeList.value.find((it: any) => String(it.value) === String(type))
|
||||
return item ? item.label : ''
|
||||
}
|
||||
|
||||
const item = typeList.value.find((it: any) => String(it.value) === String(type));
|
||||
return item ? item.label : '';
|
||||
};
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
},
|
||||
createdIsNeed: false
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
createdIsNeed: false,
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 初始化
|
||||
const init = async () => {
|
||||
try {
|
||||
const data = await getList()
|
||||
planList.value = data.data || []
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
const typeData = await getDicts('recruit_change_type')
|
||||
typeList.value = typeData.data || []
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('初始化失败', error)
|
||||
}
|
||||
}
|
||||
try {
|
||||
const data = await getList();
|
||||
planList.value = data.data || [];
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
const typeData = await getDicts('recruit_change_type');
|
||||
typeList.value = typeData.data || [];
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log('初始化失败', error);
|
||||
}
|
||||
};
|
||||
|
||||
// 打开审核弹窗
|
||||
const majorchange = (id: string, groupId: string) => {
|
||||
exarmForm.id = id
|
||||
exarmForm.groupId = groupId
|
||||
exarmForm.isMajorChange = ''
|
||||
exarmForm.remarks = ''
|
||||
majorChangeVisible.value = true
|
||||
}
|
||||
exarmForm.id = id;
|
||||
exarmForm.groupId = groupId;
|
||||
exarmForm.isMajorChange = '';
|
||||
exarmForm.remarks = '';
|
||||
majorChangeVisible.value = true;
|
||||
};
|
||||
|
||||
// 取消审核
|
||||
const cancelPlace = () => {
|
||||
majorChangeVisible.value = false
|
||||
}
|
||||
majorChangeVisible.value = false;
|
||||
};
|
||||
|
||||
// 保存审核
|
||||
const update = async (force:any) => {
|
||||
try {
|
||||
const valid = await exarmFormRef.value?.validate().catch(() => {})
|
||||
if (!valid) return
|
||||
exarmForm.force=force
|
||||
await putObj(exarmForm)
|
||||
message.success('审核成功')
|
||||
majorChangeVisible.value = false
|
||||
getDataList()
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(error)
|
||||
}
|
||||
}
|
||||
const update = async (force: any) => {
|
||||
try {
|
||||
const valid = await exarmFormRef.value?.validate().catch(() => {});
|
||||
if (!valid) return;
|
||||
exarmForm.force = force;
|
||||
await putObj(exarmForm);
|
||||
message.success('审核成功');
|
||||
majorChangeVisible.value = false;
|
||||
getDataList();
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(error);
|
||||
}
|
||||
};
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
searchFormRef.value?.resetFields()
|
||||
queryForm.groupId = ''
|
||||
queryForm.search = ''
|
||||
queryForm.isMajorChange = ''
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id
|
||||
}
|
||||
getDataList()
|
||||
}
|
||||
searchFormRef.value?.resetFields();
|
||||
queryForm.groupId = '';
|
||||
queryForm.search = '';
|
||||
queryForm.isMajorChange = '';
|
||||
if (planList.value.length > 0) {
|
||||
queryForm.groupId = planList.value[0].id;
|
||||
}
|
||||
getDataList();
|
||||
};
|
||||
|
||||
onMounted(() => {
|
||||
init()
|
||||
})
|
||||
init();
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.new-fee {
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 600;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.old-fee {
|
||||
text-decoration: line-through;
|
||||
color: #606266;
|
||||
font-size: 13px;
|
||||
margin-left: 4px;
|
||||
text-decoration: line-through;
|
||||
color: #606266;
|
||||
font-size: 13px;
|
||||
margin-left: 4px;
|
||||
}
|
||||
|
||||
.empty-text {
|
||||
color: #909399;
|
||||
color: #909399;
|
||||
}
|
||||
|
||||
// 备注内容样式(用于 DetailPopover 的插槽内容)
|
||||
.reason-content {
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
padding: 12px;
|
||||
background-color: #fef0f0;
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid #f56c6c;
|
||||
|
||||
.reason-icon {
|
||||
color: #f56c6c;
|
||||
font-size: 16px;
|
||||
flex-shrink: 0;
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
span {
|
||||
color: #f56c6c;
|
||||
line-height: 1.6;
|
||||
word-break: break-all;
|
||||
flex: 1;
|
||||
}
|
||||
display: flex;
|
||||
align-items: flex-start;
|
||||
gap: 8px;
|
||||
padding: 12px;
|
||||
background-color: #fef0f0;
|
||||
border-radius: 4px;
|
||||
border-left: 3px solid #f56c6c;
|
||||
|
||||
.reason-icon {
|
||||
color: #f56c6c;
|
||||
font-size: 16px;
|
||||
flex-shrink: 0;
|
||||
margin-top: 1px;
|
||||
}
|
||||
|
||||
span {
|
||||
color: #f56c6c;
|
||||
line-height: 1.6;
|
||||
word-break: break-all;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
|
||||
// 专业变更链接样式
|
||||
.major-change-link {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
color: var(--el-color-primary);
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
|
||||
&:hover {
|
||||
color: var(--el-color-primary-light-3);
|
||||
}
|
||||
.title-icon {
|
||||
color: var(--el-color-primary);
|
||||
}
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
color: var(--el-color-primary);
|
||||
text-decoration: underline;
|
||||
cursor: pointer;
|
||||
font-weight: 500;
|
||||
|
||||
&:hover {
|
||||
color: var(--el-color-primary-light-3);
|
||||
}
|
||||
.title-icon {
|
||||
color: var(--el-color-primary);
|
||||
}
|
||||
}
|
||||
|
||||
// 新专业样式(用于 DetailPopover 的内容类)
|
||||
.new-major {
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 500;
|
||||
color: var(--el-color-primary);
|
||||
font-weight: 500;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -1,173 +1,160 @@
|
||||
<template>
|
||||
<el-dialog
|
||||
v-model="visible"
|
||||
:title="dataForm.id ? '编辑' : '新增'"
|
||||
width="600px"
|
||||
:close-on-click-modal="false"
|
||||
destroy-on-close
|
||||
append-to-body
|
||||
>
|
||||
<el-form
|
||||
ref="dataFormRef"
|
||||
:model="dataForm"
|
||||
:rules="dataRules"
|
||||
label-width="120px"
|
||||
>
|
||||
<el-form-item label="异动ID" prop="turnOverId">
|
||||
<el-input v-model="dataForm.turnOverId" placeholder="请输入异动ID" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="退补类型" prop="type">
|
||||
<el-select v-model="dataForm.type" placeholder="请选择退补类型" clearable>
|
||||
<el-option label="学费" value="1" />
|
||||
<el-option label="代办费" value="2" />
|
||||
<el-option label="捐资费" value="3" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="原费用" prop="oldFee">
|
||||
<el-input-number v-model="dataForm.oldFee" :min="0" :precision="2" placeholder="请输入原费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="变更后费用" prop="newFee">
|
||||
<el-input-number v-model="dataForm.newFee" :min="0" :precision="2" placeholder="请输入变更后费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="变更费用" prop="fee">
|
||||
<el-input-number v-model="dataForm.fee" :precision="2" placeholder="请输入变更费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="补还是退" prop="incOrDec">
|
||||
<el-select v-model="dataForm.incOrDec" placeholder="请选择补还是退" clearable>
|
||||
<el-option label="补" value="1" />
|
||||
<el-option label="退" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否推送" prop="pushed">
|
||||
<el-select v-model="dataForm.pushed" placeholder="请选择是否推送" clearable>
|
||||
<el-option label="是" value="1" />
|
||||
<el-option label="否" value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="推送失败原因" prop="pushFailReason">
|
||||
<el-input v-model="dataForm.pushFailReason" type="textarea" :rows="3" placeholder="请输入推送失败原因" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" :loading="submitLoading">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
<el-dialog v-model="visible" :title="dataForm.id ? '编辑' : '新增'" width="600px" :close-on-click-modal="false" destroy-on-close append-to-body>
|
||||
<el-form ref="dataFormRef" :model="dataForm" :rules="dataRules" label-width="120px">
|
||||
<el-form-item label="异动ID" prop="turnOverId">
|
||||
<el-input v-model="dataForm.turnOverId" placeholder="请输入异动ID" clearable />
|
||||
</el-form-item>
|
||||
<el-form-item label="退补类型" prop="type">
|
||||
<el-select v-model="dataForm.type" placeholder="请选择退补类型" clearable>
|
||||
<el-option label="学费" value="1" />
|
||||
<el-option label="代办费" value="2" />
|
||||
<el-option label="捐资费" value="3" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="原费用" prop="oldFee">
|
||||
<el-input-number v-model="dataForm.oldFee" :min="0" :precision="2" placeholder="请输入原费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="变更后费用" prop="newFee">
|
||||
<el-input-number v-model="dataForm.newFee" :min="0" :precision="2" placeholder="请输入变更后费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="变更费用" prop="fee">
|
||||
<el-input-number v-model="dataForm.fee" :precision="2" placeholder="请输入变更费用" />
|
||||
</el-form-item>
|
||||
<el-form-item label="补还是退" prop="incOrDec">
|
||||
<el-select v-model="dataForm.incOrDec" placeholder="请选择补还是退" clearable>
|
||||
<el-option label="补" value="1" />
|
||||
<el-option label="退" value="2" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="是否推送" prop="pushed">
|
||||
<el-select v-model="dataForm.pushed" placeholder="请选择是否推送" clearable>
|
||||
<el-option label="是" value="1" />
|
||||
<el-option label="否" value="0" />
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="推送失败原因" prop="pushFailReason">
|
||||
<el-input v-model="dataForm.pushFailReason" type="textarea" :rows="3" placeholder="请输入推送失败原因" clearable />
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
|
||||
<template #footer>
|
||||
<div class="dialog-footer">
|
||||
<el-button @click="visible = false">取消</el-button>
|
||||
<el-button type="primary" @click="dataFormSubmit" :loading="submitLoading">确定</el-button>
|
||||
</div>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive } from 'vue'
|
||||
import { useMessage } from '/@/hooks/message'
|
||||
import { addObj, putObj } from '/@/api/recruit/recruitstudentsignupturnovermoneychange'
|
||||
import { ref, reactive } from 'vue';
|
||||
import { useMessage } from '/@/hooks/message';
|
||||
import { addObj, putObj } from '/@/api/recruit/recruitstudentsignupturnovermoneychange';
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const message = useMessage();
|
||||
|
||||
// Emits
|
||||
const emit = defineEmits<{
|
||||
(e: 'refresh'): void
|
||||
}>()
|
||||
(e: 'refresh'): void;
|
||||
}>();
|
||||
|
||||
// 表单引用
|
||||
const dataFormRef = ref()
|
||||
const submitLoading = ref(false)
|
||||
const dataFormRef = ref();
|
||||
const submitLoading = ref(false);
|
||||
|
||||
// 弹窗显示状态
|
||||
const visible = ref(false)
|
||||
const visible = ref(false);
|
||||
|
||||
// 表单数据
|
||||
const dataForm = reactive({
|
||||
id: '',
|
||||
turnOverId: '',
|
||||
type: '',
|
||||
oldFee: undefined as number | undefined,
|
||||
newFee: undefined as number | undefined,
|
||||
fee: undefined as number | undefined,
|
||||
incOrDec: '',
|
||||
pushed: '',
|
||||
pushFailReason: ''
|
||||
})
|
||||
id: '',
|
||||
turnOverId: '',
|
||||
type: '',
|
||||
oldFee: undefined as number | undefined,
|
||||
newFee: undefined as number | undefined,
|
||||
fee: undefined as number | undefined,
|
||||
incOrDec: '',
|
||||
pushed: '',
|
||||
pushFailReason: '',
|
||||
});
|
||||
|
||||
// 表单验证规则
|
||||
const dataRules = {}
|
||||
const dataRules = {};
|
||||
|
||||
// 初始化
|
||||
const init = (row?: any) => {
|
||||
visible.value = true
|
||||
submitLoading.value = false
|
||||
|
||||
// 重置表单
|
||||
dataForm.id = ''
|
||||
dataForm.turnOverId = ''
|
||||
dataForm.type = ''
|
||||
dataForm.oldFee = undefined
|
||||
dataForm.newFee = undefined
|
||||
dataForm.fee = undefined
|
||||
dataForm.incOrDec = ''
|
||||
dataForm.pushed = ''
|
||||
dataForm.pushFailReason = ''
|
||||
|
||||
// 如果是编辑,填充数据
|
||||
if (row && row.id) {
|
||||
dataForm.id = row.id || ''
|
||||
dataForm.turnOverId = row.turnOverId || ''
|
||||
dataForm.type = row.type || ''
|
||||
dataForm.oldFee = row.oldFee
|
||||
dataForm.newFee = row.newFee
|
||||
dataForm.fee = row.fee
|
||||
dataForm.incOrDec = row.incOrDec || ''
|
||||
dataForm.pushed = row.pushed || ''
|
||||
dataForm.pushFailReason = row.pushFailReason || ''
|
||||
}
|
||||
|
||||
// 清除验证
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.clearValidate()
|
||||
})
|
||||
}
|
||||
visible.value = true;
|
||||
submitLoading.value = false;
|
||||
|
||||
// 重置表单
|
||||
dataForm.id = '';
|
||||
dataForm.turnOverId = '';
|
||||
dataForm.type = '';
|
||||
dataForm.oldFee = undefined;
|
||||
dataForm.newFee = undefined;
|
||||
dataForm.fee = undefined;
|
||||
dataForm.incOrDec = '';
|
||||
dataForm.pushed = '';
|
||||
dataForm.pushFailReason = '';
|
||||
|
||||
// 如果是编辑,填充数据
|
||||
if (row && row.id) {
|
||||
dataForm.id = row.id || '';
|
||||
dataForm.turnOverId = row.turnOverId || '';
|
||||
dataForm.type = row.type || '';
|
||||
dataForm.oldFee = row.oldFee;
|
||||
dataForm.newFee = row.newFee;
|
||||
dataForm.fee = row.fee;
|
||||
dataForm.incOrDec = row.incOrDec || '';
|
||||
dataForm.pushed = row.pushed || '';
|
||||
dataForm.pushFailReason = row.pushFailReason || '';
|
||||
}
|
||||
|
||||
// 清除验证
|
||||
nextTick(() => {
|
||||
dataFormRef.value?.clearValidate();
|
||||
});
|
||||
};
|
||||
|
||||
// 提交表单
|
||||
const dataFormSubmit = async () => {
|
||||
if (!dataFormRef.value) return
|
||||
|
||||
await dataFormRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true
|
||||
try {
|
||||
if (dataForm.id) {
|
||||
await putObj(dataForm)
|
||||
message.success('修改成功')
|
||||
} else {
|
||||
await addObj(dataForm)
|
||||
message.success('添加成功')
|
||||
}
|
||||
visible.value = false
|
||||
emit('refresh')
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '操作失败')
|
||||
} finally {
|
||||
submitLoading.value = false
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
if (!dataFormRef.value) return;
|
||||
|
||||
await dataFormRef.value.validate(async (valid: boolean) => {
|
||||
if (valid) {
|
||||
submitLoading.value = true;
|
||||
try {
|
||||
if (dataForm.id) {
|
||||
await putObj(dataForm);
|
||||
message.success('修改成功');
|
||||
} else {
|
||||
await addObj(dataForm);
|
||||
message.success('添加成功');
|
||||
}
|
||||
visible.value = false;
|
||||
emit('refresh');
|
||||
} catch (error: any) {
|
||||
message.error(error.msg || '操作失败');
|
||||
} finally {
|
||||
submitLoading.value = false;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// 暴露方法给父组件
|
||||
defineExpose({
|
||||
init
|
||||
})
|
||||
init,
|
||||
});
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.w-full {
|
||||
width: 100%;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.dialog-footer {
|
||||
text-align: right;
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
@@ -16,162 +16,154 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<!-- <el-form :model="queryForm" inline>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<!-- 搜索表单 -->
|
||||
<!-- <el-form :model="queryForm" inline>
|
||||
<el-form-item>
|
||||
<el-button type="primary" icon="Search" @click="getDataList">查询</el-button>
|
||||
<el-button icon="Refresh" class="ml10" @click="resetQuery">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form> -->
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<el-row>
|
||||
<div>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnovermoneychange_add')"
|
||||
type="primary"
|
||||
icon="FolderAdd"
|
||||
@click="handleAdd">新 增
|
||||
</el-button>
|
||||
</div>
|
||||
</el-row>
|
||||
<!-- 操作按钮 -->
|
||||
<el-row>
|
||||
<div>
|
||||
<el-button v-if="hasAuth('recruit_recruitstudentsignupturnovermoneychange_add')" type="primary" icon="FolderAdd" @click="handleAdd"
|
||||
>新 增
|
||||
</el-button>
|
||||
</div>
|
||||
</el-row>
|
||||
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="turnOverId" label="异动ID" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="type" label="退补类型 1:学费 2:代办费 3:捐资费" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="oldFee" label="原费用" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="newFee" label="变更后费用" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fee" label="变更费用" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="incOrDec" label="补还是退 1:补 2:退" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="pushed" label="是否推送,预留字段,单项推送则需要该字段" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="pushFailReason" label="推送失败原因" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createBy" label="创建者" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createDate" label="创建时间" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnovermoneychange_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleEdit(scope.row)"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnovermoneychange_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 表格 -->
|
||||
<el-table
|
||||
ref="tableRef"
|
||||
:data="state.dataList"
|
||||
v-loading="state.loading"
|
||||
border
|
||||
stripe
|
||||
row-key="id"
|
||||
:cell-style="tableStyle.cellStyle"
|
||||
:header-cell-style="tableStyle.headerCellStyle"
|
||||
>
|
||||
<el-table-column type="index" label="序号" width="60" align="center" />
|
||||
<el-table-column prop="turnOverId" label="异动ID" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="type" label="退补类型 1:学费 2:代办费 3:捐资费" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="oldFee" label="原费用" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="newFee" label="变更后费用" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="fee" label="变更费用" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="incOrDec" label="补还是退 1:补 2:退" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="pushed" label="是否推送,预留字段,单项推送则需要该字段" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="pushFailReason" label="推送失败原因" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createBy" label="创建者" align="center" show-overflow-tooltip />
|
||||
<el-table-column prop="createDate" label="创建时间" align="center" show-overflow-tooltip />
|
||||
<el-table-column label="操作" width="150" align="center" fixed="right">
|
||||
<template #default="scope">
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnovermoneychange_edit')"
|
||||
type="primary"
|
||||
link
|
||||
icon="EditPen"
|
||||
@click="handleEdit(scope.row)"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button
|
||||
v-if="hasAuth('recruit_recruitstudentsignupturnovermoneychange_del')"
|
||||
type="danger"
|
||||
link
|
||||
icon="Delete"
|
||||
@click="handleDel(scope.row)"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<!-- 分页 -->
|
||||
<pagination
|
||||
v-bind="state.pagination"
|
||||
@current-change="currentChangeHandle"
|
||||
@size-change="sizeChangeHandle"
|
||||
/>
|
||||
<!-- 分页 -->
|
||||
<pagination v-bind="state.pagination" @current-change="currentChangeHandle" @size-change="sizeChangeHandle" />
|
||||
|
||||
<!-- 新增/编辑弹窗 -->
|
||||
<FormDialog ref="formDialogRef" @refresh="getDataList"></FormDialog>
|
||||
</div>
|
||||
</div>
|
||||
<!-- 新增/编辑弹窗 -->
|
||||
<FormDialog ref="formDialogRef" @refresh="getDataList"></FormDialog>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="recruitstudentsignupturnovermoneychange">
|
||||
import { ref, reactive, defineAsyncComponent, nextTick } from 'vue'
|
||||
import { useAuth } from '/@/hooks/auth'
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table'
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message'
|
||||
import { delObj, fetchList } from '/@/api/recruit/recruitstudentsignupturnovermoneychange'
|
||||
import { ref, reactive, defineAsyncComponent, nextTick } from 'vue';
|
||||
import { useAuth } from '/@/hooks/auth';
|
||||
import { BasicTableProps, useTable } from '/@/hooks/table';
|
||||
import { useMessage, useMessageBox } from '/@/hooks/message';
|
||||
import { delObj, fetchList } from '/@/api/recruit/recruitstudentsignupturnovermoneychange';
|
||||
|
||||
const { hasAuth } = useAuth()
|
||||
const { hasAuth } = useAuth();
|
||||
// 定义组件
|
||||
const FormDialog = defineAsyncComponent(() => import('./form.vue'))
|
||||
const FormDialog = defineAsyncComponent(() => import('./form.vue'));
|
||||
|
||||
// 消息提示 hooks
|
||||
const message = useMessage()
|
||||
const messageBox = useMessageBox()
|
||||
const message = useMessage();
|
||||
const messageBox = useMessageBox();
|
||||
|
||||
// 表格引用
|
||||
const tableRef = ref()
|
||||
const formDialogRef = ref()
|
||||
const tableRef = ref();
|
||||
const formDialogRef = ref();
|
||||
|
||||
// 查询表单
|
||||
const queryForm = reactive<Record<string, any>>({})
|
||||
const queryForm = reactive<Record<string, any>>({});
|
||||
|
||||
// 表格状态
|
||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params)
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
queryForm: queryForm,
|
||||
pageList: async (params: any) => {
|
||||
const response = await fetchList(params);
|
||||
return {
|
||||
data: {
|
||||
records: response.data.records,
|
||||
total: response.data.total,
|
||||
},
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
// 使用 table hook
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state)
|
||||
const { getDataList, currentChangeHandle, sizeChangeHandle, tableStyle } = useTable(state);
|
||||
|
||||
// 重置查询
|
||||
const resetQuery = () => {
|
||||
Object.keys(queryForm).forEach(key => {
|
||||
queryForm[key] = ''
|
||||
})
|
||||
getDataList()
|
||||
}
|
||||
Object.keys(queryForm).forEach((key) => {
|
||||
queryForm[key] = '';
|
||||
});
|
||||
getDataList();
|
||||
};
|
||||
|
||||
// 新增
|
||||
const handleAdd = () => {
|
||||
nextTick(() => {
|
||||
formDialogRef.value?.init()
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
formDialogRef.value?.init();
|
||||
});
|
||||
};
|
||||
|
||||
// 编辑
|
||||
const handleEdit = (row: any) => {
|
||||
nextTick(() => {
|
||||
formDialogRef.value?.init(row)
|
||||
})
|
||||
}
|
||||
nextTick(() => {
|
||||
formDialogRef.value?.init(row);
|
||||
});
|
||||
};
|
||||
|
||||
// 删除
|
||||
const handleDel = async (row: any) => {
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除ID为${row.id}的记录?`)
|
||||
await delObj(row.id)
|
||||
message.success('删除成功')
|
||||
getDataList()
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
}
|
||||
try {
|
||||
await messageBox.confirm(`是否确认删除ID为${row.id}的记录?`);
|
||||
await delObj(row.id);
|
||||
message.success('删除成功');
|
||||
getDataList();
|
||||
} catch {
|
||||
// 用户取消
|
||||
}
|
||||
};
|
||||
|
||||
// 表格数据由 useTable(createdIsNeed 默认 true)在挂载时自动请求
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
</style>
|
||||
<style lang="scss" scoped></style>
|
||||
|
||||
@@ -16,15 +16,13 @@
|
||||
-->
|
||||
|
||||
<template>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<iframe style="width:100%;height:700px;" src="https://zhxy.czjsy.com/2023zzzc.pdf"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
<div class="layout-padding">
|
||||
<div class="layout-padding-auto layout-padding-view">
|
||||
<iframe style="width: 100%; height: 700px" src="https://zhxy.czjsy.com/2023zzzc.pdf"></iframe>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts" name="zizhu">
|
||||
</script>
|
||||
<script setup lang="ts" name="zizhu"></script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
</style>
|
||||
<style scoped lang="scss"></style>
|
||||
|
||||
Reference in New Issue
Block a user