提交学生花名册
This commit is contained in:
1 parent
a6b8eb06dd
commit
38a1234dcb
7 files changed
+1261
-30
No files matched your search
@@ -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;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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('导出失败,请稍后重试');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
Reference in new issue
Block a user