|
|
@@ -1676,6 +1676,37 @@
|
|
|
</el-form-item>
|
|
|
</el-col>
|
|
|
</el-row>
|
|
|
+ <el-row v-if="isResumeChangeType" :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="新学院" prop="newCollegeId">
|
|
|
+ <el-select v-model="statusChangeForm.newCollegeId" placeholder="请选择学院" @change="handleStatusChangeCollegeChange" style="width: 100%">
|
|
|
+ <el-option v-for="college in resumeCollegeOptions" :key="college.id" :label="college.label" :value="college.id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="新专业" prop="newMajorId">
|
|
|
+ <el-select
|
|
|
+ v-model="statusChangeForm.newMajorId"
|
|
|
+ placeholder="请选择专业"
|
|
|
+ :disabled="!statusChangeForm.newCollegeId"
|
|
|
+ @change="handleStatusChangeMajorChange"
|
|
|
+ style="width: 100%"
|
|
|
+ >
|
|
|
+ <el-option v-for="major in resumeMajorOptions" :key="major.id" :label="major.label" :value="major.id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-row v-if="isResumeChangeType" :gutter="20">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form-item label="新班级" prop="newClassId">
|
|
|
+ <el-select v-model="statusChangeForm.newClassId" placeholder="请选择班级" :disabled="!statusChangeForm.newMajorId" style="width: 100%">
|
|
|
+ <el-option v-for="classItem in resumeClassOptions" :key="classItem.id" :label="classItem.label" :value="classItem.id" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
<el-row :gutter="20">
|
|
|
<el-col :span="12">
|
|
|
<el-form-item label="经办人ID" prop="operatorId">
|
|
|
@@ -1864,6 +1895,9 @@ const rawDeptOptions = ref<any[]>([]);
|
|
|
const majorOptions = ref([]);
|
|
|
const classOptions = ref([]);
|
|
|
const collegeOptions = ref([]); // 学院选项
|
|
|
+const resumeCollegeOptions = ref<any[]>([]); // 复学弹窗学院选项
|
|
|
+const resumeMajorOptions = ref<any[]>([]); // 复学弹窗专业选项
|
|
|
+const resumeClassOptions = ref<any[]>([]); // 复学弹窗班级选项
|
|
|
const regionOptions = ref([]); // 行政区划选项
|
|
|
const dormBuildingOptions = ref([]); // 宿舍楼栋选项
|
|
|
const currentSelectedNode = ref<any>(null); // 当前选中的部门节点
|
|
|
@@ -1945,6 +1979,9 @@ const statusChangeForm = reactive({
|
|
|
reason: '',
|
|
|
operatorId: '',
|
|
|
operatorName: '',
|
|
|
+ newCollegeId: '',
|
|
|
+ newMajorId: '',
|
|
|
+ newClassId: '',
|
|
|
selectedStudents: [] as StudentVO[]
|
|
|
});
|
|
|
|
|
|
@@ -2103,7 +2140,10 @@ const rules = reactive({
|
|
|
const statusChangeRules = reactive({
|
|
|
changeType: [{ required: true, message: '异动类型不能为空', trigger: 'change' }],
|
|
|
effectiveDate: [{ required: true, message: '生效日期不能为空', trigger: 'blur' }],
|
|
|
- reason: [{ required: true, message: '异动原因不能为空', trigger: 'blur' }]
|
|
|
+ reason: [{ required: true, message: '异动原因不能为空', trigger: 'blur' }],
|
|
|
+ newCollegeId: [{ required: true, message: '请选择新学院', trigger: 'change' }],
|
|
|
+ newMajorId: [{ required: true, message: '请选择新专业', trigger: 'change' }],
|
|
|
+ newClassId: [{ required: true, message: '请选择新班级', trigger: 'change' }]
|
|
|
});
|
|
|
|
|
|
// 换班级表单验证规则
|
|
|
@@ -3090,8 +3130,13 @@ const openStatusChangeModal = (changeType?: string) => {
|
|
|
statusChangeForm.reason = '';
|
|
|
statusChangeForm.operatorId = userStore.userId || '';
|
|
|
statusChangeForm.operatorName = userStore.nickname || '';
|
|
|
+ resetResumeClassSelection();
|
|
|
statusChangeForm.selectedStudents = selectedStudents;
|
|
|
|
|
|
+ if (changeType === 'FU_XUE') {
|
|
|
+ loadResumeCollegeOptions();
|
|
|
+ }
|
|
|
+
|
|
|
statusChangeDialog.visible = true;
|
|
|
};
|
|
|
|
|
|
@@ -3112,6 +3157,99 @@ const disabledDate = (time: Date) => {
|
|
|
return time.getTime() < Date.now() - 24 * 60 * 60 * 1000; // 不能选择昨天及以前的日期
|
|
|
};
|
|
|
|
|
|
+const isResumeChangeType = computed(() => statusChangeForm.changeType === 'FU_XUE');
|
|
|
+
|
|
|
+const resetResumeClassSelection = () => {
|
|
|
+ statusChangeForm.newCollegeId = '';
|
|
|
+ statusChangeForm.newMajorId = '';
|
|
|
+ statusChangeForm.newClassId = '';
|
|
|
+ resumeMajorOptions.value = [];
|
|
|
+ resumeClassOptions.value = [];
|
|
|
+};
|
|
|
+
|
|
|
+const loadResumeCollegeOptions = async () => {
|
|
|
+ try {
|
|
|
+ const res = await service.get('/system/dept/list', {
|
|
|
+ params: {
|
|
|
+ parentId: 101, // 二级学院节点
|
|
|
+ deptCategory: 'xy-' // 学院标识
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ resumeCollegeOptions.value = (res.data || []).map((dept: any) => ({
|
|
|
+ id: dept.deptId,
|
|
|
+ label: dept.deptName
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取复学学院列表失败:', error);
|
|
|
+ resumeCollegeOptions.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const handleStatusChangeCollegeChange = async (collegeId: string) => {
|
|
|
+ statusChangeForm.newMajorId = '';
|
|
|
+ statusChangeForm.newClassId = '';
|
|
|
+ resumeMajorOptions.value = [];
|
|
|
+ resumeClassOptions.value = [];
|
|
|
+
|
|
|
+ if (!collegeId) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const res = await service.get('/system/dept/list', {
|
|
|
+ params: {
|
|
|
+ parentId: collegeId,
|
|
|
+ deptCategory: 'zy-'
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ resumeMajorOptions.value = (res.data || []).map((dept: any) => ({
|
|
|
+ id: dept.deptId,
|
|
|
+ label: dept.deptName
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取复学专业列表失败:', error);
|
|
|
+ resumeMajorOptions.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+const handleStatusChangeMajorChange = async (majorId: string) => {
|
|
|
+ statusChangeForm.newClassId = '';
|
|
|
+ resumeClassOptions.value = [];
|
|
|
+
|
|
|
+ if (!majorId) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const res = await service.get('/system/dept/list', {
|
|
|
+ params: {
|
|
|
+ parentId: majorId,
|
|
|
+ deptCategory: 'bj-'
|
|
|
+ }
|
|
|
+ });
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ resumeClassOptions.value = (res.data || []).map((dept: any) => ({
|
|
|
+ id: dept.deptId,
|
|
|
+ label: dept.deptName
|
|
|
+ }));
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取复学班级列表失败:', error);
|
|
|
+ resumeClassOptions.value = [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+watch(
|
|
|
+ () => statusChangeForm.changeType,
|
|
|
+ (value) => {
|
|
|
+ if (value === 'FU_XUE') {
|
|
|
+ loadResumeCollegeOptions();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ resetResumeClassSelection();
|
|
|
+ }
|
|
|
+);
|
|
|
+
|
|
|
/** 提交学籍异动 */
|
|
|
const submitStatusChange = async () => {
|
|
|
const formRef = statusChangeFormRef.value;
|
|
|
@@ -3120,6 +3258,55 @@ const submitStatusChange = async () => {
|
|
|
await formRef.validate(async (valid: boolean) => {
|
|
|
if (valid) {
|
|
|
try {
|
|
|
+ if (isResumeChangeType.value) {
|
|
|
+ if (statusChangeForm.selectedStudents.length !== 1) {
|
|
|
+ ElMessage.warning('复学并换班级仅支持单个学生操作');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if (!statusChangeForm.newCollegeId || !statusChangeForm.newMajorId || !statusChangeForm.newClassId) {
|
|
|
+ ElMessage.warning('请选择新学院、新专业和新班级');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const selectedStudent = statusChangeForm.selectedStudents[0];
|
|
|
+ if (String(statusChangeForm.newClassId) === String(selectedStudent.classId || '')) {
|
|
|
+ ElMessage.warning('请选择与原班级不同的新班级');
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ const resumePayload = {
|
|
|
+ studentId: selectedStudent.id,
|
|
|
+ studentNo: selectedStudent.studentNo,
|
|
|
+ studentName: selectedStudent.name,
|
|
|
+ originalCollegeId: selectedStudent.collegeId || undefined,
|
|
|
+ originalCollegeName: (selectedStudent as any).collegeName || (selectedStudent as any).colegeName || '',
|
|
|
+ originalMajorId: selectedStudent.majorId || undefined,
|
|
|
+ originalMajorName: selectedStudent.majorName || '',
|
|
|
+ originalClassId: selectedStudent.classId || undefined,
|
|
|
+ originalClassName: selectedStudent.className || '',
|
|
|
+ newCollegeId: statusChangeForm.newCollegeId,
|
|
|
+ newCollegeName: resumeCollegeOptions.value.find((item: any) => String(item.id) === String(statusChangeForm.newCollegeId))?.label || '',
|
|
|
+ newMajorId: statusChangeForm.newMajorId,
|
|
|
+ newMajorName: resumeMajorOptions.value.find((item: any) => String(item.id) === String(statusChangeForm.newMajorId))?.label || '',
|
|
|
+ newClassId: statusChangeForm.newClassId,
|
|
|
+ newClassName: resumeClassOptions.value.find((item: any) => String(item.id) === String(statusChangeForm.newClassId))?.label || '',
|
|
|
+ effectiveDate: statusChangeForm.effectiveDate,
|
|
|
+ reason: statusChangeForm.reason,
|
|
|
+ operatorId: statusChangeForm.operatorId || undefined,
|
|
|
+ operatorName: statusChangeForm.operatorName
|
|
|
+ };
|
|
|
+
|
|
|
+ const res = await service.post('/studentMsg/studentStatusChange/resume-with-class-change', resumePayload);
|
|
|
+ if (res && res.code === 200) {
|
|
|
+ ElMessage.success('复学并换班级提交成功');
|
|
|
+ statusChangeDialog.visible = false;
|
|
|
+ await getList();
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res?.msg || '提交失败');
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
const submitData = statusChangeForm.selectedStudents.map((student) => ({
|
|
|
studentId: student.id,
|
|
|
studentNo: student.studentNo,
|