浏览代码

班级合并

dzx 8 月之前
父节点
当前提交
f4b924a42b

+ 33 - 6
src/main/java/com/xjrsoft/module/base/controller/BaseClassMergeController.java

@@ -2,8 +2,9 @@ package com.xjrsoft.module.base.controller;
 
 import cn.dev33.satoken.annotation.SaCheckPermission;
 import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import cn.hutool.core.util.StrUtil;
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
 import com.xjrsoft.common.annotation.XjrLog;
 import com.xjrsoft.common.model.result.RT;
 import com.xjrsoft.common.page.ConventPage;
@@ -11,11 +12,15 @@ import com.xjrsoft.common.page.PageOutput;
 import com.xjrsoft.common.utils.VoToColumnUtil;
 import com.xjrsoft.module.base.dto.AddBaseClassMergeDto;
 import com.xjrsoft.module.base.dto.BaseClassMergePageDto;
+import com.xjrsoft.module.base.dto.BaseClassMergeStudentPageDto;
 import com.xjrsoft.module.base.dto.UpdateBaseClassMergeDto;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseClassMerge;
 import com.xjrsoft.module.base.service.IBaseClassMergeService;
 import com.xjrsoft.module.base.vo.BaseClassMergePageVo;
+import com.xjrsoft.module.base.vo.BaseClassMergeStudentVo;
 import com.xjrsoft.module.base.vo.BaseClassMergeVo;
+import com.xjrsoft.module.organization.entity.User;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
@@ -51,12 +56,23 @@ public class BaseClassMergeController {
     @SaCheckPermission("baseclassmerge:detail")
     @XjrLog(value = "班级合并列表(分页)")
     public RT<PageOutput<BaseClassMergePageVo>> page(@Valid BaseClassMergePageDto dto){
-
-        LambdaQueryWrapper<BaseClassMerge> queryWrapper = new LambdaQueryWrapper<>();
+        MPJLambdaWrapper<BaseClassMerge> queryWrapper = new MPJLambdaWrapper<>();
         queryWrapper
-                    .orderByDesc(BaseClassMerge::getId)
-                .select(BaseClassMerge.class,x -> VoToColumnUtil.fieldsToColumns(BaseClassMergePageVo.class).contains(x.getProperty()));
-        IPage<BaseClassMerge> page = baseClassMergeService.page(ConventPage.getPage(dto), queryWrapper);
+                .select(BaseClassMerge::getId)
+                .select(BaseClassMerge.class,x -> VoToColumnUtil.fieldsToColumns(BaseClassMerge.class).contains(x.getProperty()))
+                .selectAs(BaseClass::getName, BaseClassMergePageVo::getTargetClassName)
+                .innerJoin(User.class, User::getId, BaseClassMerge::getCreateUserId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseClassMerge::getTargetClassId)
+                .like(StrUtil.isNotEmpty(dto.getTargetClassName()), BaseClass::getName, dto.getTargetClassName())
+                .in(StrUtil.isNotEmpty(dto.getMergeClassName()), BaseClassMerge::getId, "SELECT DISTINCT t1.base_class_merge_id FROM base_class_merge_student t1\n" +
+                        "INNER JOIN base_class t2 ON t1.class_id = t2.id\n" +
+                        "WHERE t1.delete_mark = 0 AND t2.delete_mark = 0\n" +
+                        "AND t2.name LIKE CONCAT('%'," + dto.getMergeClassName() + ",'%')")
+                .orderByDesc(BaseClassMerge::getId);
+        IPage<BaseClassMergePageVo> page = baseClassMergeService.selectJoinListPage(ConventPage.getPage(dto), BaseClassMergePageVo.class, queryWrapper);
+        for (BaseClassMergePageVo record : page.getRecords()) {
+            record.setMergeClassName(baseClassMergeService.getClassNamesByMergeId(Long.parseLong(record.getId())));
+        }
         PageOutput<BaseClassMergePageVo> pageOutput = ConventPage.getPageOutput(page, BaseClassMergePageVo.class);
         return RT.ok(pageOutput);
     }
@@ -101,4 +117,15 @@ public class BaseClassMergeController {
         return RT.ok(baseClassMergeService.delete(ids));
     }
 
+
+    @GetMapping(value = "/student-page")
+    @ApiOperation(value="班级合并学生列表(分页)")
+    @SaCheckPermission("baseclassmerge:detail")
+    @XjrLog(value = "班级合并学生列表(分页)")
+    public RT<PageOutput<BaseClassMergeStudentVo>> studentPage(@Valid BaseClassMergeStudentPageDto dto){
+        IPage<BaseClassMergeStudentVo> page = baseClassMergeService.getStudentPage(dto);
+        PageOutput<BaseClassMergeStudentVo> pageOutput = ConventPage.getPageOutput(page, BaseClassMergeStudentVo.class);
+        return RT.ok(pageOutput);
+    }
+
 }

+ 5 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseClassMergePageDto.java

@@ -1,6 +1,7 @@
 package com.xjrsoft.module.base.dto;
 
 import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 
@@ -15,5 +16,9 @@ import lombok.EqualsAndHashCode;
 @EqualsAndHashCode(callSuper = false)
 public class BaseClassMergePageDto extends PageInput {
 
+    @ApiModelProperty("目标班级名称")
+    private String targetClassName;
 
+    @ApiModelProperty("原班级")
+    private String mergeClassName;
 }

+ 22 - 0
src/main/java/com/xjrsoft/module/base/dto/BaseClassMergeStudentPageDto.java

@@ -0,0 +1,22 @@
+package com.xjrsoft.module.base.dto;
+
+import com.xjrsoft.common.page.PageInput;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+* @title: 班级合并分页查询入参
+* @Author dzx
+* @Date: 2025-04-08
+* @Version 1.0
+*/
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class BaseClassMergeStudentPageDto extends PageInput {
+
+    @ApiModelProperty("班级合并id")
+    private Long baseClassMergeId;
+
+}

+ 3 - 2
src/main/java/com/xjrsoft/module/base/entity/BaseClassMerge.java

@@ -11,6 +11,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
 
@@ -45,7 +46,7 @@ public class BaseClassMerge implements Serializable {
     */
     @ApiModelProperty("创建时间")
     @TableField(fill = FieldFill.INSERT)
-    private Date createDate;
+    private LocalDateTime createDate;
     /**
     * 修改人id
     */
@@ -57,7 +58,7 @@ public class BaseClassMerge implements Serializable {
     */
     @ApiModelProperty("修改日期")
     @TableField(fill = FieldFill.UPDATE)
-    private Date modifyDate;
+    private LocalDateTime modifyDate;
     /**
     * 删除标记(0:未删除 1:已删除)
     */

+ 10 - 0
src/main/java/com/xjrsoft/module/base/service/IBaseClassMergeService.java

@@ -1,7 +1,11 @@
 package com.xjrsoft.module.base.service;
 
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.github.yulichang.base.MPJBaseService;
+import com.xjrsoft.module.base.dto.BaseClassMergeStudentPageDto;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseClassMerge;
+import com.xjrsoft.module.base.vo.BaseClassMergeStudentVo;
 
 import java.util.List;
 
@@ -36,4 +40,10 @@ public interface IBaseClassMergeService extends MPJBaseService<BaseClassMerge> {
     * @return
     */
     Boolean delete(List<Long> ids);
+
+    List<BaseClass> getClassListByMergeId(Long id);
+
+    String getClassNamesByMergeId(Long id);
+
+    IPage<BaseClassMergeStudentVo> getStudentPage(BaseClassMergeStudentPageDto dto);
 }

+ 93 - 13
src/main/java/com/xjrsoft/module/base/service/impl/BaseClassMergeServiceImpl.java

@@ -1,18 +1,35 @@
 package com.xjrsoft.module.base.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.StudentChangeTypeEnum;
+import com.xjrsoft.common.page.ConventPage;
+import com.xjrsoft.common.utils.VoToColumnUtil;
+import com.xjrsoft.module.base.dto.BaseClassMergeStudentPageDto;
+import com.xjrsoft.module.base.entity.BaseClass;
 import com.xjrsoft.module.base.entity.BaseClassMerge;
 import com.xjrsoft.module.base.entity.BaseClassMergeStudent;
+import com.xjrsoft.module.base.mapper.BaseClassMapper;
 import com.xjrsoft.module.base.mapper.BaseClassMergeMapper;
 import com.xjrsoft.module.base.mapper.BaseClassMergeStudentMapper;
 import com.xjrsoft.module.base.service.IBaseClassMergeService;
+import com.xjrsoft.module.base.vo.BaseClassMergeStudentVo;
+import com.xjrsoft.module.organization.entity.User;
+import com.xjrsoft.module.student.entity.StudentChangeRecord;
+import com.xjrsoft.module.student.mapper.BaseStudentSchoolRollMapper;
+import com.xjrsoft.module.student.service.IStudentChangeRecordService;
 import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -24,31 +41,50 @@ import java.util.stream.Collectors;
 @Service
 @AllArgsConstructor
 public class BaseClassMergeServiceImpl extends MPJBaseServiceImpl<BaseClassMergeMapper, BaseClassMerge> implements IBaseClassMergeService {
-    private final BaseClassMergeMapper baseClassMergeBaseClassMergeMapper;
 
-    private final BaseClassMergeStudentMapper baseClassMergeBaseClassMergeStudentMapper;
+    private final BaseClassMergeStudentMapper mergeStudentMapper;
+    private final BaseClassMapper baseClassMapper;
+    private final BaseStudentSchoolRollMapper schoolRollMapper;
+    private final IStudentChangeRecordService changeRecordService;
 
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(BaseClassMerge baseClassMerge) {
-        baseClassMergeBaseClassMergeMapper.insert(baseClassMerge);
+        this.baseMapper.insert(baseClassMerge);
+        BaseClass baseClass = baseClassMapper.selectById(baseClassMerge.getTargetClassId());
+
+        Set<Long> collect = baseClassMerge.getBaseClassMergeStudentList().stream().map(BaseClassMergeStudent::getClassId).collect(Collectors.toSet());
+        List<BaseClass> classList = baseClassMapper.selectBatchIds(collect);
+        Map<Long, String> classMap = classList.stream().collect(Collectors.toMap(BaseClass::getId, BaseClass::getName));
+
         for (BaseClassMergeStudent baseClassMergeStudent : baseClassMerge.getBaseClassMergeStudentList()) {
             baseClassMergeStudent.setBaseClassMergeId(baseClassMerge.getId());
-            baseClassMergeBaseClassMergeStudentMapper.insert(baseClassMergeStudent);
+            mergeStudentMapper.insert(baseClassMergeStudent);
+            schoolRollMapper.updateStudentClass(baseClass.getId(), baseClass.getGradeId(), baseClass.getMajorSetId(), baseClassMergeStudent.getUserId());
+            changeRecordService.insertData(
+                    classMap.get(baseClassMergeStudent.getClassId()),
+                    baseClassMergeStudent.getClassId().toString(),
+                    baseClass.getName(),
+                    baseClass.getId().toString(),
+                    baseClassMergeStudent.getUserId(),
+                    StpUtil.getLoginIdAsLong(),
+                    StudentChangeTypeEnum.ChangeClass.getCode(),
+                    3
+            );
         }
-
+        
         return true;
     }
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean update(BaseClassMerge baseClassMerge) {
-        baseClassMergeBaseClassMergeMapper.updateById(baseClassMerge);
+        this.baseMapper.updateById(baseClassMerge);
         //********************************* BaseClassMergeStudent  增删改  开始 *******************************************/
         {
             // 查出所有子级的id
-            List<BaseClassMergeStudent> baseClassMergeStudentList = baseClassMergeBaseClassMergeStudentMapper.selectList(Wrappers.lambdaQuery(BaseClassMergeStudent.class).eq(BaseClassMergeStudent::getBaseClassMergeId, baseClassMerge.getId()).select(BaseClassMergeStudent::getId));
+            List<BaseClassMergeStudent> baseClassMergeStudentList = mergeStudentMapper.selectList(Wrappers.lambdaQuery(BaseClassMergeStudent.class).eq(BaseClassMergeStudent::getBaseClassMergeId, baseClassMerge.getId()).select(BaseClassMergeStudent::getId));
             List<Long> baseClassMergeStudentIds = baseClassMergeStudentList.stream().map(BaseClassMergeStudent::getId).collect(Collectors.toList());
             //原有子表单 没有被删除的主键
             List<Long> baseClassMergeStudentOldIds = baseClassMerge.getBaseClassMergeStudentList().stream().map(BaseClassMergeStudent::getId).filter(Objects::nonNull).collect(Collectors.toList());
@@ -58,18 +94,18 @@ public class BaseClassMergeServiceImpl extends MPJBaseServiceImpl<BaseClassMerge
             for (BaseClassMergeStudent baseClassMergeStudent : baseClassMerge.getBaseClassMergeStudentList()) {
                 //如果不等于空则修改
                 if (baseClassMergeStudent.getId() != null) {
-                    baseClassMergeBaseClassMergeStudentMapper.updateById(baseClassMergeStudent);
+                    mergeStudentMapper.updateById(baseClassMergeStudent);
                 }
                 //如果等于空 则新增
                 else {
                     //已经不存在的id 删除
                     baseClassMergeStudent.setBaseClassMergeId(baseClassMerge.getId());
-                    baseClassMergeBaseClassMergeStudentMapper.insert(baseClassMergeStudent);
+                    mergeStudentMapper.insert(baseClassMergeStudent);
                 }
             }
             //已经不存在的id 删除
-            if(baseClassMergeStudentRemoveIds.size() > 0){
-                baseClassMergeBaseClassMergeStudentMapper.deleteBatchIds(baseClassMergeStudentRemoveIds);
+            if(!baseClassMergeStudentRemoveIds.isEmpty()){
+                mergeStudentMapper.deleteBatchIds(baseClassMergeStudentRemoveIds);
             }
         }
         //********************************* BaseClassMergeStudent  增删改  结束 *******************************************/
@@ -80,9 +116,53 @@ public class BaseClassMergeServiceImpl extends MPJBaseServiceImpl<BaseClassMerge
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean delete(List<Long> ids) {
-        baseClassMergeBaseClassMergeMapper.deleteBatchIds(ids);
-        baseClassMergeBaseClassMergeStudentMapper.delete(Wrappers.lambdaQuery(BaseClassMergeStudent.class).in(BaseClassMergeStudent::getBaseClassMergeId, ids));
+        this.baseMapper.deleteBatchIds(ids);
+        mergeStudentMapper.delete(Wrappers.lambdaQuery(BaseClassMergeStudent.class).in(BaseClassMergeStudent::getBaseClassMergeId, ids));
 
         return true;
     }
+
+    @Override
+    public List<BaseClass> getClassListByMergeId(Long id) {
+        List<BaseClass> classList = baseClassMapper.selectList(
+                new MPJLambdaWrapper<BaseClass>()
+                        .select(BaseClass::getId)
+                        .select(BaseClass.class, x -> VoToColumnUtil.fieldsToColumns(BaseClass.class).contains(x.getProperty()))
+                        .innerJoin(BaseClassMergeStudent.class, BaseClassMergeStudent::getClassId, BaseClass::getId)
+                        .innerJoin(BaseClassMergeStudent.class, BaseClassMergeStudent::getClassId, BaseClass::getId)
+                        .eq(BaseClassMergeStudent::getDeleteMark, DeleteMark.NODELETE.getCode())
+                        .eq(BaseClassMergeStudent::getBaseClassMergeId, id)
+                        .orderByAsc(BaseClass::getName)
+        );
+        return classList;
+    }
+
+    @Override
+    public String getClassNamesByMergeId(Long id) {
+        List<BaseClass> classList = getClassListByMergeId(id);
+        if(!classList.isEmpty()){
+            Set<String> classNameSet = classList.stream().map(BaseClass::getName).collect(Collectors.toSet());
+            return classNameSet.toString().replace("[", "").replace("]", "").replace(" ", "");
+        }
+        return null;
+    }
+
+    @Override
+    public IPage<BaseClassMergeStudentVo> getStudentPage(BaseClassMergeStudentPageDto dto) {
+        MPJLambdaWrapper<BaseClassMergeStudent> queryWrapper = new MPJLambdaWrapper<>();
+        queryWrapper
+                .select(BaseClassMergeStudent::getId)
+                .select(BaseClassMergeStudent.class,x -> VoToColumnUtil.fieldsToColumns(BaseClassMergeStudent.class).contains(x.getProperty()))
+                .selectAs(BaseClass::getName, BaseClassMergeStudentVo::getClassName)
+                .selectAs(User::getName, BaseClassMergeStudentVo::getName)
+                .selectAs(User::getCredentialNumber, BaseClassMergeStudentVo::getCredentialNumber)
+                .select("t3.name", BaseClassMergeStudentVo::getTeacherName)
+                .innerJoin(User.class, User::getId, BaseClassMergeStudent::getUserId)
+                .innerJoin(BaseClass.class, BaseClass::getId, BaseClassMergeStudent::getClassId)
+                .leftJoin(User.class, User::getId, BaseClass::getTeacherId)
+                .eq(BaseClassMergeStudent::getBaseClassMergeId, dto.getBaseClassMergeId())
+                .orderByDesc(BaseClassMergeStudent::getId);
+        IPage<BaseClassMergeStudentVo> page = mergeStudentMapper.selectJoinPage(ConventPage.getPage(dto), BaseClassMergeStudentVo.class, queryWrapper);
+        return page;
+    }
 }

+ 12 - 4
src/main/java/com/xjrsoft/module/base/vo/BaseClassMergePageVo.java

@@ -3,6 +3,7 @@ package com.xjrsoft.module.base.vo;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.time.LocalDateTime;
 import java.util.Date;
 
 /**
@@ -22,13 +23,13 @@ public class BaseClassMergePageVo {
     /**
     * 创建人
     */
-    @ApiModelProperty("创建人")
-    private Long createUserId;
+    @ApiModelProperty("操作人")
+    private Long createUserName;
     /**
     * 创建时间
     */
     @ApiModelProperty("创建时间")
-    private Date createDate;
+    private LocalDateTime createDate;
     /**
     * 修改人id
     */
@@ -57,8 +58,15 @@ public class BaseClassMergePageVo {
     /**
     * 目标班级
     */
-    @ApiModelProperty("目标班级")
+    @ApiModelProperty("目标班级id")
     private Long targetClassId;
+
+    @ApiModelProperty("目标班级名称")
+    private String targetClassName;
+
+    @ApiModelProperty("原班级")
+    private String mergeClassName;
+
     /**
     * 原因
     */

+ 15 - 0
src/main/java/com/xjrsoft/module/base/vo/BaseClassMergeStudentVo.java

@@ -33,6 +33,21 @@ public class BaseClassMergeStudentVo {
     @ApiModelProperty("学生id")
     private Long userId;
 
+    @ApiModelProperty("原有班级")
+    private String className;
+
+    @ApiModelProperty("班主任名称")
+    private String teacherName;
+
+    @ApiModelProperty("姓名")
+    private String name;
+
+    @ApiModelProperty("性别")
+    private String gender;
+
+    @ApiModelProperty("身份证号")
+    private String credentialNumber;
+
 
 
 }

+ 3 - 0
src/main/java/com/xjrsoft/module/student/mapper/BaseStudentSchoolRollMapper.java

@@ -53,6 +53,9 @@ public interface BaseStudentSchoolRollMapper extends MPJBaseMapper<BaseStudentSc
     @Update("UPDATE base_student_school_roll SET class_id = #{classId} where user_id = #{userId}")
     Boolean updateStudentClass(Long classId, Long userId);
 
+    @Update("UPDATE base_student_school_roll SET class_id = #{classId},major_set_id=#{majorSetId},grade_id=#{gradeId} where user_id = #{userId}")
+    Boolean updateStudentClass(Long classId, Long gradeId, Long majorSetId, Long userId);
+
     @Update("UPDATE base_student_school_roll SET class_id = #{classId},major_set_id=#{majorSetId},grade_id=#{gradeId},stduy_status=#{stduyStatus} where user_id = #{userId}")
     Boolean updateStudentClassGradeMajorStduyStatus(Long classId, Long gradeId, Long majorSetId, String stduyStatus, Long userId);
 

+ 4 - 4
src/main/resources/sqlScript/20250408_sql.sql

@@ -33,9 +33,9 @@ CREATE TABLE `wf_student_repeat_study` (
 CREATE TABLE `base_class_merge` (
   `id` BIGINT NOT NULL COMMENT '主键',
   `create_user_id` BIGINT DEFAULT NULL COMMENT '创建人',
-  `create_date` DATETIME(3) DEFAULT NULL COMMENT '创建时间',
+  `create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
   `modify_user_id` BIGINT DEFAULT NULL COMMENT '修改人id',
-  `modify_date` DATETIME(3) DEFAULT NULL COMMENT '修改日期',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改日期',
   `delete_mark` SMALLINT DEFAULT NULL COMMENT '删除标记(0:未删除 1:已删除)',
   `enabled_mark` SMALLINT DEFAULT NULL COMMENT '有效标记(0:未启用 1:已启用)',
   `student_count` INT DEFAULT NULL COMMENT '涉及学生人数',
@@ -50,9 +50,9 @@ CREATE TABLE `base_class_merge` (
 CREATE TABLE `base_class_merge_student` (
   `id` BIGINT NOT NULL COMMENT '主键',
   `create_user_id` BIGINT DEFAULT NULL COMMENT '创建人',
-  `create_date` DATETIME(3) DEFAULT NULL COMMENT '创建时间',
+  `create_date` DATETIME DEFAULT NULL COMMENT '创建时间',
   `modify_user_id` BIGINT DEFAULT NULL COMMENT '修改人id',
-  `modify_date` DATETIME(3) DEFAULT NULL COMMENT '修改日期',
+  `modify_date` DATETIME DEFAULT NULL COMMENT '修改日期',
   `delete_mark` SMALLINT DEFAULT NULL COMMENT '删除标记(0:未删除 1:已删除)',
   `enabled_mark` SMALLINT DEFAULT NULL COMMENT '有效标记(0:未启用 1:已启用)',
   `base_class_merge_id` BIGINT DEFAULT NULL COMMENT '班级合并id(base_class_merge)',