Browse Source

style:将绑定班级的组件拆分

sakura 1 year ago
parent
commit
d78906906e

+ 1 - 2
school-in-out-system/src/main/java/com/schoolinout/system/domain/dto/AddTeacherClassRelationDto.java

@@ -2,7 +2,6 @@ package com.schoolinout.system.domain.dto;
 
 import io.swagger.v3.oas.annotations.media.Schema;
 
-import javax.validation.constraints.NotEmpty;
 import javax.validation.constraints.NotNull;
 import java.util.List;
 
@@ -18,7 +17,7 @@ public class AddTeacherClassRelationDto {
 
     @NotNull(message = "教师不能为空")
     private Long teacherId;
-    @NotEmpty(message = "绑定的班级不能为空")
+    
     private List<Long> classId;
 
     @Override

+ 5 - 1
school-in-out-system/src/main/java/com/schoolinout/system/mapper/TeacherClassRelationMapper.java

@@ -80,5 +80,9 @@ public interface TeacherClassRelationMapper extends BaseMapper<TeacherClassRelat
 
     void insertRelationBatch(@Param("schoolId") Long schoolId, @Param("classId") Long classId, @Param("list") List<Long> teacherIds);
 
-    void deleteAllRelationsForClass(@Param("schoolId") Long schoolId, @Param("classId") Long classId);
+    void deleteAllRelationsForClass(@Param("schoolId") Long schoolId, @Param("classId") Long classId, @Param("teacherId") Long teacherId);
+
+    void deleteRelationBatchForClassId(@Param("schoolId") Long schoolId, @Param("teacherId") Long teacherId, @Param("list") List<Long> classIdsToRemove);
+
+    void insertRelationBatchForClassId(@Param("schoolId") Long schoolId, @Param("teacherId") Long teacherId, @Param("list") List<Long> newClassIds);
 }

+ 1 - 1
school-in-out-system/src/main/java/com/schoolinout/system/service/impl/ClazzServiceImpl.java

@@ -113,7 +113,7 @@ public class ClazzServiceImpl implements IClazzService {
         // 如果新的教师列表为空,或者需要移除所有现有教师
         if (newTeacherIds == null || newTeacherIds.isEmpty()) {
             // 删除所有现有关系
-            relationMapper.deleteAllRelationsForClass(form.getSchoolId(), classId);
+            relationMapper.deleteAllRelationsForClass(form.getSchoolId(), classId, null);
         } else {
             // 计算需要删除的教师ID
             List<Long> teacherIdsToRemove = existingTeacherIds.stream()

+ 35 - 9
school-in-out-system/src/main/java/com/schoolinout/system/service/impl/TeacherClassRelationServiceImpl.java

@@ -8,7 +8,6 @@ import com.schoolinout.system.domain.Teacher;
 import com.schoolinout.system.domain.TeacherClassRelation;
 import com.schoolinout.system.domain.dto.AddTeacherClassRelationDto;
 import com.schoolinout.system.domain.dto.BindClassTeacherMain;
-import com.schoolinout.system.domain.dto.InsertTeacherClassRelationDto;
 import com.schoolinout.system.domain.dto.RelationListDto;
 import com.schoolinout.system.domain.vo.TeacherClassInfoVo;
 import com.schoolinout.system.mapper.ClazzMapper;
@@ -20,6 +19,7 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -108,14 +108,40 @@ public class TeacherClassRelationServiceImpl implements ITeacherClassRelationSer
     @Override
     @Transactional(rollbackFor = {RuntimeException.class, ServiceException.class})
     public int bindTeacherClass(AddTeacherClassRelationDto form) {
-        // step1:删除旧关系
-        teacherClassRelationMapper.deleteRelationBySchoolIdAndTeacherId(form.getSchoolId(), form.getTeacherId());
-        // step2:绑定对应的数据
-        // step3:返回响应结果
-        List<InsertTeacherClassRelationDto> insertList = form.getClassId().stream()
-                .map(classId -> new InsertTeacherClassRelationDto(form.getSchoolId(), form.getTeacherId(), classId))
-                .collect(Collectors.toList());
-        return teacherClassRelationMapper.insertTeacherClassRelationBatch(insertList);
+        // 先查询原班级关系数据
+        TeacherClassRelation queryRelation = new TeacherClassRelation();
+        // 先查询当前教师包含的所有的关系
+        queryRelation.setTeacherId(form.getTeacherId());
+        queryRelation.setSchoolId(form.getSchoolId());
+        List<TeacherClassRelation> existingRelations = teacherClassRelationMapper.selectTeacherClassRelationList(queryRelation);
+
+        // 将现有关系映射为班级ID集合
+        Set<Long> existingClassIds = existingRelations.stream()
+                .map(TeacherClassRelation::getClassId)
+                .collect(Collectors.toSet());
+        List<Long> newClassIds = form.getClassId();
+        if (newClassIds == null || newClassIds.isEmpty()) {
+            teacherClassRelationMapper.deleteAllRelationsForClass(form.getSchoolId(), null, form.getTeacherId());
+        } else {
+            // 计算要删除的id
+            List<Long> classIdsToRemove = existingClassIds.stream()
+                    .filter(item -> !newClassIds.contains(item))
+                    .collect(Collectors.toList());
+            // 计算要新增的id
+            boolean classIdsToAdd = newClassIds.removeAll(classIdsToRemove);
+
+            // 执行批量删除
+            if (!classIdsToRemove.isEmpty()) {
+                teacherClassRelationMapper.deleteRelationBatchForClassId(form.getSchoolId(), form.getTeacherId(), classIdsToRemove);
+            }
+
+            // 执行批量插入
+            if (classIdsToAdd) {
+                teacherClassRelationMapper.insertRelationBatchForClassId(form.getSchoolId(), form.getTeacherId(), newClassIds);
+            }
+        }
+
+        return 1;
     }
 
     @Override

+ 39 - 3
school-in-out-system/src/main/resources/mapper/system/TeacherClassRelationMapper.xml

@@ -128,6 +128,15 @@
             </foreach>
         </if>
     </insert>
+    <insert id="insertRelationBatchForClassId">
+        INSERT INTO tb_school_teacher_class_relation(school_id, teacher_id, class_id)
+        VALUES
+        <if test="list != null">
+            <foreach collection="list" item="item" separator=",">
+                (#{schoolId}, #{teacherId}, #{item})
+            </foreach>
+        </if>
+    </insert>
 
     <update id="updateTeacherClassRelation" parameterType="TeacherClassRelation">
         update tb_school_teacher_class_relation
@@ -183,7 +192,6 @@
     <delete id="deleteRelationBatch">
         DELETE FROM tb_school_teacher_class_relation
         <where>
-            WHERE school_id = 2 and class_id = 1 and teacher_id = 1;
             <if test="schoolId != null">
                 AND school_id = #{schoolId}
             </if>
@@ -201,7 +209,35 @@
     <delete id="deleteAllRelationsForClass">
         DELETE
         FROM tb_school_teacher_class_relation
-        WHERE school_id = #{schoolId}
-          AND class_id = #{classId}
+        <where>
+            <if test="schoolId != null">
+                AND school_id = #{schoolId}
+            </if>
+            <if test="classId != null">
+                AND class_id = #{classId}
+            </if>
+            <if test="teacherId != null">
+                AND teacher_id = #{teacherId}
+            </if>
+        </where>
+    </delete>
+    <delete id="deleteRelationBatchForClassId">
+        DELETE
+        FROM tb_school_teacher_class_relation
+        <where>
+            <if test="schoolId != null">
+                AND school_id = #{schoolId}
+            </if>
+            <if test="teacherId != null">
+                AND teacher_id = #{teacherId}
+            </if>
+            <if test="list != null">
+                AND class_id IN
+                <foreach collection="list" item="item" separator="," open="(" close=")">
+                    #{item}
+                </foreach>
+            </if>
+
+        </where>
     </delete>
 </mapper>

+ 10 - 0
school-in-out-ui/src/api/system/teacher_class_relation.js

@@ -17,3 +17,13 @@ export function getRelationInfoList(params) {
     params
   })
 }
+
+
+// 老师绑定班级
+export function teacherBindClass(data) {
+  return request({
+    url: '/system/relation/bind/teacher',
+    method: 'post',
+    data
+  })
+}

+ 12 - 52
school-in-out-ui/src/views/system/teacher/index.vue

@@ -76,7 +76,7 @@
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
       <el-form ref="form" :model="form" :rules="rules" label-width="80px">
         <el-form-item label="所属学校" prop="schoolId">
-          <el-select v-model="form.schoolId" placeholder="请选择学校" style="width: 100%;">
+          <el-select v-model="form.schoolId" :disabled='form.schoolId !== null' placeholder="请选择学校" style="width: 100%;">
             <el-option v-for="dict in dictTables.schoolDict" :key="dict.value" :label="dict.label"
               :value="dict.value"></el-option>
           </el-select>
@@ -102,40 +102,26 @@
     </el-dialog>
 
     <!-- 绑定班级对话框 -->
-    <el-dialog title="绑定班级" :visible.sync="classVisible" width="30%" center>
-      <el-form label-position="right" label-width="80px" :model="bindClassTeacherForm">
-        <el-form-item label="老师姓名" prop="teacherName">
-          <el-input v-model="bindClassTeacherForm.teacherName" disabled placeholder="请输入老师姓名" />
-        </el-form-item>
-        <el-form-item label="所属学校" prop="schoolId">
-          <el-select v-model="bindClassTeacherForm.schoolId" disabled placeholder="请选择学校" style="width: 100%;">
-            <el-option v-for="dict in dictTables.schoolDict" :key="dict.value" :label="dict.label"
-              :value="dict.value"></el-option>
-          </el-select>
-        </el-form-item>
-        <el-form-item label="绑定班级" prop="classId">
-          <el-select v-model="bindClassTeacherForm.classId" :loading="bindOptionLoding" loading-text="正在加载中~~~"
-            reserve-keyword @visible-change="searchClassOption" placeholder="请选择班级" style="width: 100%;">
-            <el-option v-for="item in clazzOption" :key="item.value" :label="item.label" :value="item.value"></el-option>
-          </el-select>
-        </el-form-item>
-      </el-form>
-      <span slot="footer" class="dialog-footer">
-        <el-button @click="centerDialogVisible = false">取 消</el-button>
-        <el-button type="primary" @click="centerDialogVisible = false">确 定</el-button>
-      </span>
-    </el-dialog>
+    <bind-class-teacher
+      ref="bindClassTeacher"
+      :dictTables="dictTables"
+      @ok="getList"
+    />
   </div>
 </template>
 
 <script>
 import { listTeacher, getTeacher, delTeacher, addTeacher, updateTeacher } from "@/api/system/teacher";
-import { listClazzOption } from '@/api/system/clazz'
 import Textyixia from "@/mixin/Textyixia"
+import BindClassTeacher from './module/BindClassTeacher'
+
 export default {
   name: "Teacher",
   mixins: [Textyixia],
   dicts: ['sys_user_sex'],
+  components: {
+    BindClassTeacher
+  },
   data() {
     return {
       // 遮罩层
@@ -156,7 +142,6 @@ export default {
       title: "",
       // 是否显示弹出层
       open: false,
-      classVisible: false,
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -187,11 +172,6 @@ export default {
         schoolDict: [],
         classDict: []
       },
-      // 绑定班级和教师表单对象
-      bindClassTeacherForm: {},
-      // 班级下拉列表
-      clazzOption: [],
-      bindOptionLoding: false
     };
   },
   created() {
@@ -199,9 +179,6 @@ export default {
     this.dictTableData("tb_school,school_name,id").then(data => {
       this.dictTables.schoolDict = data
     })
-    // this.dictTableData("tb_school_class,class_name,id").then(data => {
-    //   this.dictTables.schoolDict = data
-    // })
   },
   methods: {
     /** 查询教师管理列表 */
@@ -298,24 +275,7 @@ export default {
     },
     /** 绑定班级按钮操作 */
     handleBindClass(row) {
-      // this.reset();
-      this.classVisible = true
-      this.bindClassTeacherForm = row
-      // 先发请求去获取对应学校的班级 获取成功后,返回对应的班级列表
-      // listClazzOption().then(response => {
-      //   this.clazzOption = response.data
-      // })
-    },
-    /** 懒加载班级列表 */
-    searchClassOption(openSelect) {
-      if (openSelect) {
-        this.bindOptionLoding = true
-        listClazzOption(this.bindClassTeacherForm.schoolId).then(response => {
-          console.log(response);
-          this.clazzOption = response.data
-          this.bindOptionLoding = false
-        })
-      }
+      this.$refs.bindClassTeacher.handleBindClass(row);
     },
     /** 导出按钮操作 */
     handleExport() {

+ 93 - 0
school-in-out-ui/src/views/system/teacher/module/BindClassTeacher.vue

@@ -0,0 +1,93 @@
+<template>
+    <el-dialog title="绑定班级" :visible.sync="classVisible" width="30%" center>
+      <el-form label-position="right" label-width="80px" :model="bindClassTeacherForm">
+        <el-form-item label="老师姓名" prop="teacherName">
+          <el-input v-model="bindClassTeacherForm.teacherName" disabled placeholder="请输入老师姓名" />
+        </el-form-item>
+        <el-form-item label="所属学校" prop="schoolId">
+          <el-select v-model="bindClassTeacherForm.schoolId" disabled placeholder="请选择学校" style="width: 100%;">
+            <el-option v-for="dict in dictTables.schoolDict" :key="dict.value" :label="dict.label"
+              :value="dict.value"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="绑定班级" prop="classId">
+          <el-select
+            v-model="bindClassTeacherForm.classId" 
+            :loading="bindOptionLoding" 
+            loading-text="正在加载中~~~"
+            reserve-keyword @visible-change="searchClassOption" 
+            :multiple="true"
+            placeholder="请选择班级" style="width: 100%;">
+            <el-option v-for="item in clazzOption" :key="item.value" :label="item.label" :value="item.value"></el-option>
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="classVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitBindClassForm">确 定</el-button>
+      </span>
+    </el-dialog>    
+</template>
+
+<script>
+import { listClazzOption } from '@/api/system/clazz'
+import {teacherBindClass} from '@/api/system/teacher_class_relation'
+export default {
+    props: {
+        dictTables: {
+            type: Object,
+            default: () => {
+                return {}
+            }
+        }
+    },
+    data() {
+        return {
+            // 绑定班级和教师表单对象
+            bindClassTeacherForm: {},
+            // 班级下拉列表
+            clazzOption: [],
+            bindOptionLoding: false,
+            classVisible: false
+        }
+    },
+    methods: {
+         /** 绑定班级按钮操作 */
+        handleBindClass(row) {
+            // this.reset();
+            this.classVisible = true
+            this.bindClassTeacherForm = row
+        },
+        submitBindClassForm() {
+            let fomrData = {
+                teacherId: this.bindClassTeacherForm.id,
+                classId: this.bindClassTeacherForm.classId,
+                schoolId: this.bindClassTeacherForm.schoolId
+            }
+            // 发送请求
+            teacherBindClass(fomrData).then(res => {
+                this.$message.success("操作成功");
+                this.classVisible = false;
+                this.bindClassTeacherForm = {}
+                // 父组件调用刷新列表方法
+                this.$$emit('ok')
+            })
+        },
+        /** 懒加载班级列表 */
+        searchClassOption(openSelect) {
+            if (openSelect) {
+                this.bindOptionLoding = true
+                listClazzOption(this.bindClassTeacherForm.schoolId).then(response => {
+                console.log(response);
+                this.clazzOption = response.data
+                this.bindOptionLoding = false
+                })
+            }
+        },
+    },
+}
+</script>
+
+<style>
+
+</style>