提交学生花名册

This commit is contained in:
zlwu committed 2025-08-01 20:26:15 +08:00
1 parent a6b8eb06dd
commit 38a1234dcb
7 files changed
+1261 -30

No files matched your search

+2 -1
View File
@@ -6,7 +6,7 @@ import auth from './auth';
// 预设动画
import animate from '@/animate';
import { download as dl } from '@/utils/request';
import { download as dl, downloadJson as dlJson } from '@/utils/request';
import { useDict } from '@/utils/dict';
import { getConfigKey, updateConfigByKey } from '@/api/system/config';
import { parseTime, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi';
@@ -34,6 +34,7 @@ export default function installPlugin(app: App) {
app.config.globalProperties.getConfigKey = getConfigKey;
app.config.globalProperties.updateConfigByKey = updateConfigByKey;
app.config.globalProperties.download = dl;
app.config.globalProperties.downloadJson = dlJson;
app.config.globalProperties.parseTime = parseTime;
app.config.globalProperties.handleTree = handleTree;
app.config.globalProperties.addDateRange = addDateRange;
+28
View File
@@ -215,5 +215,33 @@ export function download(url: string, params: any, fileName: string) {
downloadLoadingInstance.close();
});
}
// 通用下载方法(JSON格式入参)
export function downloadJson(url: string, params: any, fileName: string) {
downloadLoadingInstance = ElLoading.service({ text: '正在下载数据,请稍候', background: 'rgba(0, 0, 0, 0.7)' });
// prettier-ignore
return service.post(url, params, {
headers: { 'Content-Type': 'application/json;charset=utf-8' },
responseType: 'blob',
timeout: 1200000 // 导出接口单独设置20分钟超时
}).then(async (resp: any) => {
const isLogin = blobValidate(resp);
if (isLogin) {
const blob = new Blob([resp]);
FileSaver.saveAs(blob, fileName);
} else {
const blob = new Blob([resp]);
const resText = await blob.text();
const rspObj = JSON.parse(resText);
const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'];
ElMessage.error(errMsg);
}
downloadLoadingInstance.close();
}).catch((r: any) => {
console.error(r);
ElMessage.error('下载文件出现错误,请联系管理员!');
downloadLoadingInstance.close();
});
}
// 导出 axios 实例
export default service;
@@ -786,8 +786,24 @@ const handleReset = () => {
};
const handleSearch = () => {
// 构建查询参数
const searchParams: any = { ...formData };
// 先清空查询参数,只添加有效值
const searchParams: any = {};
// 只添加有值的基础字段
Object.keys(formData).forEach((key) => {
const value = formData[key];
if (value !== null && value !== undefined && value !== '') {
// 对于数组,检查是否有有效元素
if (Array.isArray(value)) {
const filteredArray = value.filter((item) => item !== null && item !== undefined && item !== '');
if (filteredArray.length > 0) {
searchParams[key] = filteredArray;
}
} else {
searchParams[key] = value;
}
}
});
// 处理日期范围参数
if (searchParams.birthDateRange && searchParams.birthDateRange.length === 2) {
+284 -17
View File
@@ -63,7 +63,7 @@
<div class="search-buttons">
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
<el-button type="info" icon="Setting" @click="showAdvancedSearch = true">高级检索</el-button>
<el-button type="info" icon="Setting" @click="handleShowAdvancedSearch">高级检索</el-button>
</div>
</el-col>
</el-row>
@@ -245,7 +245,7 @@
</template>
<script setup lang="ts">
import { ref, reactive, toRefs, watchEffect, onMounted, computed } from 'vue';
import { ref, reactive, toRefs, watchEffect, onMounted, computed, getCurrentInstance } from 'vue';
import ElMessage from 'element-plus/es/components/message/index';
import ElMessageBox from 'element-plus/es/components/message-box/index';
import { Search, Refresh, Setting, Download, List, Grid, View, Picture, Male, Female } from '@element-plus/icons-vue';
@@ -253,6 +253,8 @@ import AdvancedSearchDialog from './components/AdvancedSearchDialog.vue';
import StudentDetailDialog from './components/StudentDetailDialog.vue';
import api from '@/api/xg/xsjcxx/stuRoster/index';
const { proxy } = getCurrentInstance() as any;
// 响应式数据
const loading = ref(false);
const showSearch = ref(true);
@@ -290,6 +292,9 @@ const queryParams = reactive({
// 高级查询参数
const advancedQueryParams = reactive({
// 基础信息
studentNo: '',
name: '',
phone: '',
idCard: '',
nameEnglish: '',
formerName: '',
@@ -314,6 +319,7 @@ const advancedQueryParams = reactive({
academicLevel: '',
trainingType: '',
grade: '',
studentStatus: [] as string[],
// 家庭信息
fatherName: '',
@@ -432,24 +438,78 @@ const getList = () => {
};
const handleQuery = () => {
queryParams.pageNum = 1;
// 保留基本检索条件和部门选择
const basicSearchParams = {
pageNum: 1,
pageSize: queryParams.pageSize,
studentNo: queryParams.studentNo || '',
name: queryParams.name || '',
phone: queryParams.phone || '',
studentStatus: queryParams.studentStatus || [],
deptIds: queryParams.deptIds || []
};
// 清空 queryParams 对象的所有属性
Object.keys(queryParams).forEach((key) => {
delete queryParams[key];
});
// 重新设置基本检索参数
Object.assign(queryParams, basicSearchParams);
getList();
};
const resetQuery = () => {
// 先将查询参数重置为空对象
Object.keys(queryParams).forEach((key) => {
delete queryParams[key];
});
// 重新设置必要的默认参数
queryParams.pageNum = 1;
queryParams.pageSize = 10;
queryParams.studentNo = '';
queryParams.name = '';
queryParams.phone = '';
queryParams.studentStatus = [];
queryParams.deptIds = [];
// 清空部门选择
selectedDepts.value = [];
//左侧树的勾选全取消
deptTreeRef.value?.setCheckedKeys([]);
// 执行查询
handleQuery();
};
const handleAdvancedSearch = (params: any) => {
//queryParams 需要重置
// 保留基本检索条件和部门选择
const basicSearchParams = {
pageNum: 1,
pageSize: queryParams.pageSize,
studentNo: queryParams.studentNo || '',
name: queryParams.name || '',
phone: queryParams.phone || '',
studentStatus: queryParams.studentStatus || [],
deptIds: queryParams.deptIds || []
};
// 清空 queryParams 对象的所有属性
Object.keys(queryParams).forEach((key) => {
delete queryParams[key];
});
// 重新设置基本检索参数
Object.assign(queryParams, basicSearchParams);
console.log('检索栏查询参数:', queryParams);
console.log('高级查询参数:', params);
// 合并高级查询参数
Object.assign(queryParams, params);
handleQuery();
console.log('检索栏+高级查询参数:', queryParams);
getList();
};
const handleAdvancedReset = () => {
@@ -461,25 +521,232 @@ const handleAdvancedReset = () => {
advancedQueryParams[key] = '';
}
});
resetQuery();
};
const handleShowAdvancedSearch = () => {
// 将基础检索栏的参数同步到高级检索参数中
if (queryParams.studentNo) {
advancedQueryParams.studentNo = queryParams.studentNo;
}
if (queryParams.name) {
advancedQueryParams.name = queryParams.name;
}
if (queryParams.phone) {
advancedQueryParams.phone = queryParams.phone;
}
// 状态对应学籍状况
if (queryParams.studentStatus && queryParams.studentStatus.length > 0) {
advancedQueryParams.studentStatus = [...queryParams.studentStatus];
}
// 显示高级检索弹窗
showAdvancedSearch.value = true;
};
const handleExport = () => {
// 使用真实的导出API
api
.exportStudentRoster(queryParams)
.then((response) => {
const blob = new Blob([response.data], { type: 'application/vnd.ms-excel' });
const url = window.URL.createObjectURL(blob);
const link = document.createElement('a');
link.href = url;
link.download = '学生花名册.xlsx';
link.click();
window.URL.revokeObjectURL(url);
// 显示导出进度提示
ElMessage({
message: '正在导出数据,请耐心等待...',
type: 'info',
duration: 0,
zIndex: 4000
});
// 组装高级检索参数,参考AdvancedSearchDialog的处理方式
const exportParams: any = {
// 基础查询条件
...queryParams
// 高级查询条件
// ...//advancedQueryParams
};
console.log('导出参数 - begin:', exportParams);
// 处理日期范围参数
if (exportParams.birthDateRange && exportParams.birthDateRange.length === 2) {
exportParams.birthDateStart = exportParams.birthDateRange[0];
exportParams.birthDateEnd = exportParams.birthDateRange[1];
}
delete exportParams.birthDateRange;
if (exportParams.enrollmentDateRange && exportParams.enrollmentDateRange.length === 2) {
exportParams.enrollmentDateStart = exportParams.enrollmentDateRange[0];
exportParams.enrollmentDateEnd = exportParams.enrollmentDateRange[1];
}
delete exportParams.enrollmentDateRange;
if (exportParams.createTimeRange && exportParams.createTimeRange.length === 2) {
exportParams.createTimeStart = exportParams.createTimeRange[0];
exportParams.createTimeEnd = exportParams.createTimeRange[1];
}
delete exportParams.createTimeRange;
if (exportParams.updateTimeRange && exportParams.updateTimeRange.length === 2) {
exportParams.updateTimeStart = exportParams.updateTimeRange[0];
exportParams.updateTimeEnd = exportParams.updateTimeRange[1];
}
delete exportParams.updateTimeRange;
// 处理数值范围参数
if (exportParams.enrollmentYearRange && exportParams.enrollmentYearRange.length >= 1) {
if (exportParams.enrollmentYearRange[0]) {
exportParams.enrollmentYearStart = exportParams.enrollmentYearRange[0];
}
if (exportParams.enrollmentYearRange[1]) {
exportParams.enrollmentYearEnd = exportParams.enrollmentYearRange[1];
}
}
delete exportParams.enrollmentYearRange;
if (exportParams.schoolSystemRange && exportParams.schoolSystemRange.length >= 1) {
if (exportParams.schoolSystemRange[0]) {
exportParams.schoolSystemMin = exportParams.schoolSystemRange[0];
}
if (exportParams.schoolSystemRange[1]) {
exportParams.schoolSystemMax = exportParams.schoolSystemRange[1];
}
}
delete exportParams.schoolSystemRange;
if (exportParams.grade && Array.isArray(exportParams.grade) && exportParams.grade.length >= 1) {
if (exportParams.grade[0]) {
exportParams.gradeMin = exportParams.grade[0];
}
if (exportParams.grade[1]) {
exportParams.gradeMax = exportParams.grade[1];
}
}
delete exportParams.grade;
if (exportParams.familyIncomeRange && exportParams.familyIncomeRange.length >= 1) {
if (exportParams.familyIncomeRange[0]) {
exportParams.familyIncomeMin = exportParams.familyIncomeRange[0];
}
if (exportParams.familyIncomeRange[1]) {
exportParams.familyIncomeMax = exportParams.familyIncomeRange[1];
}
}
delete exportParams.familyIncomeRange;
if (exportParams.perCapitaIncomeRange && exportParams.perCapitaIncomeRange.length >= 1) {
if (exportParams.perCapitaIncomeRange[0]) {
exportParams.perCapitaIncomeMin = exportParams.perCapitaIncomeRange[0];
}
if (exportParams.perCapitaIncomeRange[1]) {
exportParams.perCapitaIncomeMax = exportParams.perCapitaIncomeRange[1];
}
}
delete exportParams.perCapitaIncomeRange;
if (exportParams.familyMembersRange && exportParams.familyMembersRange.length >= 1) {
if (exportParams.familyMembersRange[0]) {
exportParams.familyMembersMin = exportParams.familyMembersRange[0];
}
if (exportParams.familyMembersRange[1]) {
exportParams.familyMembersMax = exportParams.familyMembersRange[1];
}
}
delete exportParams.familyMembersRange;
if (exportParams.loanAmountRange && exportParams.loanAmountRange.length >= 1) {
if (exportParams.loanAmountRange[0]) {
exportParams.loanAmountMin = exportParams.loanAmountRange[0];
}
if (exportParams.loanAmountRange[1]) {
exportParams.loanAmountMax = exportParams.loanAmountRange[1];
}
}
delete exportParams.loanAmountRange;
if (exportParams.heightRange && exportParams.heightRange.length >= 1) {
if (exportParams.heightRange[0]) {
exportParams.heightMin = exportParams.heightRange[0];
}
if (exportParams.heightRange[1]) {
exportParams.heightMax = exportParams.heightRange[1];
}
}
delete exportParams.heightRange;
if (exportParams.weightRange && exportParams.weightRange.length >= 1) {
if (exportParams.weightRange[0]) {
exportParams.weightMin = exportParams.weightRange[0];
}
if (exportParams.weightRange[1]) {
exportParams.weightMax = exportParams.weightRange[1];
}
}
delete exportParams.weightRange;
// 处理多选下拉框参数 - 确保传递数组格式
const multiSelectFields = [
'gender',
'nationality',
'nativePlace',
'politicalStatus',
'maritalStatus',
'educationLevel',
'admissionCategory',
'academicLevel',
'trainingType',
'householdRegisterType',
'studentStatus',
'isBoarder',
'dormitoryBuilding',
'familyEconomicStatus',
'isPoorStudent',
'isMinority',
'isDisabled',
'isOrphan',
'isLeftBehindChild',
'isSingleChild',
'isLowIncome',
'hasLoan',
'sourceRegion',
'bloodType',
'disabilityType'
];
multiSelectFields.forEach((field) => {
if (exportParams[field] && Array.isArray(exportParams[field])) {
// 过滤掉空值,确保只传递有效的数组
const filteredArray = exportParams[field].filter((item) => item !== null && item !== undefined && item !== '');
if (filteredArray.length > 0) {
exportParams[field] = filteredArray;
} else {
delete exportParams[field];
}
}
});
// 移除分页参数,导出全量数据
exportParams.pageNum = 1;
exportParams.pageSize = 5000000;
// 过滤掉空值,减少请求体大小
Object.keys(exportParams).forEach((key) => {
if (exportParams[key] === undefined || exportParams[key] === '' || (Array.isArray(exportParams[key]) && exportParams[key].length === 0)) {
delete exportParams[key];
}
});
console.log('导出参数 - end:', exportParams);
proxy
?.downloadJson('studentMsg/studentMsg/advancedSearchExport', exportParams, `学生花名册_${new Date().getTime()}.xlsx`)
.then(() => {
// 导出成功后关闭提示
ElMessage.closeAll();
ElMessage.success('导出成功');
})
.catch((error) => {
console.error('导出失败:', error);
ElMessage.error('导出失败,请重试');
// 导出失败时关闭提示
ElMessage.closeAll();
if (error.message && error.message.includes('timeout')) {
ElMessage.error('导出超时,请尝试减少导出数据量或联系管理员');
} else {
ElMessage.error('导出失败,请稍后重试');
}
});
};