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('操作成功');
|
||||
|
||||
Reference in New Issue
Block a user