This commit is contained in:
zlwu committed 2026-07-22 14:14:34 +08:00
1 parent f3869785ff
commit 4ada3c6f01
8 files changed
+724 -5

No files matched your search

@@ -49,6 +49,17 @@
<el-col :span="1.5">
<el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['classMsg:classMsg:add']">新增</el-button>
</el-col>
<el-col :span="1.5">
<el-dropdown v-hasPermi="['classMsg:classMsg:add']" split-button type="info" plain @click="handleImport">
导入
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item icon="Download" @click="importTemplate">下载模板</el-dropdown-item>
<el-dropdown-item icon="Upload" @click="handleImport">导入数据</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</el-col>
<el-col :span="1.5">
<el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['classMsg:classMsg:edit']"
>修改</el-button
@@ -194,13 +205,13 @@
<el-input v-model="form.grade" placeholder="请输入年级" />
</el-form-item>
<el-form-item label="入学年份" prop="enrollmentYear">
<el-input v-model="form.enrollmentYear" placeholder="请输入入学年份" />
<el-input v-model="form.enrollmentYear" placeholder="请输入入学年份" @input="syncGraduationYear" />
</el-form-item>
<el-form-item label="学制(年)" prop="schoolSystem">
<el-input v-model="form.schoolSystem" placeholder="请输入学制(年)" />
<el-input v-model="form.schoolSystem" placeholder="请输入学制(年)" @input="syncGraduationYear" />
</el-form-item>
<el-form-item label="毕业年份" prop="graduationYear">
<el-input v-model="form.graduationYear" placeholder="请输入毕业年份" />
<el-input v-model="form.graduationYear" placeholder="入学年份+学制自动计算,可修改" />
</el-form-item>
<el-form-item label="辅导员ID" prop="counselorId" v-if="false">
<el-input v-model="form.counselorId" placeholder="请输入辅导员ID" />
@@ -386,6 +397,41 @@
</template>
</el-dialog>
<!-- 班级信息导入对话框 -->
<el-dialog v-model="upload.open" :title="upload.title" width="420px" append-to-body>
<el-upload
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:on-error="handleFileError"
:auto-upload="false"
drag
>
<el-icon class="el-icon--upload"><i-ep-upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div>请先下载模板,通过下拉框选择学院、专业及字典项后上传。</div>
<span>仅允许导入 xls、xlsx 格式文件。</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">
下载模板
</el-link>
</div>
</template>
</el-upload>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" :loading="upload.isUploading" @click="submitFileForm">确 定</el-button>
<el-button @click="upload.open = false">取 消</el-button>
</div>
</template>
</el-dialog>
<!-- 设置辅导员对话框 -->
<el-dialog title="设置辅导员" v-model="counselorDialog.visible" width="500px" append-to-body>
<el-descriptions title="班级信息" :column="1" border>
@@ -446,7 +492,9 @@ import {
import { listColleges, collegeTree, listMajorsByCollegeId } from '@/api/xg/xsjcxx/classmsg/college';
import { ClassMsgVO, ClassMsgQuery, ClassMsgForm, SysDeptVo } from '@/api/xg/xsjcxx/classmsg/types';
import { ComponentInternalInstance, ref, reactive, toRefs, onMounted, getCurrentInstance, watch } from 'vue';
import type { FormInstance as ElFormInstance } from 'element-plus';
import type { FormInstance as ElFormInstance, UploadFile, UploadInstance } from 'element-plus';
import { ElMessageBox } from 'element-plus';
import { globalHeaders } from '@/utils/request';
import { getActiveUserList } from '@/api/xg/sysUser'; // 添加用户API导入
import { addClassTeacherCounselorRel, updateClassTeacherCounselorRel } from '@/api/xg/classTeacherCounselorRel'; // 添加班级辅导员关联API导入
@@ -526,6 +574,16 @@ const collegeTreeData = ref<SysDeptVo[]>([]); // 学院专业树形数据
const queryFormRef = ref<ElFormInstance>();
const classMsgFormRef = ref<ElFormInstance>();
const uploadRef = ref<UploadInstance>();
/** 班级导入参数 */
const upload = reactive({
open: false,
title: '',
isUploading: false,
headers: globalHeaders(),
url: import.meta.env.VITE_APP_BASE_API + '/classMsg/classMsg/importData'
});
const dialog = reactive<DialogOption>({
visible: false,
@@ -705,6 +763,15 @@ watch(
}
);
/** 根据入学年份 + 学制自动计算毕业年份 */
const syncGraduationYear = () => {
const enrollmentYear = Number(form.value.enrollmentYear);
const schoolSystem = Number(form.value.schoolSystem);
if (Number.isFinite(enrollmentYear) && Number.isFinite(schoolSystem) && schoolSystem > 0) {
form.value.graduationYear = enrollmentYear + schoolSystem;
}
};
/** 取消按钮 */
const cancel = () => {
reset();
@@ -744,6 +811,46 @@ const handleAdd = () => {
dialog.title = '添加班级信息';
};
/** 导入按钮操作 */
const handleImport = () => {
upload.title = '班级信息导入';
upload.open = true;
};
/** 下载导入模板 */
const importTemplate = () => {
proxy?.download('classMsg/classMsg/importTemplate', {}, `班级信息导入模板_${new Date().getTime()}.xlsx`);
};
/** 文件上传中处理 */
const handleFileUploadProgress = () => {
upload.isUploading = true;
};
/** 文件上传成功处理 */
const handleFileSuccess = (response: any, file: UploadFile) => {
upload.open = false;
upload.isUploading = false;
uploadRef.value?.handleRemove(file);
ElMessageBox.alert(
"<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + (response.msg || '导入完成') + '</div>',
'导入结果',
{ dangerouslyUseHTMLString: true }
);
getList();
};
/** 文件上传失败处理 */
const handleFileError = () => {
upload.isUploading = false;
proxy?.$modal.msgError('导入失败,请检查文件格式或网络连接');
};
/** 提交上传文件 */
const submitFileForm = () => {
uploadRef.value?.submit();
};
/** 修改按钮操作 */
const handleUpdate = async (row?: ClassMsgVO) => {
reset();